浏览器

CSRF的攻击和防御

2018-03-05  本文已影响0人  Da_xiong

什么是CSRF

Cross Site Request Forgery(跨站请求伪造),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

CSRF实例

<!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="mengxin">
        <input type="hidden" name="money" value="10000">
        <input type="hidden" name="to" value="hacker">
        <input type="button" onclick="submit()" value="抢红包">
    </form>
</body>

在这个例子中,由于浏览器的同源策略限制,实际上hacker并无法窃取到萌新的个人信息,而是直接利用了萌新未过期的个人信息直接伪造他的身份发起了转账请求。

如何防范

可以看到,CSRF对用户来说很伤。那到底有什么办法可以进行防范呢?目前常用的有两种防范方法,下面一一讲解。

一、HTTP referer字段验证

在HTTP协议中,有这么一个字段叫referer,它记录了网站请求的来源地址。比如上面的银行转账例子,当萌新登录www.bank.com后,点击任何原网页的链接和按钮,请求来源都是www.bank.com。但当萌新点了被纂改后的链接或者按钮后,他的来源地址变成了www.hacker.com。所以,银行方就可以这么验证,每次请求都去验证下HTTP的referer字段,看是否是www.bank.com,如果是认为合法则受理请求,如果不是则拒绝。

二、服务端验证token信息

用户在提交请求的时候添加服务端返回的随机token信息,服务端判断这个token是否与自己提供的一致,若一致则视为合法请求,否则非法。添加的方式主要有两种:

  1. 往a链接上手动加上token参数,或在form表单中藏csrf值当用户提交的时候随之发送
<input name="csrf_token" type="hidden" value="abcdefg123">
  1. 通过 XMLHttpRequest 这个类,封装后可以给每次请求加上 csrf_token 。

总结和注意要点

以上所讲的方式各有优缺点,可以根据自己网站的已有情况自行选择。但要注意以下几点:

上一篇 下一篇

猜你喜欢

热点阅读