我试图证明在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;--'
由于转义的单引号,密码相等性保持不变。这种说法被认为是安全的吗?如果不是,它怎么能被打破?
听起来你打开了魔术引号。我绝对不会认为该语句是安全的,因为如果您要将其移动到运行 PHP 5.4 的服务器上,它将完全容易受到攻击。魔术引号长期以来一直是一个不推荐使用的功能,它可能会弄乱应用程序的其他部分,所以不要依赖它。
要演示,只需在 php.ini 中设置magic_quotes_gpc = Off
。
这是因为您在PHP环境中启用了魔术报价。它将自动转义字符串,但它们已被弃用,不应使用。它们不是治愈方法,而是补丁。使用适当的卫生方法(如mysql_real_escape_string
)要好得多。
http://www.php.net/manual/en/security.magicquotes.what.php
编辑:还准备好了声明!
PHP 中其他"不安全"的安全函数:
addslashes
- 您可能认为它是安全的,但它不会过滤掉可能导致注入的多字节字符。