如何减轻可能最终被用作JavaScript表达式一部分或被解析为JavaScript的输入数据的转义,以减轻对不受信任数据的注入攻击?
热门示例:
MongoDB
db.foo.find({$where: 'this.value === ' + userInput})
DOM
$('<script>')
.attr('type', 'text/javascript')
.text('var x = ' + userInput)
.appendTo('head')
我想了解:
类似的事情可能会起作用:
// Escape non-whitelisted characters with raw hex equivalent.
function escapeJsHex(input) {
// Replace non-whitelisted characters.
return input.replace(/[^a-z0-9_]/gi, (char) => {
// Output double-escaped hex code.
return String.raw`\x${('0' + char.codePointAt(0).toString(16)).substr(-2)}`
})
}
用法:
console.log(escapeJsHex('10')) // 10
console.log(escapeJsHex('10; y = 20')) // '10\x3b y \x3d 20'
// Parse simulated legitimate user input.
var userInput = '10'
eval('x = ' + escapeJsHex(userInput)) // -> '10'
// Parse simulated injection attempt.
userInput = '10; y=20'
eval('x = ' + escapeJsHex(userInput)) // SyntaxError: Invalid or unexpected token
似乎合法,但这对于服务器端和客户端JavaScript转义是否足够?有什么令人担忧的警告吗?哪种方法或技术会更好?