使用mysql_real_escape_string()但允许带撇号的名称

时间:2010-01-21 08:01:38

标签: php mysql

在将它们插入sql数据库之前,我使用mysql_real_escape_string()来验证所有用户输入。其中一个字段是名称,我们遇到了像O'Reilly这样名字的用户的问题。有没有办法使用mysql_real_escape_string()来阻止注入但是在db中允许这些名称?

3 个答案:

答案 0 :(得分:6)

问题很可能是撇号被引用两次:首先是邪恶并且在5.3 magic quotes中被弃用,然后是mysql_real_escape_string()

您可以做的是disable magic quotes或对输入值运行stripslashes() 将其提供给mysql_real_escape_string()

问题的简要说明:

  • 用户输入O'Reilly
  • 魔术引号自动将其转换为O\'Reilly
  • 脚本通过mysql_real_escape_string()提供字符串,该字符串转义两者反斜杠和撇号(再次)产生O\\\'Reilly
  • 执行查询,处理引文,数据库理解您希望反斜杠是撇号,因为它们都已转义,并且记录O\'Reilly

答案 1 :(得分:0)

如前所述:mysql_real_escape_string不适用于输入验证。如果要验证输入,请使用您自己的函数或php中的filter functions

如果您通过php自动添加了太多斜杠,请禁用魔术引号。

要防止SQL注入,请使用PDOmysqli的参数化查询。

答案 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