审计 SQL 注入风险点,核心目标是发现“用户输入未经过滤/参数化就拼接到 SQL 语句中”的地方。下面从方法论、常见风险点、审计步骤、工具与示例几个层面说明。
风险 = 不可信输入 + SQL 拼接 + 缺少安全处理
安全处理包括:
+、format、StringBuilder)${} 用法String sql = "select * from user where name = '" + name + "'";
${}order by ${column}
where name like '%${name}%'
String sql = "select * from " + tableName;
"id in (" + ids + ")"
"from User where name = '" + name + "'"
StatementcreateQueryexecute(select / update / delete / insertMapper.xml、@Select✅ 安全示例:
PreparedStatement ps = conn.prepareStatement(
"select * from user where id = ?");
ps.setInt(1, id);
❌ 不安全示例:
"select * from user where id = " + id
${} 是否用于非白名单字段order by / group by 是否可控if (!allowedColumns.contains(column)) {
column = "id";
}
String placeholders = ids.stream()
.map(i -> "?")
.collect(joining(","));
风险描述
用户登录接口中使用字符串拼接 SQL,参数username未过滤。
位置
UserDao.java:45
修复建议
使用 PreparedStatement 或 MyBatis#{}
如果你愿意,可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。