首页 > 解决方案 > 正确使用 appendChild 避免 XSS

问题描述

在进行 XXS 站点检查后,控制台中弹出的一个错误是内联使用了 Google Analytics(分析)跟踪代码管理器所需的脚本。我现在创建了一个外部 analytics.js 文件,我将其加载到标题中并创建了一个 IIFE 来加载脚本,然后检查它是否在 GA 中工作(确实如此):

var load_google_tag_manager = function(){
    var script = document.createElement("script");
    var head = document.getElementsByTagName('head')[0];
    script.async = true;
    script.type = "text/javascript";
    script.src = "https://www.googletagmanager.com/gtag/js?id=UA-XXXXXX-1";
    head.appendChild(script);
}();

window.dataLayer = window.dataLayer || [];

function gtag() {
    dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'UA-XXXXXX-1', {
    "anonymize_ip": true,
    "allow_display_features": false,
    "link_attribution": false
});

然后我再次检查控制台是否有错误警告并得到一个,这是函数的使用appendChild。在阅读了一些OWASP 文档后,我了解到使用它可能存在潜在危险,并且给出了一些如何使其更安全的好例子,例如:如何使用该setAttribute方法。例如:

SAFE and FUNCTIONALLY CORRECT example

 var x = document.createElement("input");
 x.setAttribute("name", "company_name");
 x.setAttribute("value", '<%=Encoder.encodeForJS(companyName)%>');
 var form1 = document.forms[0];
 form1.appendChild(x);

但它没有说明当您不使用这种方法时如何执行此操作。我将如何src安全地设置值?最终,我想让我的 IIFE 远离 XXS。

标签: javascriptxssowasp

解决方案


由于服务器端模板与客户端代码混合在一起,因此示例中需要编码。引号需要转义以防止字符串文字被关闭,并在其后添加更多代码。

所以如果companyName'); alert(1);//,那么:

x.setAttribute("value", '<%=companyName%>');

会成为:

x.setAttribute("value", ''); alert(1);//');

您的 URL 看起来像一个固定常量,因此不可能出现这样的情况,因此您的代码应该没问题。


推荐阅读