当我从输入字段发送");--
到我的localhost PHP服务器时,它会自动将其转换为
\“); -
看起来很棒,除了我不知道这种行为是多么值得信赖。 虽然它似乎避免了SQL注入,但我的开发环境与生产环境不同,我担心生产环境可能没有自动激活这种保护......
为什么PHP会这样做(转换输入而不必使用mysql_real_escape_string
)?是总是这样做还是仅限某些扩展?依赖此行为来阻止SQL注入是否安全?
答案 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小组正式强烈推荐此功能,并强烈反对依赖它。在运行时禁用魔术引号的方法并不总是有效,您可以在脚本中使用.htaccess
或ini_set()
。一直调用stripslashes也会变得非常混乱。