Z-Blog 主题输出转义:什么时候该转义、转早了会怎样

· zblog · 阅读 14
摘要

转义这事两个方向都会出问题。不转义,可能被注入;转多了,页面上全是 < 这种字符。默认是转的模板里 {$article.Title} 这种输出,Z-Blog 默认做 HTML 转义。所以标题里带个

转义这事两个方向都会出问题。不转义,可能被注入;转多了,页面上全是 &lt; 这种字符。

默认是转的

模板里 {$article.Title} 这种输出,Z-Blog 默认做 HTML 转义。

所以标题里带个 < 符号,页面上正常显示成 <,不会破坏结构。

这是好事,别去关它。

什么时候要原样输出

正文。正文本身就是 HTML,转义了就把标签当文字显示了,页面上会出现一堆 <p>。

正文要用不转义的写法。具体哪种取决于主题怎么传的,看模板里已有的写法,跟着来。

属性里最容易出事

把用户可控的值塞进 HTML 属性,比如 title="{\$x}"。

如果 $x 里有双引号,属性就被截断了,后面的内容跑到属性外面,等于开了一个注入口。

属性值里的引号必须处理掉。宁可用单引号包属性,也别裸着拼。

URL 里更要注意

拼链接时把参数直接接上去,?q={$keyword}。

关键词里有 & 和 # 的时候链接就断了。

该 urlencode 的地方一定 encode。

怎么验

发一篇正文带 <script>alert(1)</script> 的草稿,前台打开。

弹窗了就是有洞。显示成文本就是对的。

再试一个标题带双引号的,看列表页有没有错位。

一句话原则

来自用户的内容,输出前转义。来自系统自己生成、确定是 HTML 的内容,才原样输出。

拿不准就转。多显示几个字符,比被注入强。