【问题标题】:how to escape input but save unescaped into the database如何转义输入但未转义保存到数据库中
【发布时间】:2011-07-08 22:35:27
【问题描述】:

据说为了防止 SQL 注入,应该过滤输入数据,例如。使用 addlashes 或 mysql_real_escape_string 取决于使用的连接模块

但是,使用 addslashes 转义的数据正在与斜杠一起保存到数据库中,因此用户姓氏将保存为 O\'Reilly 而不是 O'Reilly。需要使用stripslashes 才能正确显示它。

那么如何使用addslashes 并在没有斜杠的情况下保存到数据库中?这真的是应该的方式吗?

【问题讨论】:

  • 看起来你两次转义字符串(可能你同时使用 PDO 和 mysql_real_escape_string)。
  • 是的,我正在使用 PDO 并且之前添加了斜杠。 PDO 究竟是如何自行转义字符的?
  • 如果你使用PDO,并且用bindParam/bindValue赋值参数,你不用担心转义,PDO会为你做的
  • 所以,基本上使用 PDO 时,我可以使用 $_POST["var"] 并将其直接传递给 bindParam/bindValue,对吗?并且在使用mysql_connect时,我必须通过mysql_real_escape_string 输入$_POST

标签: php mysql escaping


【解决方案1】:

您不要使用addslashes,而是使用适当的数据库特定转义函数,例如mysql_real_escape_string

如果您使用的是 PDO,那么使用准备好的语句会将变量作为绑定过程的一部分进行转义。在这种情况下,您需要做的就是:

$pdo = new PDO($dsn, $user, $name);
$stmt = $pdo->prepare('INSERT INTO your_table (col1, col2,col3) VALUES (?, ?, ?)');
$stmt->execute(array('value 1', 'value 2', 'value 3');

或者为了获得额外的可读性和更容易重用,您可以使用命名参数:

$pdo = new PDO($dsn, $user, $name);
$stmt = $pdo->prepare('INSERT INTO your_table (col1, col2,col3) VALUES (:col1, :col2, :col3)');
$stmt->execute(array(':col1' =>'value 1', ':col2' =>'value 2', ':col3' =>'value 3');

【讨论】:

  • 好吧……你们有点自相矛盾……a1ex07 说 bindParam 转义数据,你说 prepare 转义数据。
  • 有多种方法可以将参数绑定到语句...您可以使用 bindParam 执行此操作,也可以像我在这里所做的那样执行此操作,或者您甚至可以使用 PDO::quote您不能使用准备好的语句。给猫剥皮的方法不止一种,但它们本质上都会做同样的事情。您使用哪一个取决于您需要什么/如何对功能进行编码。 Check out this tutorial 了解基础知识。
【解决方案2】:

addslashes 应该是一种万能的转义机制。如果你 MySQL-escape 一个 addslash-escaped 字符串,当然包含 addslash 斜杠的值将被保存到数据库中。使用一个或两个,而不是两者。

话虽如此,不要使用addslashes。它没有真正的目的。针对适当的情况使用特定的转义机制。即,仅使用mysql_real_escape_string。或准备好的语句,这避免了整个转义的混乱。

【讨论】:

    【解决方案3】:

    如果您使用准备好的语句(例如通过 PDO 或 mysqli 库),则不需要转义或过滤任何内容。

    【讨论】:

      猜你喜欢
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 2013-08-19
      • 2011-11-18
      相关资源
      最近更新 更多