2014-01-16 22 views
1

这可能会被标记为重复,但在我的辩护中,我一直在寻找一段时间,我发现的很多信息是关于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>,你怎样才能删除所有插入的垃圾。这写入:&lt;tr&gt;&lt;p&gt;my input value&lt;/p&gt;&l到数据库。
  • 如果您的php正在返回一个由AJAX处理的JSON数组,您将如何处理该场景中的输出?这不适用于PHP:htmlspecialchars($JSON_Array)

在此先感谢您的帮助。

+1

第3步是不需要和误导。在第5步中,'htmlspecialchars'只适用于HTML输出 - 它可以概括为“以适合输出上下文的方式对输出进行编码 - 对HTML使用'htmlspecialchars',对JSON使用'json_encode',对XML使用XML Document方法等等“。 – DCoder

+0

步骤2也许是有问题的(差异是语义上的,而不是技术上的),但是3完全错误。 – Jon

+0

@Dcoder 36 - 处理步骤3的适当方法是什么?或者我想我应该说,步骤3应该是什么? – hyphen

回答

3

一般来说你的流程将类似于此:

  1. “验证”数据客户端 - 你不想相信这验证,因为你永远不应该相信任何来自客户端,这是完成更好的用户体验。

  2. 验证服务器 - 确保提供给您的数据有效。例子可能是:验证类型(int,string等),验证值(用户不能排序负数的项目)等。如果你使用某种MVC-ish框架,这是在模型图层。

  3. 将数据存储在数据库中 - 您将使用预准备语句来保护自己免受SQL注入的影响,但不希望以任何方式操作数据(如htmlentities等)。

  4. 每当你正在做数据出来的时候您决定是否需要转换成HTML实体还是基于不管你是输出HTML,JSON,XML一些其他的处理是这样的数据库,等等

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

+0

关于#3。什么是防止某人在我的数据库中存储不适当数据的最合适的方法?我已经删除了我的愚蠢行为,但在这种配置下,它仍然允许某人存储HTML标记,如果他们愿意的话,我宁愿不让他们这样做。我可以设置一个正则表达式客户端,但假设你上面说的,我不想信任客户端数据,我将如何删除这些在PHP? – hyphen

+0

是strip_tags()最好的办法吗? – hyphen

+0

@hyphen对于HTML过滤,我喜欢[HTML Purifier](http://htmlpurifier.org/)。对于其他类型的验证,您也可以在服务器端使用PHP进行regex,请查看[preg_match](http://us3.php.net/preg_match)和相关函数。 –

相关问题