我有一个PHP Web应用程序。我不想让用户将HTML发布到我的网站。
如果我只是在保存到我的数据库之前对所有数据运行strip_tags
(),那么strip_tags
()是否足以阻止XSS?
我问,因为如果XSS被阻止,我不清楚阅读documentation of strip_tags。浏览器似乎存在一些错误,允许<0/script>
(是,零)作为有效的HTML。
更新
我意识到我可以在所有输出的数据上运行htmlspecialchars
;但是,我的想法是 - 因为我不想首先允许HTML,所以在保存到我的数据库之前,一劳永逸地清理我的数据会更容易(并且在学术上更好),然后每次都要担心如果数据是安全的,我输出数据。
答案 0 :(得分:18)
我强烈反对它“学术上更好”。
它打破了用户输入(想象一下,如果他们“清除”所有标签中的帖子,那么StackOverflow对于这次讨论会有多么无用。)
以HTML格式插入的文字仅删除了标签,将无效。 HTML也需要转义&
。
HTML中甚至都不安全! strip_tags()
不足以保护属性中的值,例如,<input value="$foo">
可能被$foo
= " onfocus="evil()
利用(不需要<
,>
!)
因此,正确的解决方案是根据您生成的语言要求转义数据。如果您有纯文本并且正在生成HTML,则应使用htmlspecialchars()
等将文本转换为HTML。当您生成电子邮件时,您应该将文本转换为带引号的可打印格式,依此类推。
答案 1 :(得分:12)
strip_tags
本身不足以删除完全有效的非HTML内容。例如:
<?php
echo strip_tags("This could be a happy clown *<:) or a puckered face.\n");
....
echo strip_tags("Hey guys <--- look at this!\n");
将输出:
This could be a happy clown *
和
Hey guys
初始<
之后的所有内容都会被删除。最终用户非常讨厌!不接受保留的HTML字符将是一个不好的举动。当与HTML内联使用时,这些字符需要使用htmlentities
或类似函数进行转义。
您需要更高级的内容strip_tags
- HTML Purifier效果很好,并允许用户使用HTML保留字符。
答案 2 :(得分:5)
正如其他人所提到的,您可以结合使用strip_tags
和htmlspecialchars
来保护自己免受XSS攻击。
关于strip_tags
的一个坏处是,它可能会删除用户不会期望的无害内容。我看到技术人员编写的内容如:<edit> foo </edit>
,他们完全希望这些标签可以被视为原样。此外,我看到“正常”的人甚至做了<g>
之类的事情,因为“咧嘴笑”。同样,如果没有出现,他们会认为这是一个错误。
所以个人而言,我避免使用strip_tags
优先于我自己的解析器,它允许我明确启用某些安全的HTML标记,属性和CSS,显式禁用不安全的标记和属性,并将任何其他特殊字符转换为无害的版本。因此,文本总是被人们所期待。
如果我没有使用该解析器,我只需使用htmlspecialchars
来安全地编码文本。
答案 3 :(得分:3)
它应该,我以前从未听说过那个0技巧。但是,为了安全起见,您可以随时执行strip_tags
,然后执行htmlspecialchars
。好的做法是在您的应用程序上自行测试,因为您知道可以尝试输入和测试的数据类型,看它是否会破坏它。只需搜索XSS漏洞利用方法,并将其用于测试数据。我会至少每周检查一次新的漏洞,并不断测试你的脚本是否有新的漏洞。
答案 4 :(得分:1)
strip_tags()
可以提供帮助,但它不是防弹的。由于它没有验证HTML的剥离,一些聪明的人会发现一个HTML构造(损坏或其他)被剥离,但仍然会导致令人讨厌的事情。但就目前而言,它应该处理大多数被抛出的东西。只是不要认为这将永远是真的。
同样,如果您允许任何标签通过'allowable tags'参数传递,那么它将允许通过任何特定于JavaScript的属性,例如针对这些特定标签的onclick。
答案 5 :(得分:0)
是否需要帮助将html视为文档中的纯文本?
是否需要echo
属性值而不遭受<input value="<?php echo '" onkeydown="alert("XSS")'; ?>" />
这样的XSS攻击?
echo htmlentities('<p>"..."</p>');
// result: <p>"..."</p>
不需要strip_tags()
,因为此函数已经用<
和>
实体替换了<
和>
。
htmlentities()
和有什么区别 和htmlspecialchars()
您可能会问?
好吧,htmlentities()
将对具有等效于HTML实体 的 ANY 字符进行编码,
htmlspecialchars()
仅编码一小部分问题最多的字符。