6

我有一个包含 JSON 字符串的 rel 属性的元素,例如:

rel='{"id":"#id#","name":"#name#"}'

然后,在我的 javascript 代码中,我$.parseJSON用来解析这些数据。这可以正常工作 - 除了name包含撇号的情况。我尝试过使用jsStringFormat冷融合replace,用转义的单引号等替换所有单引号,但我似乎无法找到正确的解决方案。我知道这可能很简单,但是如何让代码使用 json 正确传递带有撇号/单引号的值?

此代码有效,但消除了我想保留的撇号:

rel='{"id":"#id#","name":"#replace(name,"'","","all")#"}'

这不起作用:

rel='{"id":"#id#","name":"#replace(name,"'","\'","all")#"}'

也没有:

rel='{"id":"#id#","name":"#replace(name,"'","\\\'","all")#"}'

或者:

rel='{"id":"#id#","name":"#replace(name,"'",""","all")#"}'

或者:

rel='{"id":"#id#","name":"#jsStringFormat(name)#"}'
4

3 回答 3

4

在玩了很多之后,我终于得到了这个工作:)

rel='{"id":"#id#","name":"#replace(name,"'","&##39;","all")#"}'
于 2012-08-27T20:10:27.680 回答
2

您遇到的问题是因为您在两种情况下处理字符串。您需要确保字符串在两者中都是安全的。

JSON字符串:

使代码 JSON 安全的最简单方法是使用SerializeJSON 函数将 ColdFusion 对象转换为有效的 JSON。

因此,您的代码可能变为:

rel='#SerializeJSON({"id"=Variables.id,"name"=Variables.name})#'

HTML 属性字符串:

您需要处理的下一个上下文是您希望字符串成为有效的 html 属性值。

在 ColdFusion 10 中,您可以使用EncodeForHTMLAttribute 函数来处理这个问题。

rel='#EncodeForHTMLAttribute(SerializeJSON({"id"=Variables.id,"name"=Variables.name}))#'

如果您使用的是 CF10 之前的东西,那么使用 ESAPI 编码器是您最好的选择。(这包含在 ColdFusion 某些版本的补丁中

rel='#CreateObject("java", "org.owasp.esapi.ESAPI").encoder().encodeForHTMLAttribute(SerializeJSON({"id"=Variables.id,"name"=Variables.name}))#'

我个人使用辅助 CFC 来处理 CF9 中的 ESAPI 编码器,因此 CreateObject 只被调用一次,并在其方法的所有用途中重复使用。

于 2012-08-28T11:47:04.450 回答
1

在 JavaScript 中,用 . 转义字符串中的单引号\

在 HTML 中,您应该真正使用双引号作为属性,并转义双引号,例如:

rel="{"id":"#id#","name":"#name#"}"
于 2012-08-27T19:45:21.870 回答