javascript - 正确使用 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。
解决方案
由于服务器端模板与客户端代码混合在一起,因此示例中需要编码。引号需要转义以防止字符串文字被关闭,并在其后添加更多代码。
所以如果companyName
是'); alert(1);//
,那么:
x.setAttribute("value", '<%=companyName%>');
会成为:
x.setAttribute("value", ''); alert(1);//');
您的 URL 看起来像一个固定常量,因此不可能出现这样的情况,因此您的代码应该没问题。
推荐阅读
- javascript - Axios 中的单元测试拦截器逻辑
- docker - 使用 docker-compose 的 Dockerfile 中定义的卷
- angularjs - 如何在 promise then() karma 和 jasmine 中对条件进行单元测试
- java - Jackson ObjectMapper 将值读入特定的 Java 对象
- bash - 如何从文本文件中迭代每组几行?
- visual-studio - 从 Visual Studio 交叉编译时使用 Raspberry Pi 库
- php - 从 php 中的链接运行查询
- c# - Mediatr:单元测试行为/验证
- python - 如何使每个单选按钮在 tkinter 中与其他单选按钮不同
- c++ - 如何正确地将参数从结构传递给函数?