我正在 Codeigniter 中开发评论系统,并且希望得到一些关于我应该采用哪种验证规则的建议。我不想允许任何图像或其他任何 HTML。
到目前为止,我只设置了 trim
和 max_length
。在插入数据库之前,我还会通过 htmlspecialchars
运行内容。我在全局范围内启用了 XSS 过滤。
我还应该采取哪些其他预防措施? htmlspecialchars 是否足以防止 Javascript 或其他恶意代码被输入?
最佳答案
你可能应该做一个常规的 form validation on required 和 max_length,显然在将内容推送到数据库之前进行 xss 过滤。 htmlspecialchars 应该只应用于不在标记中的字符,因此您不能直接执行 htmlspecialchars 。您需要:
1 - 剥离标签元素(并存储它们),例如“<br/>
”或“<b>
”,但不剥离它们的内容,这意味着“<b>
”和“</b>
”内没有任何内容。您可以使用preg_match来做到这一点.
2 - 对所有剩余文本执行 htmlentities
3 - 删除所有不需要的显式标签(从存储的标签堆中)
strip_tags ( string $str [, string $allowable_tags ] )
4 - 然后过滤允许的标签的属性和内容。黑客使用类似
的代码并不罕见<b onMouseOver="window.open(..)"></b>
要解决此问题,您必须做一些额外的工作,并且可能需要使用一些正则表达式。如果您希望我编写更多示例代码,请告诉我。
6 - 将标签元素重新添加回文档。
我现在基本上就把这个做好了。该算法可以提高效率(即先去除不需要的标签,然后继续过滤 html 实体和标签内容),但我将把它留给你。
这是我目前所能看到的潜在黑客行为。不过,可能还有其他方法可以破解您的输入,因此您可能需要检查其他评论框系统用于验证的方式,例如 phpbb forum system 。另一种选择可能是使用 phpbb 方括号格式来处理标签,这样您就不会让用户输入任何 html 标签,而是使用您控制的方括号标签。
这能回答你的问题吗?
关于php - 评论表单验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11974703/