PHP保护自己免受SQL注入?

时间:2009-03-15 18:42:13

标签: php security sql-injection

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

  

\“); -

看起来很棒,除了我不知道这种行为是多么值得信赖。 虽然它似乎避免了SQL注入,但我的开发环境与生产环境不同,我担心生产环境可能没有自动激活这种保护......

为什么PHP会这样做(转换输入而不必使用mysql_real_escape_string)?是总是这样做还是仅限某些扩展?依赖此行为来阻止SQL注入是否安全?

4 个答案:

答案 0 :(得分:6)

您似乎已启用Magic Quotes。但您最好禁用此选项或还原它们。 mysql_real_escape_string更安全。

答案 1 :(得分:1)

PHP的这个“功能”被称为“魔术引号”。尽管它们可能具有“魔力”,但使用它们是非常糟糕的做法,因为它们只是给出了一种虚假的安全感。值得庆幸的是,他们已从PHP 6中删除(正在开发中)。

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

PHP手册介绍了disable magic quotes的各种方法。

答案 2 :(得分: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']);

答案 3 :(得分:0)

您已启用魔术报价。 PHP小组正式强烈推荐此功能,并强烈反对依赖它。在运行时禁用魔术引号的方法并不总是有效,您可以在脚本中使用.htaccessini_set()。一直调用stripslashes也会变得非常混乱。

更多详情:http://ca3.php.net/magic_quotes