有没有一种方法可以;“停止脚本”;从使用JavaScript运行开始?

有没有一种方法可以;“停止脚本”;从使用JavaScript运行开始?,javascript,html,xss,Javascript,Html,Xss,如何停止JavaScript中的脚本执行如果发生跨站点脚本(XSS)攻击,基本要求是注入+执行脚本。 想象一下,攻击者能够在页面中注入JavaScript&我们的目标是阻止攻击者的脚本执行。例如,注入点可以是任何用户提供的输入区域。始终转义您的输入。对于XSS,使用htmlentities()转义HTML和JS。这里有一篇关于PHP安全性的好文章 在处理XSS时,基本上有两件事需要注意: 退出你的输出。转义输入只会白白占用更多资源。转义用户提交的内容输出。这还意味着非转义内容在数据库中,这是一件

如何停止JavaScript中的脚本执行如果发生跨站点脚本(XSS)攻击,基本要求是注入+执行脚本。


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

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


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

  • 退出你的输出。转义输入只会白白占用更多资源。转义用户提交的内容输出。这还意味着非转义内容在数据库中,这是一件好事(如果出现误报,您可以在不丢失内容的情况下修复它,如果出现新的XSS策略,您不需要修改所有数据库,等等)
  • 保护您的javascript代码。使用
    eval()

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

    但是,如果您的用例输出的是原始用户输入,它应该包含任意HTML,并且您只想防止注入的JavaScript干扰您的站点,那么您可以:

    1) 在不同的、唯一的域中构建内容(因此它不能与主文档共享cookies),例如xyz123.usercontent.com(对于任何用户,xyz123都不同)
    2) 等待和/或CSP的sandbox指令在您支持的每个浏览器中被标准化(当然,拒绝访问不可用的浏览器)。

    您唯一的解决方案是防止注入脚本。要做到这一点,您可以做以下几件事:

  • 永远不要相信用户的输入。这意味着表单输入、查询字符串参数、cookie内容或从传入请求获得的任何其他数据
  • 清理渲染的所有内容,无论渲染到哪里。我喜欢在模板中使用两个名称明确的渲染函数来实现这一点,
    render
    render\u
    。自3.0以来,Rails有一个类似的接口,它清理所有模板数据,除非您特别要求未初始化的呈现。有一个清晰命名的接口将使您更容易检查模板,并确保未初始化的呈现是例外,这将迫使您在每次将数据转储到模板中时做出决定
  • 如果必须允许用户直接运行函数,请始终通过白名单执行。让他们以字符串形式提供函数名或其他标识符,以JSON或其他可解析结构形式提供参数。看看Shopify模板系统的设计,它使用了类似的执行安全白名单模式
  • 永远不要信任用户的输入。从来没有

  • 你不能。前提是它已经被注入。用户可以完全禁用JavaScript,但这是另一种情况:)攻击注入点似乎比检测破坏后JavaScript可能执行的所有方式要好得多。不,请查看您的输出。虽然这是一个很好的建议,但第1点和第4点与XSS无关(不检查输入),而是与SQL注入有关。