我正在编写Codeigniter中的评论系统,并希望就我应该使用哪种验证规则提出一些建议。我不想允许任何图片或其他任何HTML。
到目前为止,我只设置了trim
和max_length
。在插入数据库之前,我还通过htmlspecialchars
运行内容。我全局启用了XSS过滤。
我应该采取哪些其他预防措施? htmlspecialchars是否足以阻止输入Javascript或其他恶意代码?
答案 0 :(得分:3)
你应该在required和max_length上做一个常规的form validation,显然是在将东西推送到数据库之前进行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标签,而是使用你控制的方括号标签。
这会回答你的问题吗?