encodeForJavaScript()with JSON.parse,doublequote woes

时间:2012-07-20 18:17:36

标签: coldfusion coldfusion-10 esapi

在CF(带有esapi-2.0_rc10.jar的9.0.2)中:

<cfset test = ['ha"ha"']>
<script>
  x = JSON.parse('#encodeForJavaScript(serializeJSON(test))#');
  y = JSON.parse('#replace(serializeJSON(test), '"', '\"', "all")#');
  z = #serializeJSON(test)#;
  j = JSON.parse('#jsStringFormat(serializeJSON(test))#');
</script>

输出:

<script>
  x = JSON.parse('\x5B\x22ha\x22ha\x22\x22\x5D');
  y = JSON.parse('[\"ha\\"ha\\"\"]');
  z = ["ha\"ha\""];
  j = JSON.parse('[\"ha\\\"ha\\\"\"]');
</script>

yzj有效。

x实际上失败了:“Uncaught SyntaxError:Unexpected token h”

我认为ESAPI中的encodeForJavaScript()应该是在这种情况下使用的最好和最安全的功能。为什么在这里失败?

方面的问题,如果我只使用serializeJSON(),即使数据是使用用户输入动态构建的,这是否意味着我真的不需要使用JSON.parse,因为没有肯定在JSON字符串中的函数?

2 个答案:

答案 0 :(得分:2)

如果对JSON字符串使用encodeForJavascript,则它不再是有效的JSON。

答案 1 :(得分:0)

来自JSON.org:

  

数字非常类似于C或Java编号,但不使用八进制和十六进制格式。

这是在JSON上下文中

This pic 'shows' the format for strings in json objects

See json.org for more info