【问题标题】:are PDO::prepare and PDO::quote completely secure? [duplicate]PDO::prepare 和 PDO::quote 是否完全安全? [复制]
【发布时间】:2017-11-10 18:56:16
【问题描述】:

我正在使用 PDO 包来管理我的应用程序数据库。 我使用 PDO::preparePDOStatement::execute 和 somtimes PDO::quotePDO::query / PDO::exec 来执行我的查询

PDO::preparePDO::quote 是否完全安全?或者我应该做更多的工作来正确验证我的输入。不仅适用于数据库,也适用于 php 代码 谢谢

【问题讨论】:

  • 不仅仅是注射。我不应该担心所有输入风险吗?
  • 你不应该相信用户输入,是的。但是您提到了 PDO stuff,所以我假设您正在谈论的是 db。如果您要输出用户提供的一些信息,您可能还需要查看 XSS(跨站点脚本)。但实际上,安全性是一个很长的列表,这使得这个问题至少过于宽泛
  • 定义安全
  • 在数据库旁边。我使用 PDO::quote 来(清理)输入值,以便将它们插入到 php 代码中。够了吗?
  • @adeladl 如果您要“清理”您在 PHP 中保留的值,您会如何防止使用 PDO::quote,而这些值可能最终通过一些 HTML 显示? PDO::quote 有它自己的目的,它是清理你添加到 database 的值,而不是其他地方,如果你使用准备好的语句 - 清理是基于连接字符集完成的 - 基本上,你可以忘记那个功能。你不能坚持一个功能,并期望它让一切变得安全。如果我把它漆成蓝色,我的车会更快吗?

标签: php mysql database security pdo


【解决方案1】:

使用prepare() 并没有什么神奇之处。您可以将不安全变量插入到字符串中,然后准备该字符串。 Boom——SQL 注入。准备一份声明并不安全。

$stmt = $pdo->prepare("SELECT * FROM MyTable WHERE id = {$_POST['id']}"); // UNSAFE!

使用参数是安全的。

$stmt = $pdo->prepare("SELECT * FROM MyTable WHERE id = ?");
$stmt->execute([$_POST['id']]); // SAFE!

自然,人们说“使用准备好的语句”是因为您必须使用准备好的语句才能使用参数。但只是说“使用准备好的语句”有点没有抓住重点,一些开发人员会误解。


PDO quote() 方法也很安全,但我发现它更简单,更容易使用参数。

$idQuoted = $pdo->quote($_POST['id']);
$stmt = $pdo->prepare("SELECT * FROM MyTable WHERE id = $idQuoted");

【讨论】:

    猜你喜欢
    • 2014-06-07
    • 2013-05-14
    • 2012-11-01
    • 2012-10-24
    • 2012-07-12
    • 2015-01-18
    • 2013-03-13
    • 2014-06-19
    相关资源
    最近更新 更多