【问题标题】:Real escape string and PDO [duplicate]真正的转义字符串和 PDO [重复]
【发布时间】:2011-04-12 14:18:30
【问题描述】:

mysql 库迁移后,我正在使用 PDO。我用什么来代替旧的real_escape_string 函数?

我需要转义单引号,以便它们进入我的数据库,我认为可能有更好的方法来处理这个问题,而无需在我的所有字符串中添加(ing)斜杠。我应该使用什么?

【问题讨论】:

  • 聚会有点晚了,但如果 prepare() 方法不是一个选项(例如,当您构建自己的模型时),您可以使用 PDO::quote()

标签: php mysql pdo


【解决方案1】:

你应该使用PDO Prepare

来自链接:

为将使用不同参数值多次发出的语句调用 PDO::prepare() 和 PDOStatement::execute() 通过允许驱动程序协商客户端和/或服务器端缓存查询计划和元信息,并且无需手动引用参数,有助于防止 SQL 注入攻击

【讨论】:

  • 感谢 SteD。我不久前读到过,但我听说 PDO 准备不会阻止 SQL 注入。我不知道该相信什么了。你确定 prepare 会阻止注入攻击吗?
  • PDO 防止 SQL 注入。 (它无助于防止 xss 漏洞,但 mysql_real_escape 也没有)
  • John:是的,如果你使用得当,Bill 在这篇文章中有很好的解释 --> stackoverflow.com/questions/1314521/…
  • @SteD:谢谢,我正在阅读。
  • 任何数据库层都无法保护您免受 XSS 攻击,因为这是页面输出时间转义的问题,与数据库无关。尽管许多被误导的作者确实尝试在 SQL 转义或输入值上进行 HTML 转义,但现在是解决这个问题的错误时机,通常会导致不完整的保护以及其他令人讨厌的错误。
【解决方案2】:

PDO 提供了一种替代方法,旨在将 mysql_escape_string() 替换为 PDO::quote() 方法。

以下是 PHP 网站的摘录:

<?php
    $conn = new PDO('sqlite:/home/lynn/music.sql3');

    /* Simple string */
    $string = 'Nice';
    print "Unquoted string: $string\n";
    print "Quoted string: " . $conn->quote($string) . "\n";
?>

上面的代码会输出:

Unquoted string: Nice
Quoted string: 'Nice'

【讨论】:

  • 我目前正在迁移旧代码以使用 PDO,虽然解决方案是一个很好的解决方案,但人们需要注意它会在字符串周围放置引号这一事实。因此,如果人们正在构建已经包含 "SELECT * FROM users WHERE username = '".$conn-&gt;quote($username)."'"; 之类的引号的查询,则查询将不可避免地失败。
  • 接受的答案可能是推荐的方法和最佳实践,但这个答案是实际问题的正确答案。有时您实际上需要旧的 mysql_escape_string 函数,例如,如果您正在构建一个稍后执行的文件。你不能用准备好的陈述来做到这一点。
  • 如果只执行一次准备好的语句可能会造成性能损失。
【解决方案3】:

使用准备好的语句。它们将数据和语法分开,从而消除了转义 MySQL 数据的需要。参见例如this tutorial.

【讨论】:

  • 皮斯克沃尔,谢谢。我已经在使用它们,只是没有出现错误。我只是想知道准备是否真的可以阻止注入攻击。我听到相反的说法,似乎有很多争论。
  • @John:是的,准备好的语句将阻止 SQL 注入攻击。 (当然,SQL 注入只是一种可能的攻击媒介,因此阻止它们并不是神奇的“poof-your-website-is-now-fully-secure”灰尘)
  • @John 没有一场辩论。其实只有你自己在争论。
  • @Javi 附注:是的。还有……?
  • 准备好的语句不能防止所有类型的 SQL 注入,例如如果您使用动态表名。有关详细信息,请参阅我对已接受答案的评论。
猜你喜欢
  • 2012-07-03
  • 2015-12-02
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 2016-06-04
  • 2013-02-12
  • 2014-07-10
  • 2014-09-11
相关资源
最近更新 更多