在JavaScript解析器的上下文中转义用户输入

时间:2018-08-03 16:58:20

标签: javascript escaping code-injection

如何减轻可能最终被用作JavaScript表达式一部分或被解析为JavaScript的输入数据的转义,以减轻对不受信任数据的注入攻击?

热门示例:

MongoDB

db.foo.find({$where: 'this.value === ' + userInput})

DOM

$('<script>')
  .attr('type', 'text/javascript')
  .text('var x = ' + userInput)
  .appendTo('head')

我想了解:

  1. 在JavaScript解释器的上下文中转义数据的正确方法。
  2. 为此目的可能存在哪种受信任的JavaScript库。

类似的事情可能会起作用:

// 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转义是否足够?有什么令人担忧的警告吗?哪种方法或技术会更好?

0 个答案:

没有答案