cookie
来存放用户的登陆凭证cookie
会在同源的http请求中自动携带cookie
cookie
还有效),访问了危险网站Bcookie
还有效,因此危险网站B里面隐藏的对A的接口就能访问成功aaa.com
这个网页都是经过session_id
来记录用户的登陆状态的aaa.com
页面上有一个对做品点赞的功能,点赞提交地址为aaa.com/api.like?id=777
ww.aaa.com
,天然aaa.com
这个网站就会将小明的登陆状态session_id
存在cookie
中bbb.com
,并在页面中放了这样一个元素<img src="aaa.com/api.like?id=888">
,这样的话,一旦用户进入这个bbb.com
页面,就会请求aaa.com
这个网站的点赞接口aaa.com/api.like?id=888
,并且点赞的用户对象是888
aaa.com
,且代表身份信息的cookie
尚未失效aaa.com
的cookie(该过程详见 这里),那就等于给id为888
这个做品点赞了CSRF不只针对GET请求,其余的类型的请求均可被利用来攻击php
http://wooyun.org/csrf?xx=11
发出了一次HTTP请求// 只要设置这个图片的宽高为0,用户是根本感受不到这个`<img>`元素存在
<img src=http://wooyun.org/csrf?xx=11 />
复制代码
方式2:页面里面放入一个自动提交的表单,模拟一次GET请求html
方式3:页面内部自动发起一个get方法的ajax请求前端
<form action=http://wooyun.org/csrf.php method=POST>
<input type="text" name="xx" value="11" />
</form>
<script> document.forms[0].submit(); </script>
复制代码
Referer
记录了HTTP请求的来源地址
// koa服务器检查Referer示例:
app.use(async (ctx, next) => {
let referer = ctx.headers.Referer;
// 验证Referer是不是以 test.example 开头的
if((referer != null ) && (_.startsWith(referer, "test.example")) {
// 验证经过
await next();
} else {
验证失败,返回错误
ctx.status = 401;
return ctx.body = {
err: '危险的请求,拒绝访问'
}
}
})
复制代码
IE6
、FF2
都是能够本身设置Referer值的cookie
的得到和携带的区别:
token
是csrf.com页面渲染时一块儿带过来的,这样的话,若是不在csrf.com页面发起这个点赞请求,不一样域的网站是拿不到token的token
,后台判断:// 前端
//登陆成功后,将token保存在本地(能够是cookie方式,也能够是 localStorage 方式)
// 而后每次请求时添加一个 token 参数
// 后端,每一个请求过来都验证token是否有效:
app.use( async (ctx, next) => {
var token = req.session.token;
var csrfToken = req.param.csrftoken;
if(token != null && xhrToken != null && token.equals(xhrToken)) {
// success
await next();
} else {
// error
return error
}
})
复制代码
token
,后台判断:// expressJwt是express框架中可用的JWT校验插件
var expressJwt = require('express-jwt');
var validateJwt = expressJwt({ secret: config.secrets.session });
app.use( async (ctx, next) => {
// 也一样容许校验 token 在请求参数中的
if(req.query && req.query.hasOwnProperty('access_token')) {
req.headers.authorization = 'Bearer' + req.query.access_token;
}
// 下面会校验请求头中的 authorization 头
validateJwt(ctx, next);
})
复制代码
cookie
机制来验证登陆权限的接口