0

当我");--从输入字段发送到我的本地主机 PHP 服务器时,它会自动将其转换为

\");--

看起来很棒,只是我不知道这种行为有多值得信赖。虽然好像避免了SQL注入,但是我的开发环境和生产环境不一样,恐怕生产环境可能没有这种自动激活的保护……

为什么 PHP 会这样做(无需使用即可转换输入mysql_real_escape_string)?它总是这样做还是只使用某些扩展?依靠这种行为来防止 SQL 注入是否安全?

4

4 回答 4

6

您似乎启用了魔术行情。但是您最好禁用此选项或恢复它们。mysql_real_escape_string更安全。

于 2009-03-15T18:44:33.497 回答
1

PHP 的这个“特性”被称为“魔术引号”。尽管它们可能很“神奇”,但使用它们是非常糟糕的做法,因为它们只会给人一种虚假的安全感。值得庆幸的是,它们已从 PHP 6(开发中)中删除。

可以在此Wikipedia 文章中找到更详细的批评列表。

PHP 手册描述了禁用魔术引号的各种方法。

于 2009-03-15T18:52:16.740 回答
1

您可能希望使用Zend_Db 之类的抽象层与数据库进行对话。例如,如果您通过实例化 Zend_Db_Select 创建一个 select 语句,它将如下所示:

//$_GET['thing'] is automatically escaped 
$select = $zdb->select()->from('things')->where('name = ?',$_GET['thing']);
$result = $zdb->fetchRow($select->__toString());//__toString generates a really pretty, vendor independent query

//a plain vanilla query would look like this:
$result = $zdb->fetchRow('select * from things where name = ?', $zdb->quote($_GET['thing']);
于 2009-03-15T19:43:58.767 回答
0

您打开了魔术行情。PHP 组官方强烈反对这个函数,并且强烈反对依赖它。在运行时禁用魔术引号的方法并不总是有效,您使用的天气.htaccessini_set()在脚本中。一直调用 stripslashes 也会变得非常混乱。

更多细节:http ://ca3.php.net/magic_quotes

于 2009-03-17T14:39:29.140 回答