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
機制來驗證登陸權限的接口