在echo PHP之前清理数组

时间:2016-10-09 20:31:35

标签: php

您如何构建下面消毒阵列的最佳方法?我想在每个$行之前添加htmlentites,或者使用下面的方法。

<?php 
$result = $conn->query("SELECT formula.id, tokens, direction, graph, module FROM formula INNER JOIN syntics ON formula.moduleid = syntics.id"); 

while ($row = $result->fetch_array())
filter_var_array($row, FILTER_SANITIZE_SPECIAL_CHARS); // OK?

echo                    "<td>". 
     $row['tokens']    ."<td>". 
     $row['direction']  ."<td>". 
     $row['graph']     ."<td>".
     $row['module ']   ."<td>". 
     "<a href='upong.php?soya=" . $row['id'] . "'>Specific type</a>" . "</tr>";
?>

3 个答案:

答案 0 :(得分:2)

我觉得你可以从一些有关消毒和逃逸的一般信息中受益。

  • 要了解如何编写安全的PHP代码,您需要预防 对抗XSS。
  • 要防止XSS,您需要 实现正确的输出转义,可能需要实现数据清理。
  • 要实现数据清理和输出转义,您需要了解问题的原因以及如何正确执行。

<强>消毒

应在将数据保存到数据库之前完成清理。它确保不应该保存到数据库中的东西不是。在您从数据库中读取数据之后再次执行此操作也很好,因为您错过了某些内容,而您的数据库现在包含有害的内容。通常,如果您只是存储文本,您可能希望允许保存任何文本,在这种情况下,不需要进行清理。但听起来你正在存储HTML ......

如果您要存储html,您可能计划在某些时候将其输出到浏览器,并且您不希望它包含有害脚本供您的用户执行。由于你可以通过多种方式插入javascript,因此消除html以删除有害的javascript实际上非常困难。整个PHP库(例如wp_kses_*)都是专门为此而编写的,并不足以删除所有&lt;脚本&GT;标签作为一些SO答案建议。此外,您需要保持最新的html清理代码,以防止最新的攻击。总而言之,它是一个非常高风险/维护的解决方案。如果你想走这条路,有一些解决方案here

通常,您希望让用户能够使用html提供的子集(例如粗体,斜体,下划线和某些颜色)来格式化文本,更好的方法是使用更轻量级的语言,例如{ {3}}或Markdown

此外,您应该考虑将字段保存为仅文本,并在应用程序中完全处理样式。

输出转义

这是输出数据之前的一步。当您拼凑HTML以便在PHP中输出时,您需要将尚未输入的任何内容转换为安全的html。如果您使用模板语言,则会自动为您处理。在我看来,这是当今PHP开发人员最容易被误解的概念,不幸的是它是最重要的概念之一。我不想在这里进入,但我强烈推荐BBCode

重要更新

此代码不是数据清理,而是输出转义。

filter_var_array($row, FILTER_SANITIZE_SPECIAL_CHARS);

我现在可以看到令人困惑的词,&#34; 过滤器 &#34;在这个答案中具有这样的通用含义,可以说是两者清理和转义。我已将其从我的答案中删除,以帮助消除任何混淆。

您的示例 - 清理

我不会说从不在数据库字段中存储html,但这种方式要困难得多。您需要确定预期和有效的内容。如果您使用有关特定数据的更多详细信息更新您的问题,则会明确这些限制应该是什么。

您的示例 - 输出转义

如果您的变量已经包含格式良好的HTML片段字符串,那么您可以使用&#34;安全地附加变量。&#34; (字符串连接运算符)在打开和关闭标记内。您在问题代码中添加的内容是正确的。但是,我更喜欢使用带有短标签的直接输出,因为它使代码更具可读性,并且无论如何都不需要将所有内容都放入PHP字符串中。

<td><?= $row['tokens'] ?></td>
<td><?= $row['direction'] ?></td>
<td><?= $row['graph'] ?></td>
<td><?= $row['module'] ?></td>

注意:如上所述,通过输出html,您要求客户信任,解析并显示它。如果这些变量确实包含无效或错误的HTML,那么这是您的清理问题。

  • 输出转义应该/不清理您的数据。
  • 清理应该/不会逃避您的数据。

它们只是两个不同的概念一起工作。

由于你的id 应该是数据库中的一个整数,你可以像这样强制转换它以确保它是。

<a href='upong.php?soya=<?= (int)$row['id'] ?>Specific type</a>

如果该值不能转换为整数(因为发生了一些您没有注意到的意外情况),您的网址最终会得到一个0,这通常不会有害。

答案 1 :(得分:0)

我相信您必须使用自定义过滤器来清理阵列。 请阅读url

中的php文档

答案 2 :(得分:-1)

如果您担心XSS攻击,那么在将输入插入数据库之前,您应该通过使用htmlentities()来解决问题。永远不要相信用户输入。