在JavaScript中,可以通过DOM XSS测试来检查代码中是否有潜在的XSS漏洞。以下是一些常见的DOM操作,如果不正确地处理输入,可能会触发XSS:
document.write(): 如果不是在<script>标签中使用,这个函数可以插入并执行任意的JavaScript代码。
// 不安全的示例
var unsafeInput = "'; alert('XSS'); //";
document.write(unsafeInput);
innerHTML, outerHTML, insertAdjacentHTML: 这些方法可以解析并执行嵌入的JavaScript。
// 不安全的示例
var unsafeInput = "<script>alert('XSS')</script>";
element.innerHTML = unsafeInput;
eval(), setTimeout(), setInterval(): 这些函数可以执行字符串参数作为代码。
// 不安全的示例
var unsafeInput = "alert('XSS');";
eval(unsafeInput);
createScript(): 这个方法可以创建并执行新的<script>元素。
// 不安全的示例
var unsafeInput = "//example.com/malicious.js";
var script = document.createElement('script');
script.src = unsafeInput;
document.head.appendChild(script);
为了防止XSS,你应该:
对输入进行适当的清理和编码。
使用DOM操作方法时,始终确保输入是被正确的处理,不会被解释为代码。
避免使用可以执行字符串为代码的方法。
使用现代的Web应用程序安全库,如Content Security Policy (CSP)。
这里是一个简单的例子,展示了如何清理输入并避免XSS:
function safeInnerHTML(element, html) {
element.innerHTML = html; // 清理或编码输入
}
var unsafeInput = "<script>alert('XSS')</script>";
safeInnerHTML(document.body, unsafeInput); // 安全地设置innerHTML