CodeQL 文档

异常文本重新解释为 HTML

ID: js/xss-through-exception
Kind: path-problem
Security severity: 6.1
Severity: warning
Precision: high
Tags:
   - security
   - external/cwe/cwe-079
   - external/cwe/cwe-116
Query suites:
   - javascript-code-scanning.qls
   - javascript-security-extended.qls
   - javascript-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

直接将错误消息写入网页而无需清理,如果错误消息的某些部分可以由用户影响,则会导致跨站脚本攻击漏洞。

建议

为了防止跨站脚本攻击,请考虑在将用户输入写入页面之前使用上下文输出编码/转义,或者使用参考资料中提到的其他解决方案之一。

示例

以下示例显示将异常直接写入文档,并且此异常可能受页面 URL 的影响,从而使网站容易受到跨站脚本攻击。

function setLanguageOptions() {
    var href = document.location.href,
        deflt = href.substring(href.indexOf("default=")+8);
    
    try {
        var parsed = unknownParseFunction(deflt); 
    } catch(e) {
        document.write("Had an error: " + e + ".");
    }
}

示例

第二个示例显示使用 JSON 模式验证器 ajv 验证输入,并在发生错误时,将错误消息直接发送回响应中。

import express from 'express';
import Ajv from 'ajv';

let app = express();
let ajv = new Ajv();

ajv.addSchema({type: 'object', additionalProperties: {type: 'number'}}, 'pollData');

app.post('/polldata', (req, res) => {
    if (!ajv.validate('pollData', req.body)) {
        res.send(ajv.errorsText());
    }
});

这是不安全的,因为错误消息可能包含输入的一部分。例如,输入 {'<img src=x onerror=alert(1)>': 'foo'} 将生成错误 data/<img src=x onerror=alert(1)> should be number,从而导致反射型 XSS。

参考资料

  • ©GitHub, Inc.
  • 条款
  • 隐私