admin' -- ,密码随便填写即可绕过' OR '1'='1
SQL注入的本质:后端直接把用户输入的字符串拼接进SQL语句,用户输入被当成SQL代码执行。
原始模板:
SELECT * FROM user WHERE username='${username}' AND password='${password}'
当用户名填入:admin' --
拼接之后最终执行SQL:
SELECT * FROM user WHERE username='admin' -- ' AND password='xxx'
' 单引号:闭合前面的字符串边界-- SQL注释符号:后面所有内容全部忽略,不再校验密码SQL模板固定不变,用 ? 作为占位符:
SELECT * FROM user WHERE username=? AND password=?
数据库把传入内容只当普通字符串,单引号不会被当作SQL语法。
① 参数化查询(首选) > ② 最小数据库权限 > ③ 关闭报错回显 > ④ WAF防火墙