0

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

<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>

y,z并且j有效。

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

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

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

4

2 回答 2

2

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

于 2012-07-20T19:00:37.533 回答
0

引自 JSON.org:

数字与 C 或 Java 数字非常相似,只是不使用八进制和十六进制格式。

这是在 JSON 上下文中

这张图片“显示”了 json 对象中字符串的格式

有关更多信息,请参见 json.org

于 2012-07-20T18:35:22.360 回答