2014-09-22 89 views
10

我认为这是网络上一个众所周知的最佳做法,不信任任何输入。句子是否需要对JSON进行消毒?

“所有输入都是邪恶的。”

可能是输入验证方面引用最多的引用。现在,对于HTML,您可以使用诸如DOMPurify等工具对其进行消毒。

我的问题是,如果我有一个运行Express的Node.js服务器和body-parser中间件来接收和解析JSON,我是否还需要运行任何清理?我的(也许天真?)的想法是,JSON只是数据,没有代码,如果有人发送无效的JSON,body-parser(内部使用JSON.parse())会失败,所以我知道我的应用程序将接收有效的JavaScript对象。只要我不运行eval或调用一个函数,我应该没问题,不是吗?

我错过了什么吗?

+2

这听起来对我来说,像body-parser已经在消毒输入,所以你不应该自己这样做。另一方面,除非它是性能瓶颈,否则对输入进行双重消毒没有任何坏处。 – 2014-09-22 21:08:59

回答

14

由于JSON.parse()不运行任何代码值对在对数据进行分析,所以它是不容易的方式eval()是,竟然还有件事情你应该做些什么来保护您的服务器和应用程序的完整性,如:

  1. 应用异常处理程序因为JSON.parse()可能会引发异常。
  2. 不要对有什么数据做出假设,你必须在使用数据之前明确地测试数据。
  3. 仅处理您正在查找的属性(避免可能存在于JSON中的其他内容)。
  4. 验证所有传入数据为合法的可接受值。
  5. 净化数据的长度(以防止数据过大的DOS问题)。
  6. 不要将这些传入的数据放入可以进一步评估的位置,例如直接放入页面的HTML中,或直接注入SQL语句中而不进行进一步的清理以确保其对于该环境是安全的。

因此,要直接回答您的问题,“是”还有更多的工作要做,而不仅仅是使用body-parser,尽管它是第一个处理数据的完美的前线。在从身体分析器得到数据后,对数据所做的下一步操作在很多情况下都很重要,并且可能需要额外的注意。


举个例子,这里有一个解析函数,期望一个对象具有属性适用部分检查,并为您过滤结果只包含您所期望的特性:

// pass expected list of properties and optional maxLen 
// returns obj or null 
function safeJSONParse(str, propArray, maxLen) { 
    var parsedObj, safeObj = {}; 
    try { 
     if (maxLen && str.length > maxLen) { 
      return null; 
     } else { 
      parsedObj = JSON.parse(str); 
      if (typeof parsedObj !== "object" || Array.isArray(parsedObj)) { 
       safeObj = parseObj; 
      } else { 
       // copy only expected properties to the safeObj 
       propArray.forEach(function(prop) { 
        if (parsedObj.hasOwnProperty(prop)) { 
         safeObj[prop] = parseObj[prop]; 
        } 
       }); 
      } 
      return safeObj; 
     } 
    } catch(e) { 
     return null; 
    } 
} 
4

你应该没问题。早期的JSON用户通常会在收到的字符串上调用eval(),这当然是一个巨大的安全漏洞。但是,正如你所说,JSON.parse处理了大多数这种完整性检查。例如,你应该没问题,只要你确保不会从收到的JSON对象中拿出某些东西并将它直接传递给sql查询。

+2

提示:如果不将某些内容从接收的JSON直接传递到SQL查询中,这一点特别有价值,谢谢你:-)! – 2014-09-22 21:17:06

2

只要你使用JSON.parse没有代码进行评估

你还是应该列入白名单的任意键:你想从分析结果接受虽然

+4

'JSON.parse'的某些填充(如Crockford的[json2.js](https://github.com/douglascrockford/JSON-js/blob/master/json2.js))使用'eval'。 – Oriol 2014-09-22 21:26:02

+3

感谢您的提及,但解决方案很简单:不要使用它。 – naomik 2014-09-22 21:27:54

+3

@Oriol - 此外,这个问题特别是关于在node.js中使用实际的'JSON.parse()'的代码。这里没有涉及polyfill。 – jfriend00 2014-09-22 21:31:12

相关问题