Laravel:在允许HTML标记时,针对XSS清理用户输入

时间:2016-12-05 16:38:52

标签: javascript php html laravel xss

如果允许恶意用户使用HTML标记(即在textarea元素中),我应该如何防止恶意用户执行XSS攻击?我不会剥离所有标签或逃避它们,因此我无法使用{{ }}

顺便说一句:还有另一种危险的情况,即使{{ }}也不是个好主意。请考虑this link。有没有办法让用户使用html标签,但阻止他进行XSS攻击?

1 个答案:

答案 0 :(得分:1)

客户端html编辑器在尝试阻止XSS时可能是最大的挑战。实际上,许多第三方编辑器组件都无法这样做。

对于许多场景而言,实际上可以合理运行的一种方法是清理。您可以使用具有html作为其输入的清理程序库,并且具有与其输出几乎相同的html,除了它(应该)删除所有javascript。一个例子是HTML Purifier,它在服务器端执行此操作。

许多人可能会争辩说,唯一正确的地方是服务器端。但是,有时会有一个警告,可能会也可能不会适用于您的用例。如果客户端html编辑器有预览,那么还必须对其进行清理以防止DOM XSS,并且通常不会将预览发送到服务器(编辑的内容只是在客户端上显示而没有服务器往返)。虽然这是一个风险较低的XSS,但它绝对是您需要预防的,而且服务器端清理在这里没什么用。

因此,您可能希望使用客户端清洁剂,或者代替服务器端清洁程序。其中一个例子是Google Caja中的客户端清洁工具(它是一个更大的项目,我只是在谈论他们的sanitizer in Javascript),或者还有DOMPurify在客户端上的另一个例子。这些可以挂钩到任何客户端html编辑器组件,以在实际显示之前清理任何代码,从而有效地消除XSS。

任何消毒的风险在于消毒剂会遗漏某些东西,并且允许XSS的攻击向量通过。这基本上是一个信任的东西,很多人使用Caja,它是由谷歌开发的,所以你可能一些保证它相当不错。这对你来说是否足够好取决于你的具体情况,风险偏好等等。

可能还有其他方法(提供来自不同来源的HTML内容并接受该来源的XSS风险,或使用自定义标记将其小心地转换为无XSS的HTML等),但是清理可能最适合大多数用例。