1

我有一个 python 服务器端应用程序,它生成一个简单的 HTML 页面,其中包含大量的客户端 javascript,它根据分配给 js 变量的大量 JSON 数据生成客户端显示给用户的 DOM 树。其中一些 JSON 数据包含字符串,其中一些包含 HTML 标记。这一切都归结为这样的事情:

<html>
...
var tmp = "<p>some text</p>";
...
</html>

不出所料,上述方法不起作用,因为它应该如下所示才能使浏览器 HTML 解析器满意:

<html>
...
var tmp = "<p>some text<\/p>";
...
</html>

(注意转义的正斜杠)

插入到 HTML 中的 JSON 是使用 python 默认 json 库生成的。即,使用 json.dumps 明确设计为转义字符串中的正斜杠。

我尝试子类化 json.JSONDecoder 以覆盖其对 python 字符串的行为,但这不起作用,因为它不允许对基本 python 类型的序列化进行专门化。

我尝试使用各种其他 python json 库但运气不佳:似乎由于大多数人讨厌转义的正斜杠,因此大多数库都不会生成它们。

在调用 json.dumps 之前,我可以手动转义字符串,然后将它们填充到我的 python 数据结构中。我还可以编写一个函数来递归地遍历数据结构、发现字符串并自动转义它们(从长远来看会更好)。在将 json.dumps 生成的字符串填充到 HTML 之前,我可能会对其进行转义(我不确定这不会导致在 HTML 中插入无效的 JSON)。

这引出了我的问题:是否有一个 json 序列化库可以强制转义 python 中字符串中的正斜杠?

4

1 回答 1

2

我发现的最好方法是对结果字符串进行替换。

out = json.dumps(obj)
out = out.replace("/", "\\/")

在 JSON 规范中转义正斜杠是可选的,这样做可以确保您不会被"</script>"字符串中的攻击所困扰。

于 2016-09-09T00:15:02.093 回答