csrf攻击与防护—2用flask简单演示防范csrf攻击之referer

接上篇
csrf攻击与防护—1用flask简单演示csrf攻击

以下是根据referer字段防止csrf攻击的新代码:
bank.py

import uuid
from flask import render_template, Flask, request, jsonify, make_response

app = Flask("haha")
YOUR_BANK_ACOUNT = 1000000000
ID = str(uuid.uuid1())


@app.route("/")
def root():
    response = make_response(render_template("bank_page.html"))
    response.set_cookie("id", ID)
    return response


@app.route("/quit")
def quit():
    response = make_response("退出成功!")
    response.delete_cookie("id")
    return response


@app.route("/transfer_money")
def form():
    # 简单验证cookie
    if ID != request.cookies.get("id"):
        print("cookie验证失败!可能正遭受攻击!")
        return jsonify({"status": "Fail"})

    # 防止csrf攻击手段1 -- refer验证
    refer = request.headers.environ.get("HTTP_REFERER")
    if refer != "http://127.0.0.1:8082/":
        print("refer验证失败!可能正遭受攻击!")
        return jsonify({"status": "Fail"})

    global YOUR_BANK_ACOUNT
    cash = int(request.values.get("money"))
    YOUR_BANK_ACOUNT -= cash
    print(f"Transfer {cash} yuan, YOUR_BANK_COUNT left {YOUR_BANK_ACOUNT}")
    return jsonify({"status": "OK"})


if __name__ == "__main__":
    app.run(port=8082)

referer 验证

根据HTTP协议,在http请求头中包含一个referer的字段,这个字段记录了该http请求的原地址.通常情况下,执行转账操作的post请求http://127.0.0.1:8082/transfer_money应该是点击http://127.0.0.1:8082/网页的提交按钮来触发的操作,这个时候转账请求的referer应该是http://127.0.0.1:8082/ 。而如果黑客要进行csrf攻击,只能在自己的网站http://127.0.0.1:8083/上伪造请求.伪造请求的referer是http://127.0.0.1:8083/。所以我们通过对比post请求的referer是不是http://127.0.0.1:8082/就可以判断请求是否合法.

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

每个浏览器对于 Referer 的具体实现可能有差别,并不能保证浏览器自身没有安全漏洞。使用验证 Referer 值的方法,就是把安全性都依赖于第三方(即浏览器)来保障,从理论上来讲,这样并不安全。事实上,对于某些浏览器,比如 IE6 或 FF2,目前已经有一些方法可以篡改 Referer 值。如果 bank.example 网站支持 IE6 浏览器,黑客完全可以把用户浏览器的 Referer 值设为以 bank.example 域名开头的地址,这样就可以通过验证,从而进行 CSRF 攻击。

即便是使用最新的浏览器,黑客无法篡改 Referer 值,这种方法仍然有问题。因为 Referer 值会记录下用户的访问来源,有些用户认为这样会侵犯到他们自己的隐私权,特别是有些组织担心 Referer 值会把组织内网中的某些信息泄露到外网中。因此,用户自己可以设置浏览器使其在发送请求时不再提供 Referer。当他们正常访问银行网站时,网站会因为请求没有 Referer 值而认为是 CSRF 攻击,拒绝合法用户的访问

csrf攻击与防护—3用flask简单演示防范csrf攻击之token验证

原文参考:
CSRF攻击原理及预防手段
安全篇——如何预防CSRF攻击

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值