3

我试图证明 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;--'

由于转义的单引号,密码相等性保持不变。这种说法被认为是安全的吗?不然怎么破?

4

2 回答 2

5

听起来您打开了魔术引号。我绝对不会认为该语句是安全的,就像您将其移动到运行 PHP 5.4 的服务器一样,它会完全易受攻击。魔术引号长期以来一直是一个弃用的功能,它可能会弄乱应用程序的其他部分,所以不要依赖它。

为了演示,只需magic_quotes_gpc = Off在 php.ini 中设置。

于 2012-05-26T16:27:51.243 回答
2

那是因为您在 PHP 环境中启用了魔术引号。它会自动转义字符串,但是它们已被弃用且不应使用。它们不是治愈方法,它们是补丁。您最好使用适当的卫生方法,例如mysql_real_escape_string

http://www.php.net/manual/en/security.magicquotes.what.php

编辑:还准备了陈述!

PHP 中的其他“不安全”安全函数:

addslashes - you might think it's safe, but it doesn't filter out multibyte characters that could cause injection.

于 2012-05-26T16:28:47.280 回答