Javascript 保护站点不受外部精简JS代码影响的方法

Javascript 保护站点不受外部精简JS代码影响的方法,javascript,security,Javascript,Security,我知道最好的方法是根本不使用外部JS,但唉,这是不可能的 形势 网站所有者希望(无ifs/ands/orButs)从提供赌博广告的公司获得报酬。该公司声明,为了让他们提供上述广告,网站所有者必须向网站添加JS代码。所说的JS代码只有几行,但本质上它创建了一个标记,并加载了一个位于宣传公司服务器上的小型外部JS文件。他们做不同类型的广告(弹出窗口等)和其他一些需要代码的事情 没有讨论没有我想知道,为了保护网站浏览者,我是否可以添加任何类型的安全层。我知道他们仍然处于危险之中,但我无能为力 要做的事

我知道最好的方法是根本不使用外部JS,但唉,这是不可能的

形势

网站所有者希望(无ifs/ands/orButs)从提供赌博广告的公司获得报酬。该公司声明,为了让他们提供上述广告,网站所有者必须向网站添加JS代码。所说的JS代码只有几行,但本质上它创建了一个标记
,并加载了一个位于宣传公司服务器上的小型外部JS文件。他们做不同类型的广告(弹出窗口等)和其他一些需要代码的事情

没有讨论没有我想知道,为了保护网站浏览者,我是否可以添加任何类型的安全层。我知道他们仍然处于危险之中,但我无能为力

要做的事情

  • 复制外部JS文件并从站点所有者的服务器上提供(或者这是一个可怕的想法吗?问题是,至少这样他们不能将其更改为自己的核心内容,因为它在站点所有者的服务器上)
  • 不在任何具有登录表单的页面中加载JS文件
  • 仅加载将显示宣传内容的JS文件
  • 如果用户已登录,则不加载JS文件
  • 修改JS文件,使其具有自己的作用域
    (function(){})(

我还能做什么?或者我只是在愚弄自己,以为我可以提供一些微弱的保护?

有几种方法可以让您使用外部脚本保护页面。 首先创建一个内容安全策略。这基本上告诉浏览器可以从何处加载不同类型的内容,因此,如果第三方开始从新来源加载内容,而不事先告诉您这些内容将被阻止

其次是脚本src标记。这允许您指定脚本标记的散列,如果它发生更改,浏览器将不会运行它

Troy Hunt博客上有一篇关于这些和更多内容的更好的评论,特别是这一页

要做的事情:
  • 使用支持版本(几乎所有现代CDN都支持)的CDN,这样您就不需要自己托管这些JS文件,也不必担心文件可能会更改

  • 仅在登录页面上运行JS

  • 对于ads,使用
    iframe
    元素,因此ads的JS代码无法访问外部信息

  • 在脚本标记上使用子资源完整性(SRI)

jQuery示例


  • 正如Karl Graham提到的,在HTTP头中使用,这样内容就不会泄漏

  • 确保使用SSL证书(HTTPS),并在执行AJAX/Fetch请求时加密内容,以便即使外部脚本侦听
    FetchEvents
    ,也无法读取数据


我几乎可以肯定,如果您遵循这些规则,您的外部脚本将无法获取表单内容。

唯一明智的做法是:在已知状态下检查脚本,并拒绝提供任何未经检查的脚本。永远不要运行你不信任的代码。如何“可审查”这当然是一个不同的问题…另一个想法是将所述脚本加载到iFrame中,在这里您可以控制安全性…也许有帮助。如果网站所有者坚持使用它,请确保他了解潜在的后果并继续。如果他明白后果并无论如何都想这么做,那就让他去做吧。如果我想在我的额头上纹一堆狗屎-那将是相当愚蠢的,但是有很多人愿意拿我的钱。”修改JS文件,使它有自己的作用域
(function(){})(
“你不能阻止他们突破这个作用域,访问全局范围内的所有内容。因此,最好确保你的东西在那里很少可用。不过,如果你不信任你直接包含的脚本,这些都不会有帮助。但它可能会显示任何可怕的内容。我在我的iPad上加载了一份普通的荷兰报纸,并从一个Iframed广告中弹出了一个核心色情内容。“你不必担心文件可能会更改”-使用CDN并不能减轻这种担心“只在登录页面上运行JS”-这应该有什么帮助吗?@Bergi是的,这就是为什么使用SRI是必要的useful@mplungjan是的,没错,但是没有办法解决这个问题(你可以使用广告块,但不是每个人都在使用广告块)。
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>