SQL 注入本质上是因为把用户输入直接拼接到 SQL 语句中,并且没有做正确的校验或参数化处理。下面从「容易引发 SQL 注入的代码写法」和「常见场景」两方面说明。
String sql = "SELECT * FROM user WHERE name = '" + username + "'";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
如果用户输入:
' OR '1'='1
最终 SQL 变成:
SELECT * FROM user WHERE name = '' OR '1'='1'
✅ 后果:绕过登录、拖库
sql = "SELECT * FROM user WHERE id = %s" % user_id
cursor.execute(sql)
即使使用 ORM,只要手写 SQL + 拼接,仍然危险。
String sql = "SELECT * FROM user ORDER BY " + sortColumn;
用户输入:
id; DROP TABLE user--
String sql = "SELECT * FROM user WHERE id IN (" + ids + ")";
ids = "1,2,3); DROP TABLE user;--"
String sql = "SELECT * FROM " + tableName;
表名、字段名无法用参数化,只能白名单控制。
EXEC('SELECT * FROM user WHERE name = ''' + @name + '''')
动态 SQL 同样危险。
SELECT * FROM user WHERE name='xxx' AND pwd='xxx'
拼接输入 → 万能密码
SELECT * FROM article WHERE title LIKE '%关键词%'
关键词未过滤
LIMIT 0, 10
page 参数被篡改
复杂 SQL + 多参数拼接
String sql = "SELECT * FROM user WHERE name = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, username);
User.objects.filter(name=username)
if (!allowedColumns.contains(sortColumn)) {
sortColumn = "id";
}
只要 SQL 中出现了“用户输入 + 字符串拼接”,就极有可能存在 SQL 注入风险。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。