TGTGInsighttelegram intelligenceLIVE / telegram public index
← Hypercube's Channel
Hypercube's Channel avatar

TGINSIGHT POST

Post #119

@SmartHypercube_channel

Hypercube's Channel

Views280帖子阅读量
发布11月19日2023/11/19 15:53
Post content

帖子内容

如果想把一些数据嵌入到网页中,供 JS 读取使用,一种做法是把数据放在 <script id="foo" type="application/json"> 标签中。(这里假设数据是 JSON 格式,其他格式同理。) 但这自然会带来注入漏洞相关的问题,不能将不可信的 JSON 直接这样放进 <script> 标签中,因为如果其中包含 </script> 就可以“逃出”这个标签了。这个问题看似很好解决,HTML 是相对比较容易 quote 的语言,只要把 & < > 三个字符分别换成 &amp; &lt; &gt; 就足够好了。但是实际上 <script> 标签内部不支持这些转义序列,这样替换会导致用 JS 读出数据时读到替换后的版本,还得费心再替换回来。 (顺便一提,如果想在 JS 里面写 foo = "</script>",写成 foo = "&lt;/script>" 并不等价,应该写成 foo = "<\/script>" 或 foo = "<" + "/script>"。) Django 自带的 json_script 功能会巧妙地把 & < > 分别替换为 \\u0026 \\u003C \\u003E,甚至不用改 JSON 序列化代码,只用在序列化结果上执行这个替换,就能保证对于所有合法的 JSON,替换前后语义完全相同,反序列化时感知不到差异。 不是所有格式都这么巧地有这样简单的替换方法的,一般地说,<script> 标签内很难安全地放不可信的数据。用 src 属性或 Fetch API 从另一个 URL 加载会方便得多。