您如何构建下面消毒阵列的最佳方法?我想在每个$行之前添加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>";
?>
答案 0 :(得分:2)
我觉得你可以从一些有关消毒和逃逸的一般信息中受益。
<强>消毒强>
应在将数据保存到数据库之前完成清理。它确保不应该保存到数据库中的东西不是。在您从数据库中读取数据之后再次执行此操作也很好,因为您错过了某些内容,而您的数据库现在包含有害的内容。通常,如果您只是存储文本,您可能希望允许保存任何文本,在这种情况下,不需要进行清理。但听起来你正在存储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()来解决问题。永远不要相信用户输入。