【问题标题】:Which is the best secure way to bind a param in php [closed]这是在php中绑定参数的最佳安全方法[关闭]
【发布时间】:2017-08-28 15:02:40
【问题描述】:

哪个是绑定值的最佳安全方式?我知道有3种方法

1.

$Email=$con->quote($Email);
$Example=$con->prepare("UPDATE Ex SET Email=:Email");
$Example->bindParam(':Email', $Email);
$Example->execute();

2.

$Email=$con->quote($Email);
$Example=$con->prepare("UPDATE Ex SET Email=:Email");
$Example->execute(array(
   ':Email' => $Email,
));

3.

$Email=$con->quote($Email);
$Example=$con->prepare("UPDATE Ex SET Email=:Email");
$Example->bindParam(':Email', $Email);
$Example->execute(array(
   ':Email' => $Email,
));

【问题讨论】:

  • “安全方式”是什么意思?你想解决什么不安全感?任何一个都应该同样“安全”。您应该 做的是删除您对quote() 的调用,因为不需要引用准备好的语句。这实际上会改变存储的值。
  • 你在做同样的事情。您也可以使用问号绑定,?还有
  • 在任何情况下,您都在更新整个数据库而没有 WHERE 子句;我希望你意识到这一点。
  • 第三种情况没用。
  • 还有一个bindValue,所以会有更多案例!

标签: php security pdo bind


【解决方案1】:

他们都错了。由于您分别使用quote,因此最终查询实际上将等效于(假设$Email 是,例如foo@example.com):

UPDATE Ex SET Email="\"foo@example.com\""

换句话说,引号成为值的一部分,这可能不是您想要的。

其中任何一个都可以:

$Example = $con->prepare('UPDATE Ex SET Email = :Email');
$Example->execute(array(':Email' => $Email));
$Example=$con->prepare('UPDATE Ex SET Email = :Email');
$Example->bindParam(':Email', $Email);
$Example->execute();

both bindParam 将数组传递给 execute 是无稽之谈,因为后者将简单地覆盖前者,而 bindParam 将是多余的。

【讨论】:

  • 所以如果我使用引号,我不应该使用 bindparam 或执行 (array(.. ?
  • @A.Rossi 你不应该使用引号,你应该绑定你的参数。
  • @A.Rossi quote 用于手动连接查询时,例如'UPDATE Ex SET Email = ' . $con->quote($Email) - 这是您在当今时代永远不应该做的事情,请始终使用参数化查询,如上所示。
  • @deceze 所以如果我引用,然后我执行数组,例如在第三个示例中我可能会导致安全问题?或者我做了一个无用的员工,或者我正在增加安全性?
  • @A.Rossi 只要您使用准备好的语句并且您没有手动将值连接到查询中(如我之前的评论所示),就没有安全问题。但是,quote 正在更改数据,因此您将不同的数据放入数据库中。
【解决方案2】:

这 3 种方法在保护您的代码免受 SQL 注入等攻击方面是相同的。 No3 是多余的 - 您不需要使用 bindParam 并在 execute 中传递参数(如果传递的参数有不同的值,一个可能会掩盖另一个但我在文档中没有找到任何关于它的信息)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 2015-01-19
    相关资源
    最近更新 更多