【问题标题】:PHP-PDO: Is PDO safe only for Inputing to the Database not Outputting from DB?PHP-PDO:PDO 是否仅适用于输入数据库而不是从数据库输出?
【发布时间】:2014-02-05 06:48:39
【问题描述】:

使用PDO 你会遇到类似这样的行:

$dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");

$dbh->prepare("SELECT * FROM REGISTRY where name = ?");

$dbh->prepare("UPDATE table_name SET col1= ?");

这些以在Db存储数据、从数据库中获取数据以及更新在数据库。

在学习PDO 时,强烈强调不要打扰 Sanitizing 你的dataPDO 会做消毒....你可以信任 100%....

现在,当涉及到来自查询的输出 DATA 的安全性时,例如:

"SELECT * FROM table_name",

像:OR 1=1 这样的恶意代码不会影响Database... 但是,既然PDO 在存储在DB 中时只对DATA 进行了对DB 的保护,在输出上,如果column 包含恶意 代码如"<script>alert("Hacked")</script>",这似乎是alert 用户浏览器中的"Hacked" .

对此有什么预防措施?

我们是否必须htmlentitieshtmlspecialchars data 手动保护DATA 的存储、检索和显示的最佳方法是什么?

【问题讨论】:

  • Thx... 那么您所知道的在您的应用程序(或其他负责输出的层)中注意这一点的最佳方法是什么乙>? ...有趣,我相信很多人都没有意识到这一点...请您的建议受到高度重视
  • 我需要“标记”某事作为答案...“回答”而不是评论?...我认为您的观点是扎实而重要的。如果您的答案中包含很少的代码,我将不胜感激。感谢这些教育评论。

标签: php database browser pdo


【解决方案1】:

数据存储

数据库不知道其中存储了哪些数据。如果它是正确的(即所有引号或任何东西都被正确转义) - 那么数据是正确的并且将被正确存储。但是出于什么目的 - html/javascript/可执行代码/脚本代码/或/无论什么 - DB 不知道,所以您需要在您的应用程序(或另一个负责输出的层)中注意这一点。

PDO

PDO 也是如此 - 它的意图根本不在数据逻辑中。它只是驱动程序,因此,就存储在数据库中而言,它可能只提供适当的数据转义。这就是为什么所有特定的东西都不能在那里被抓住(他们不应该)

“最佳方式”

没有“最好的方法”。不同的数据需要不同的方式来维护安全输出。对于 html,它是 htmlspecialchars()/htmlentities() - 但对于其他数据类型,它将是其他东西。你应该确切地知道你在做什么(即你在输出什么)。主要想法是 - 将您的数据按原样存储 - 在数据库中并在需要时提供安全输出(即何时完成输出)。 IE。拆分数据库、数据逻辑和输出,并为每个部分提供正确的功能。

【讨论】:

  • 我主要重读这行:它可能只提供数据库存储方面的适当数据转义。
  • 我认为比数据库存储更好的术语是数据库存储/操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多