csrf攻击主要是利用浏览器发请求时会自动带上域名下的cookie(目前新版本浏览器已加了限制),而cookie里可能存着session信息。
例如: A网站里有一段代码
<img src="https://www.demo.com/api/xxx" />
你在访问A网站时,浏览器会自动向www.demo.com/api/xxx 发送一个get请求,且会带上www.demo.com域名下的cookie。
再例如:
<html>
<head>
<script type="text/javascript">
function load()
{
var iframe = document.frames["load"];
iframe.document.Submit("form");
}
</script>
</head>
<body onload="load()">
<iframe name="load" display="none">
<form method="POST" name="form" action="https://www.demo.com/api/xxx">
<input type="hidden" name="a" value="1">
<input type="hidden" name="b" value="2">
</form>
</iframe>
</body>
</html>
你在访问此网站时,浏览器会自动向www.demo.com/api/xxx 发送一个Post请求,且会带上www.demo.com域名下的cookie。
如何预防
不要用cookie session的方式存用户身份信息,而使用token的方式。把token加到自定义header里或者请求参数里传给服务端。浏览器发请求时是不可能自动加token-header或者参数的,所以就避免了csrf问题。