我试图在PHP中证明需要准备好的语句,但是我遇到了一些问题,因为PHP通过表单传递字符串来做一些很方便的奇怪事情。
我试图“破解”的陈述很简单:
SELECT username FROM users WHERE username = '$username' AND password = '$password'
但是为密码传递X' or TRUE;--
之类的操作实际上并不起作用,因为PHP会自动转义单引号并将语句转换为:
SELECT username FROM users WHERE username = '$username' AND password = 'X\' or TRUE;--'
由于单引号转义,密码相等性保持不变。这种说法是否安全?如果没有,它怎么能被打破?
答案 0 :(得分:5)
听起来你的魔法引号已经打开了。我肯定不会认为该语句是安全的,就好像你将它移动到运行PHP 5.4的服务器一样,它将完全容易受到攻击。魔术引号长期以来一直被弃用,它可以搞乱应用程序的其他部分,所以不要依赖它。
要演示,只需在php.ini中设置magic_quotes_gpc = Off
。
答案 1 :(得分:2)
那是因为您在PHP环境中启用了Magic Quotes。它将自动转义字符串,但不推荐使用它们,不应使用它们。它们不是治愈方法,它们是一种补丁。您可以更好地使用适当的卫生方法,例如mysql_real_escape_string
。
http://www.php.net/manual/en/security.magicquotes.what.php
编辑:还准备好了陈述!
其他"不安全" PHP中的安全功能:
addslashes
- 您可能认为它安全,但它不能过滤掉可能导致注入的多字节字符。