一、从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);
}
}
漏洞解析:
- 攻击入口:直接从HttpServletRequest获取URL参数,未做任何过滤
- SQL拼接:直接将用户输入拼接到SQL语句中
- 攻击示例:当传入
category=electronics' OR 1=1 --
时,实际执行SQL变为:SELECT * FROM products WHERE category='electronics' OR 1=1 -- '
- 漏洞影响:导致返回所有产品数据,造成信息泄露
预编译语句的正确使用姿势
修复方案代码:
private static final String SAFE_SQL =
"SELECT * FROM products WHERE category=?";
public List<Product> getProducts(String category) throws SQLExc