【问题标题】:The proper way to handle data flow through an application处理通过应用程序的数据流的正确方法
【发布时间】:2014-01-16 13:02:00
【问题描述】:

这可能会被标记为重复,但在我的辩护中,我已经搜索了一段时间,我发现的很多信息最多与 mysqlmysqli 有关,或者不完整.我想要一个全面的、最新的答案,它会影响使用PDO 和准备好的语句。

在数据通过应用程序时处理数据的正确方法是什么。

以下理论数据流是否足够,如果不够,您会建议哪些改进?

  1. 正确的表单验证客户端。
  2. 使用$_POST 而不是$_GET
  3. 在 PHP 中,在插入数据库之前使用 $variable = htmlentities($_POST['variable']);
  4. 使用PDO 和准备好的语句,例如:bindValue(':variable', $variable);
  5. 在输出时,使用echo htmlspecialchars($variable); 防止XSS 攻击。

两个相关问题:

  • 假设您在插入数据库之前对数据使用htmlentities()。如果用户输入说<p>my input value</p>,您如何还删除所有插入的垃圾。这会将:<tr><p>my input value</p>&l 写入数据库。
  • 如果您的 php 返回一个由 AJAX 处理的 JSON 数组,那么在这种情况下您如何处理输出?这在 PHP 中不起作用:htmlspecialchars($JSON_Array)

在此先感谢您的帮助。

【问题讨论】:

  • 第 3 步是不必要的,也是错误的。在第 5 步中,htmlspecialchars 仅适用于 HTML 输出——它可以概括为“以适合输出上下文的方式编码输出——htmlspecialchars 用于 HTML,json_encode 用于 JSON,XML 用于 XML 的文档方法等”。
  • 第 2 步可能有问题(区别在于语义,而非技术),但第 3 步是完全错误的。
  • @Dcoder 36 - 处理步骤 3 的适当方法是什么,或者我想我应该说,步骤 3 应该是什么?
  • 不需要任何步骤 3。将您的数据作为绑定变量直接传递给 PDO,它将为您安全地存储它。

标签: php mysql pdo database-security


【解决方案1】:

一般来说,您的流程将与此类似:

  1. “验证”数据客户端 - 您不想信任此验证,因为您永远不应信任来自客户端的任何内容,这样做是为了改善用户体验。

  2. 服务器上的验证 - 确保提供给您的数据是有效的。示例可能是:验证类型(int、字符串等)、验证值(用户不能订购负数的商品)等。如果您使用某种 MVC 框架,则可以在模型层。

  3. 将数据存储在数据库中 - 您将使用准备好的语句来保护自己免受 SQL 注入,但您不想以任何方式操作数据(没有 htmlentities 或类似方式)。

  4. 当您从数据库中取出数据时,您需要根据是否输出 HTML、JSON、XML 等来决定是否需要转换 HTML 实体或进行其他处理。

如果您需要在 JSON 数组中的数据上使用 htmlspecialchars 或类似的东西,请在将数据放入 JSON 数组之前执行。

【讨论】:

  • 关于#3。防止有人在我的数据库中存储不适当数据的最合适方法是什么?我已经删除了我的 htmlentities 愚蠢,但是在这种配置中,如果他们愿意,它仍然允许某人存储 html 标签,我不希望他们这样做。我可以设置一个正则表达式客户端,但假设你上面所说的,我不想信任客户端数据,我将如何在 php 中删除这些?
  • strip_tags() 是最好的方法吗?
  • @hyphen 对于 HTML 过滤,我喜欢 HTML Purifier。对于其他类型的验证,您也可以在服务器端在 PHP 中执行正则表达式,查看preg_match 和相关函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
  • 2011-10-01
相关资源
最近更新 更多