CodeQL 文档

代码清理不当

ID: js/bad-code-sanitization
Kind: path-problem
Security severity: 6.1
Severity: error
Precision: high
Tags:
   - security
   - external/cwe/cwe-094
   - external/cwe/cwe-079
   - external/cwe/cwe-116
Query suites:
   - javascript-code-scanning.qls
   - javascript-security-extended.qls
   - javascript-security-and-quality.qls

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

使用字符串连接来构建 JavaScript 代码可能会导致错误,最糟糕的情况是如果攻击者构造输入,则会导致代码注入。

建议

如果使用JSON.stringify或 HTML 清理器来清理插入 JavaScript 代码的字符串,请确保执行额外的清理或删除潜在的危险字符。

示例

下面的示例构建一个函数,该函数将数字 42 赋值给对象obj上的属性key。但是,如果key包含</script>,那么生成的代码将从</script>中跳出,如果将其插入到</script>标签中。

function createObjectWrite() {
    const assignment = `obj[${JSON.stringify(key)}]=42`;
    return `(function(){${assignment}})` // NOT OK
}

通过转义潜在的危险字符解决了这个问题,如下所示。

const charMap = {
    '<': '\\u003C',
    '>' : '\\u003E',
    '/': '\\u002F',
    '\\': '\\\\',
    '\b': '\\b',
    '\f': '\\f',
    '\n': '\\n',
    '\r': '\\r',
    '\t': '\\t',
    '\0': '\\0',
    '\u2028': '\\u2028',
    '\u2029': '\\u2029'
};

function escapeUnsafeChars(str) {
    return str.replace(/[<>\b\f\n\r\t\0\u2028\u2029]/g, x => charMap[x])
}

function createObjectWrite() {
    const assignment = `obj[${escapeUnsafeChars(JSON.stringify(key))}]=42`;
    return `(function(){${assignment}})` // OK
}

参考

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