在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>
y
,z
和j
有效。
x
实际上失败了:“Uncaught SyntaxError:Unexpected token h”
我认为ESAPI中的encodeForJavaScript()
应该是在这种情况下使用的最好和最安全的功能。为什么在这里失败?
方面的问题,如果我只使用serializeJSON()
,即使数据是使用用户输入动态构建的,这是否意味着我真的不需要使用JSON.parse
,因为没有肯定在JSON字符串中的函数?
答案 0 :(得分:2)
如果对JSON字符串使用encodeForJavascript
,则它不再是有效的JSON。
答案 1 :(得分:0)
来自JSON.org:
数字非常类似于C或Java编号,但不使用八进制和十六进制格式。
这是在JSON上下文中