我只是创建一个用户可以用html编写的表单,我想知道出于安全原因我应该删除哪些html标签。此表单将发送到PHP文件,因此我打算使用 strip_tags 删除不需要的标记。
到目前为止,我唯一的想法是删除脚本和div(以避免破坏布局)标签。
我应该解析什么以避免安全性和布局问题?
提前致谢
答案 0 :(得分:3)
这些HTML导致代码注入,如this ariticle中所述:
<SCRIPT>
:添加要在文档中使用的脚本。
<OBJECT>
:在文档上放置对象(例如小程序,媒体文件等)。标记通常包含用于检索IE用于显示对象的ActiveX控件的信息。
<APPLET>
:用于在文档上放置Java小程序。它在HTML 4.0规范中被折旧,有利于标记。
<EMBED>
:将对象嵌入文档中。嵌入式对象通常是需要特殊插件才能显示的多媒体文件。特定媒体类型及其各自的插件可以具有用于控制文件回放的附加专有属性。结束标记并不总是必需的,但建议使用。 HTML 4.0规范删除了标记以支持标记。
<FORM>
:表示表单的开头和结尾。
还要看一下php的htmlentities()
函数。此函数在所有方面都与htmlspecialchars()
相同,除了htmlentities()之外,所有具有HTML字符实体等效项的字符都将转换为这些实体。详细了解here。
答案 1 :(得分:2)
答案可能取决于您想要达到的“安全”水平。
如果你想真的安全,我恐怕你必须删除所有的html标签。正如strip_tags
的文档所述,您允许的任何标记都可能被style
和onmouseover
属性滥用。
http://php.net/manual/en/function.strip-tags.php
如果您想允许格式化,我建议使用降价编辑器。你会在另一个问题中找到好主意:
https://stackoverflow.com/questions/2357022/what-is-a-good-client-side-markdown-editor
答案 2 :(得分:1)
语义真的我想,但直接的答案应该是“所有这些”。
您的问题应该更像“我允许哪些标签?”。
不同之处在于:除了你想要允许的东西(来自“白名单”)之外,你核对一切,而不是允许除“黑名单”之外的所有内容。
所以,转动你的问题,你将走上正确的轨道。
然后去阅读PHP课程HTMLPurifier。
补充:如果您想知道自己要保护自己的真实程度,请仔细阅读OWASP
中的定义。答案 3 :(得分:0)
如果您的服务器启用了SSI(服务器端包含),您可能还希望禁用SSI包含。
SSI看起来像<!--# something here -->
。
例如,如果您在某个页面上显示用户的输入,<!--#exec cmd="del *.*"-->
将删除服务器中的所有内容。
希望这有一些帮助。