有没有办法“停止脚本”使用JavaScript运行?

时间:2012-06-07 06:44:17

标签: javascript html xss

如何在JavaScript中停止执行脚本? 在跨站点脚本(XSS)攻击的情况下,基本要求是注入+执行脚本。

想象一下,攻击者能够在页面中注入JavaScript 的情况。我们的目标是阻止攻击者的脚本执行。注入点作为示例可以是任何用户提供的输入区域。

4 个答案:

答案 0 :(得分:0)

始终逃避您的输入。对于XSS,使用htmlentities()来转义HTML和JS。这是一篇关于PHP安全性的好文章

http://www.phpfreaks.com/tutorial/php-security

答案 1 :(得分:0)

在处理XSS时,基本上要注意两件事:

  1. 逃避输出。转义输入只需要更多的资源。转义用户提交的内容输出。这也意味着非转义内容存在于您的数据库中,这是一件好事(如果出现误报,您可以在不丢失内容的情况下修复内容,如果是新的XSS策略,则无需修改所有数据库,等)。
  2. 保护您的JavaScript代码。要非常小心,不要使用eval()或类似的东西来包含一些缺陷。

答案 2 :(得分:0)

正如其他人所说,保护自己免受XSS攻击的最佳和最简单的方法是验证输入并根据插入点正确转义输出(HTML,很可能是实体或JavaScript / CSS块 - 不太可能,更难以正确逸出)。

但是,如果您的用例输出的原始用户输入应该包含任意HTML,并且您只是想阻止注入的JavaScript弄乱您的网站,您可以:

1)将内容框架在一个不同的,唯一的域中(因此它不能与主文档共享cookie),例如xyz123.usercontent.com(xyz123对任何用户都不同) 2)等待和/或CSP的沙箱指令在您支持的每个浏览器中标准化(当然,拒绝访问无法访问的浏览器)。

答案 3 :(得分:0)

您唯一的解决方案是防止脚本被注入。您可以采取以下措施来实现这一目标:

  1. 永远不要相信用户的输入。这意味着表单输入,查询字符串参数,cookie内容或从传入请求获得的任何其他数据。
  2. 在渲染的任何地方清理渲染的所有内容。我喜欢在模板renderrender_unsafe中使用两个明确命名的渲染函数来实现此目的。 Rails自3.0以来具有类似的界面,它会清理所有模板数据,除非您特别要求进行未经过抽样的渲染。拥有一个明确命名的界面将使您更容易控制模板,并确保每次将数据转储到模板时,未经过抽样的渲染都会迫使您做出决定。
  3. 如果您必须允许用户直接运行功能,请始终通过白名单执行此操作。让他们提供一个函数名称或一些其他标识符作为字符串,他们的参数作为JSON或其他一些可解析的构造。看看Shopify的Liquid模板系统的设计,该系统使用类似的执行安全白名单模式。
  4. 绝不信任用户的输入。永远不会。