如何限制用户可以输入到文本框中的 HTML 类型?我正在使用一些我正在测试的自定义软件运行一个小型论坛,但我需要知道如何限制 HTML 输入。有什么建议么?
6 回答
您没有说明论坛是用什么构建的,但如果是 PHP,请查看:
库功能:白名单、删除、格式良好、嵌套、属性、XSS 安全、标准安全
我建议一种稍微替代的方法:
- 不要过滤传入的用户数据(除了防止 sql 注入)。用户数据应尽可能保持纯净。
- 从数据库中过滤所有传出数据,这就是标签剥离等事情应该发生的地方
保持用户数据干净可以让您更灵活地显示数据。过滤所有传出数据是一个好习惯(沿着从不信任数据模因)。
提交文本后,您可以使用 PHP 中的正则表达式去除任何/所有与您的预定义集不匹配的标签。
它看起来像下面这样:
find open tag (<)
if contents != allowed tag, remove tag (from <..>)
解析输入提供并删除所有与您允许的列表不完全匹配的 html 标记。这可以是一个复杂的正则表达式,或者您可以通过输入字符串的 char[] 进行有状态迭代,构建允许的输入字符串并去除标签上不需要的属性,例如
img
.使用不同的代码系统(BBCode、Markdown)
在线查找一些已经执行此操作的代码,以用作实现的基础。例如 Slashcode 必须执行这个,所以在 Perl 中寻找它的实现并使用正则表达式(我假设在那里)
无论您使用什么,请务必了解哪种 HTML 内容可能是危险的。
例如,<script> 标签非常明显,但<style> 标签在IE 中同样糟糕,因为它可以调用JScript 命令。
事实上,任何 style="..." 属性都可以在 IE 中调用脚本。
<object> 将是另一个需要厌倦的标签。
PHP 带有一个简单的函数strip_tag来去除 HTML 标签。它允许某些标签不被剥离。
Example #1 strip_tags() 例子
<?php
$text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>';
echo strip_tags($text);
echo "\n";
// Allow <p> and <a>
echo strip_tags($text, '<p><a>');
?>
上面的示例将输出:
Test paragraph. Other text
<p>Test paragraph.</p> <a href="#fragment">Other text</a>
就我个人而言,我会使用 BBCode 或 Markdown,因为提供的支持和功能数量较多,例如实时预览。