CSRF是Cross Site Request Forgery的缩写,乍一看和XSS差不多的样子,但是其原理正好相反,XSS是利用合法用户获取其信息,而CSRF是伪造成合法用户发起请求。


CSRF原理

CSRF原理很简单,当用户登录以站点时用浏览器打开一恶意网址,就有可能遭受攻击。小伙伴们会奇怪了这个很难实现吧,必须同时满足两个条件才行。其实很简单,比如我们使用QQ,看看QQ zone,突然蹦出个包含中奖或者问卷调查链接的聊天窗口(或者是。。。),这个腾讯做了防范,但是我们收到封邮件包含此内容,很多用户会选择去点击。

简单小例子

在一个论坛管理页面,管理员可以在list.php页面执行删除帖子操作,根据URL判断删除帖子的id,像这样的一个URL “http://localhost/test/list.php?action=delete&id=99″
当恶意用户想管理员发送包含CSFR的邮件,骗取管理员访问http://*****/csrf.php,在这个恶意网页中只要包含这样的html语句就可以利用让管理员在不知情的情况下删除帖子了

<img alt=”” arc=”http://localhost/test/list.php?action=delete&id=99″/>
这个利用了img的src可以跨域请求的特点,这种情况比较少,因为一般网站不会利用get请求修改资源信息

升级版

是不是网站利用post修改信息就安全了呢,还拿刚才例子,改成post修改的

<?php
$action=$_POST['action'];
$id=$_POST['id'];
delete($action,$id);
?>

但是恶意网站这么写一样可以攻击

<!DOCTYPE html>
<html>
  <body>
    <iframe display="none">
        <form method="post" action="http://localhost/test/list.php">
            <input type="hidden" name="action" value="delete">
            <input type="hidden" name="id" value="99">
    <input id="csfr" type="submit"/>
          </form>
      </iframe>

<script type="text/javascript">
  document.getElementById('csfr').submit();
</script>
  </body>
</html>

如何防范

1. 使用post,不使用get修改信息

2. 验证码,所有表单的提交需要验证码,但是貌似用起来很麻烦,所以一些关键的操作可以

3. 在表单中预先植入一些加密信息,验证请求是此表单发送

如未注明,均为原创,转载请注明来自Peak Xin's Blog

No Comments »