在将它们插入sql数据库之前,我使用mysql_real_escape_string()来验证所有用户输入。其中一个字段是名称,我们遇到了像O'Reilly这样名字的用户的问题。有没有办法使用mysql_real_escape_string()来阻止注入但是在db中允许这些名称?
答案 0 :(得分:6)
问题很可能是撇号被引用两次:首先是邪恶并且在5.3 magic quotes中被弃用,然后是mysql_real_escape_string()
。
您可以做的是disable magic quotes或对输入值运行stripslashes()
将其提供给mysql_real_escape_string()
问题的简要说明:
O'Reilly
O\'Reilly
O\\\'Reilly
O\'Reilly
答案 1 :(得分:0)
如前所述:mysql_real_escape_string不适用于输入验证。如果要验证输入,请使用您自己的函数或php中的filter functions。
如果您通过php自动添加了太多斜杠,请禁用魔术引号。
答案 2 :(得分:0)
+1使用PDO。几个月以来,我一直在使用PDO来支持一个充当数据库抽象层的MySQL类,而且它是轻而易举的。
传统上,开发人员在应用stripslashes()
之类的函数之前会对数据使用mysql_real_escape_string()
函数。从输入数据中删除斜杠仍然是一个好主意,但您可以使用PDO方法转义数据(PDO::quote($data)
)或绑定参数。
您的查询块看起来像这样:
$pdo = new PDO(DSN, DB_USER, DB_PASS);
$sql = "INSERT INTO table (field1, field2) VALUES (:value1, :value2)";
$smt = $pdo->prepare($sql);
$smt->bindParam(':value1', $value1, PDO::PARAM_STR);
$smt->bindParam(':value2', $value2, PDO::PARAM_STR);
$smt->execute();
$rows = $smt->rowCount(); // returns number of rows affected
我希望这会有所帮助。有关PHP中PDO的更多信息,请查看http://php.net/manual/en/book.pdo.php。