CSRF攻击原理及预防手段

CSRF全程 Cross Site Request Forgery, 跨站域请求伪造.这种攻击方式相对于XSS,SQL注入等攻击方式比较晚被发现,今天就来说解下这种攻击方式以及避免方式.php

攻击过程

  • 假设abc用户登陆银行的网站进行操做, 同时也访问了攻击者预先设置好的网站.html

  • abc点击了攻击者网站的某一个连接,这个连接是http://www.bank.com/xxxx指向银行,银行服务器会根据这个连接携带的参数会进行转帐操做.git

  • 银行服务器在执行转帐操做以前会进行SESSION验证是否登陆, 可是因为abc已经登陆了银行网站,攻击者的连接也是www.bank.com.因此攻击的连接就会携带session id到银行服务器.github

  • 因为session id是正确的,因此银行会判断操做是由本人发起的,执行转帐操做.数据库

演示

根据上面的说明,咱们来模拟一下攻击的过程.浏览器

  • www.bank.comwww.hacker.com.用户abc登陆www.bank.com网站以后点击了www.hacker.com的点击抽大奖的诱骗连接安全

  • 此连接会向www.bank.com发起一个post请求.因为请求域名为www.bank.com,因此请求会携带www.bank.com的session id.服务器

www.hacker.com的代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="post" action="http://www.bank.com/transfer.php">
    <input type="hidden" name="from" value="abc">
    <input type="hidden" name="money" value="10000">
    <input type="hidden" name="to" value="hacker">
    <input type="button" onclick="submit()" value="点击抽大奖">
</form>
</body>

能够发现,www.hacker.com的网页中包含了一个向www.bank.com发起的post请求.而且表单都没隐藏了,只有一个诱骗用户点击的按钮.cookie

完整的实例代码能够在github上找到.传送门.session

预防

从上面的例子 能够看到csrf攻击.黑客不能拿到cookie,也没办法对服务器返回的内容进行解析.惟一能作的就是给服务器发送请求.经过发送请求改变服务器中的数据.上面的例子中攻击者诱导用户点击连接进行转帐操做,使得银行数据库中受害者的金额发生了改变.

了解了csrf攻击的原理和目标,提出了两种防护手段

referer 验证

根据HTTP协议,在http请求头中包含一个referer的字段,这个字段记录了该http请求的原地址.一般状况下,执行转帐操做的post请求www.bank.com/transfer.php应该是点击www.bank.com网页的按钮来触发的操做,这个时候转帐请求的referer应该是www.bank.com.而若是黑客要进行csrf攻击,只能在本身的网站www.hacker.com上伪造请求.伪造请求的referer是www.hacker.com.因此咱们经过对比post请求的referer是否是www.bank.com就能够判断请求是否合法.

这种方式验证比较简单,网站开发者只要在post请求以前检查referer就能够,可是因为referer是由浏览器提供的.虽然http协议有要求不能篡改referer的值.可是一个网站的安全性绝对不能交由其余人员来保证.

token 验证

从上面的样式能够发现,攻击者伪造了转帐的表单,那么网站能够在表单中加入了一个随机的token来验证.token随着其余请求数据一块儿被提交到服务器.服务器经过验证token的值来判断post请求是否合法.因为攻击者没有办法获取到页面信息,因此它没有办法知道token的值.那么伪造的表单中就没有该token值.服务器就能够判断出这个请求是伪造的.

相关文章
相关标签/搜索