目录

从零开始学习JavaWeb-15

/weixin_miniapp.png

从零开始学习JavaWeb-15


​​一、数据库安全与防注入实战​​

1. ​​SQL 注入原理与危害​​
  • ​​攻击本质​​:利用输入漏洞篡改 SQL 语义,例如:

    
    SELECT * FROM users WHERE username = 'admin' OR '1'='1' -- AND password = 'xxx'

    OR '1'='1'导致条件永真,绕过密码验证。

  • ​​危害​​:数据泄露(用户隐私)、越权操作(删库)、服务瘫痪。

2. ​​防御方案​​
  • ​​预编译(PreparedStatement)​​:强制分离指令与参数

    
    String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.setString(1, inputUser);  // 参数视为值而非代码
    ps.setString(2, inputPass);
  • ​​输入校验​​:正则过滤特殊字符(如 '、--)

    
    if (!inputUser.matches("[a-zA-Z0-9_]+")) { 
        throw new InvalidInputException("用户名含非法字符");
    }
  • ​​最小权限原则​​:数据库账号仅授权必要操作(禁用 DROP、DELETE)。

3. ​​存储过程与ORM框架​​
  • ​​存储过程​​:封装 SQL 逻辑,减少动态拼接(但需防内部注入)

  • ​​ORM 框架(如 MyBatis)​​:

    
    <select id="getUser" resultType="User">
        SELECT * FROM users WHERE username = #{user} <!-- #{} 自动预编译 -->
    </select>

​​二、MySQL 深度优化策略​​

1. ​​索引优化与慢查询分析​​
​​索引类型​​​​适用场景​​​​优化效果​​
​​B+树索引​​等值查询(=)、范围查询(>)减少全表扫描,速度提升 10-100 倍
​​哈希索引​​精确匹配(无范围查询)O(1) 查询,但不支持排序
  • ​​慢查询日志​​:

    
    -- 启用慢查询日志
    SET GLOBAL slow_query_log = 'ON';
    SET GLOBAL long_query_time = 2; -- 阈值2秒

    分析工具:mysqldumpslow、Percona Toolkit。

2. ​​事务隔离级别选择​​
​​级别​​​​脏读​​​​不可重复读​​​​幻读​​​​适用场景​​
​​READ UNCOMMITTED​​✓✓✓极少使用
​​READ COMMITTED​​✗✓✓Oracle 默认
​​REPEATABLE READ​​✗✗✓​​MySQL 默认​​
​​SERIALIZABLE​​✗✗✗强一致性(金融系统)

​​代码设置​​:


// JDBC 设置事务隔离级别
conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

​​三、数据库连接池调优​​

1. ​​核心参数配置(以 Druid 为例)​​
​​参数​​​​推荐值​​​​作用​​
initialSizeCPU核心数启动时初始化连接数
maxActive50最大连接数(防数据库过载)
minIdle5最小空闲连接(应对突发流量)
maxWait3000获取连接超时时间(ms)
validationQuerySELECT 1心跳检测 SQL

​​监控集成​​:


<!-- 启用 Druid 监控 -->
<servlet>
    <servlet-name>DruidStatView</servlet-name>
    <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>DruidStatView</servlet-name>
    <url-pattern>/druid/*</url-pattern>
</servlet-mapping>

访问 http://localhost:8080/druid查看 SQL 执行效率、慢查询统计。


​​四、综合实战:用户管理系统安全优化​​

1. ​​架构分层设计​​

graph TB
    A[View] --> B[Controller]
    B --> C[Service]
    C --> D[DAO]
    D --> E[MySQL]
    F[Filter] -->|全局安全控制| B
  • ​​Filter 层​​:统一防 XSS 攻击(过滤请求参数)。
  • ​​Service 层​​:事务管理 + 密码加密(BCrypt)。
2. ​​关键代码实现​​
  • ​​密码加密存储​​:

    
    public String encryptPassword(String rawPassword) {
        return BCrypt.hashpw(rawPassword, BCrypt.gensalt());
    }
    
    // 验证密码
    public boolean checkPassword(String rawPassword, String hashedPassword) {
        return BCrypt.checkpw(rawPassword, hashedPassword);
    }
  • ​​防 XSS 过滤器​​:

    
    @WebFilter("/*")
    public class XssFilter implements Filter {
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
            HttpServletRequest request = (HttpServletRequest) req;
            XssRequestWrapper wrappedRequest = new XssRequestWrapper(request); // 包装请求,过滤参数
            chain.doFilter(wrappedRequest, res);
        }
    }

​​五、高并发场景解决方案​​

1. ​​读写分离(MySQL Replication)​​
​​角色​​​​作用​​​​配置示例​​
​​Master​​写操作(INSERT/UPDATE)binlog-do-db = appdb
​​Slave​​读操作(SELECT)replicate-do-db = appdb

​​代码路由​​:


public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return TransactionSynchronizationManager.isCurrentTransactionReadOnly() 
               ? "slave" : "master";
    }
}
2. ​​缓存优化(Redis)​​
  • ​​缓存穿透​​:布隆过滤器拦截非法查询。
  • ​​缓存雪崩​​:随机过期时间 + 熔断降级。

// 查询优化:先查缓存,未命中再查库
public User getUserById(int id) {
    String key = "user:" + id;
    User user = redisTemplate.opsForValue().get(key);
    if (user == null) {
        user = userDao.findById(id); // 数据库查询
        redisTemplate.opsForValue().set(key, user, 30, TimeUnit.MINUTES);
    }
    return user;
}

​​六、总结与知识图谱​​

​​模块​​​​核心技术点​​​​企业级实践​​
​​数据库安全​​预编译 + 输入校验 + 权限控制防御 SQL 注入/XSS 攻击
​​MySQL 优化​​B+树索引 + 慢查询分析 + 事务隔离提升查询效率至毫秒级
​​连接池调优​​参数配置 + 实时监控支撑 5000+ TPS 并发
​​高并发架构​​读写分离 + Redis 缓存应对百万级用户请求

​​学习路线图​​:


graph LR
    A[基础] --> B[Servlet/JSP]
    B --> C[JDBC/连接池]
    C --> D[会话管理]
    D --> E[安全防护]
    E --> F[高并发架构]

​​“安全是系统的生命线,性能是用户体验的基石”​​

​​动手实践​​:

  1. 注入防御测试:尝试攻击自己的系统(如输入 ' OR 1=1 --),验证防护有效性。
  2. 慢 SQL 优化:通过 EXPLAIN分析查询计划,添加复合索引。
  3. 压力测试:用 JMeter 模拟 1000 并发用户,优化连接池参数。

​​扩展挑战​​:

  • 整合 ​​Spring Security​​ 实现 RBAC 动态权限控制。
  • 使用 ​​ShardingSphere​​ 实现分库分表。

/weixin_miniapp.png