PHP中用大括号包裹变量能否提升SQL注入防护能力?
关于PHP字符串大括号插值与SQL注入的问题解答
大括号是否能提升SQL注入安全性?
答案是完全不能。PHP双引号字符串中的{$username}写法只是变量插值的语法糖,它的作用仅仅是明确变量的边界(比如当变量名后面紧跟其他字符时,避免解析错误),但不会对变量的内容做任何转义、过滤处理。本质上,'{$username}'和直接写'$username'在最终生成的SQL语句上没有任何区别——输入的恶意字符依然会原封不动地被插入到SQL中,所以SQL注入的风险完全存在。
针对目标代码的SQL注入Payload
你的代码没有对$username和$password做任何转义或预处理,所以可以轻松构造Payload绕过验证:
1. 绕过指定用户的密码验证
在用户名输入框中填入:
admin' --
密码可以随便输入任意内容。此时生成的SQL语句会变成:
SELECT * FROM users WHERE username='admin' -- ' AND password='随便输的内容'
--是MySQL的单行注释符,后面的' AND password='xxx'会被注释掉,只要数据库中存在admin用户,就能直接登录。
2. 万能登录(无需知道任何用户名)
在用户名输入框中填入:
' OR 1=1 --
密码随便输入。生成的SQL语句为:
SELECT * FROM users WHERE username='' OR 1=1 -- ' AND password='随便输的内容'
OR 1=1会让WHERE条件永远为真,查询会返回所有用户记录,从而直接登录成功。
3. 基于密码输入的注入(如果用户名输入有限制)
如果用户名输入被限制,也可以在密码输入框构造Payload:比如用户名输入一个已知存在的用户(比如test),密码输入:
' OR '1'='1
生成的SQL语句:
SELECT * FROM users WHERE username='test' AND password='' OR '1'='1'
因为OR '1'='1'的存在,条件同样永远为真,实现登录。
内容的提问来源于stack exchange,提问作者ItsJay
相关产品推荐
相关产品推荐

