4

XSS介绍

原文请看我的GitHub博客>>

维基百科:
跨站脚本(英语:Cross-site scripting,通常简称为:XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。

比如,一个网站的评论区,用户可以输入<script>标签,如图:

clipboard.png

点击submit发送内容,如果前端后端都没有做任何处理的话,这段评论在提交以后就会原封不动地展示在html上。而这个时候,script里的代码执行了,导致所有访问这个页面的用户的cookie都发送到了黑客指定的API。

解决思路

前端

提交过程

前端对于这种情况好像在发送到后端的过程中无能为力,即使在流程中加上前端转译,黑客也可以通过直接在控制台执行js的方式来提交评论。

渲染过程

前端倒是在渲染的时候可以做相应的处理,比如可以用以下方法处理:

processedContent(comment) {
    return comment
        .replace(/&/g, "&amp;")
        .replace(/</g, "&lt;")
        .replace(/>/g, "&gt;")
        .replace(/"/g, "&quot;")
        .replace(/'/g, "&#039;")
}

这样就能处理掉非法符号了(代码仅列举了部分符号)。
&amp; &lt; &gt;这些字符叫做字符实体因为比如< >这样的字符游览器会认为是标签,所以,如果想正常显示< >,那么就得转成字符实体,而游览器默认也认识这些字符,在展示的时候,还是展示成字符实体对应的符号。
对于渲染阶段,像react,vue这样的库,又或者是juicer,ejs这样的前端模板,都会默认处理非法符号为字符实体。
字符实体详解可以看这里>>

后端

提交过程

后端在收到前端的提交以后,直接存起来就好。

渲染过程

这里的渲染指的是后端模板渲染,渲染模板可能是smarty,可能是laravel的blade,可能是node做中间层用的ejs,亦可能是vue或react的SSR。这些后端模板都自己内部会做转义。
转义的实现方法也无非是通过正则匹配,然后进行替换。

总结

总之,无论是后端模板还是前端模板,其实都是前端的范畴,所以,XSS的防御前端是关键。


岁月是把杀猪刀
1.6k 声望1.4k 粉丝

もっと遠くにあるはずの、とこか、僕はそこに行きたいんだ