SQL 注入(SQL Injection)漏洞的出现,本质上是程序没有正确地处理用户输入,直接把用户输入拼接到 SQL 语句中执行。下面从原理、原因和示例三个层面说明。
用户输入被当作“代码”而不是“数据”来执行。
在 SQL 中:
OR 1=1、DROP TABLE)当用户输入没有被正确区分和过滤,攻击者就可以“改写”原本的 SQL 逻辑。
sql = "SELECT * FROM user WHERE name = '" + username + "'"
如果用户输入:
' OR '1'='1
最终 SQL 变成:
SELECT * FROM user WHERE name = '' OR '1'='1'
条件永远成立,绕过认证。
❌ 错误方式:
Statement stmt = conn.createStatement();
stmt.execute("SELECT * FROM user WHERE id = " + id);
✅ 正确方式(防注入):
PreparedStatement ps = conn.prepareStatement(
"SELECT * FROM user WHERE id = ?");
ps.setInt(1, id);
select、drop 等关键词--、#)、十六进制等绕过方式"ORDER BY " + columnName
表名、列名无法参数化,必须白名单校验。
例子:
admin' --xp_cmdshell 等)✅ 使用参数化查询 / 预编译语句
✅ 最小权限数据库账号
✅ 输入校验(白名单)
✅ 关闭详细错误回显
✅ 使用 ORM(如 MyBatis、Hibernate,但别乱写 ${})
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。