当HTTP遇到SQL注入:Java开发者的攻防实战手册

一、从HTTP请求到数据库查询:漏洞如何产生?

危险的参数拼接:Servlet中的经典错误

漏洞代码重现:

public void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
   
   
    String category = request.getParameter("category");
    String sql = "SELECT * FROM products WHERE category='" + category + "'";
    
    try (Connection conn = dataSource.getConnection();
         Statement stmt = conn.createStatement();
         ResultSet rs = stmt.executeQuery(sql)) {
   
   
        // 处理结果集
    } catch (SQLException e) {
   
   
        throw new ServletException(e);
    }
}

漏洞解析:

  1. 攻击入口:直接从HttpServletRequest获取URL参数,未做任何过滤
  2. SQL拼接:直接将用户输入拼接到SQL语句中
  3. 攻击示例:当传入category=electronics' OR 1=1 -- 时,实际执行SQL变为:
    SELECT * FROM products WHERE category='electronics' OR 1=1 -- '
    
  4. 漏洞影响:导致返回所有产品数据,造成信息泄露

预编译语句的正确使用姿势

修复方案代码:

private static final String SAFE_SQL = 
    "SELECT * FROM products WHERE category=?";

public List<Product> getProducts(String category) throws SQLExc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值