代码清理不当¶
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
使用字符串连接来构建 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
}