【问题标题】:PDO prepared statement securityPDO 准备好的声明安全
【发布时间】:2013-10-11 14:28:06
【问题描述】:

这是我第一次参与这个很棒的网站,所以我希望能得到第一个很好的答案来回答我的问题。 我正在使用以下代码将数据插入 MySQL 数据库:

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form2")) 
{
$q = $conn->prepare("INSERT INTO client (name, address) VALUES (:name, :address)");
$q->bindValue(':name', htmlspecialchars($_POST['name']), PDO::PARAM_STR);
$q->bindValue(':address', htmlspecialchars($_POST['address']), PDO::PARAM_STR);
$q->execute();
}

插入是否足够安全? 我应该在插入时刻还是在显示数据时刻使用 htmlspecialchars()?

亲切的问候

【问题讨论】:

  • 我总是对安全性持谨慎态度,因此会剥离输入。您正在从此处的表单直接插入数据库,因此检查输入可能是个好主意。
  • @dwjv 我很确定如果不先检查值 isset(),您会收到通知错误。确保设置了一个值并确保它是正确的值并没有错。
  • 参见stackoverflow.com/a/60496/760211,PDO MySQL 驱动程序的默认设置是模拟准备好的语句。您可能需要禁用 emulation 以获得更好的安全性。
  • @RUJordan 是的,我在午餐时喝了两品脱,我的想法不正确,你说得完全正确。你在我有机会编辑我的评论之前就注意到了。
  • 这确实是一个“好问题”,因为它每周都会定期被问到。

标签: php mysql security pdo


【解决方案1】:

是的,您的代码是安全的,但作为一般经验法则,以中性形式存储数据。也就是说,不针对任何特定的输出或媒体进行编码。输出时不要编码。

如果您反其道而行之,并在存储之前将其传递给htmlspecialchars()(就像您在问题中的代码一样),那么您的数据将专门绑定为以 HTML 格式输出。如果您想将其输出到其他地方(例如 XML 文档),而 htmlspecialchars() 不适用,那么您必须先对其进行解码。

【讨论】:

  • 是的! htmlspecialchars 用于 display 格式,而不是用于存储的编码。当需要渲染内容时应该调用它。
  • 非常感谢您的回复,但您能告诉我您所说的“中性形式”到底是什么意思吗?另外,你有什么建议?如何更改上面的代码?
  • 中性形式是指原始形式(未经htmlspecialchars() 的任何处理)。我会从您的代码中删除 htmlspecialchars() 调用并保持原样。提取数据并以 HTML 格式显示时,不要忘记调用htmlspecialchars()
猜你喜欢
  • 2014-01-20
  • 2010-11-21
  • 2012-08-12
  • 1970-01-01
  • 2015-12-08
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多