python 中的 csrf(xsrf: 在 tornado 中) 和 cors

csrf 跨站请求伪造

csrf( cross-site request forgery) 属于一种跨站攻击, 在 tornado 中被称为 xsrf
不一定是站内输入, 被伪造的请求可以使任何来源, 并非一定是站内输入

产生背景

前后端完全分离;
跨域资源共享;

核心

伪造服务器, 攻击正常访问网站的用户

解决策略

过滤请求的处理者
1. client 端提交表格是增加随机数 hash 值(用隐藏标签的方式提交), 在 server 端进行验证是否一致, 只有真正的 server 端拥有正确的 hash 值
2. 使用”认证令牌”, 身份认证从 cookies 变为 token
3. 增加验证码
4. 增加 http 中的 referer 标识, 来判断是同域还是跨域, 跨域是否是允许的

cors 跨域资源共享

cors (cross-origin resource sharing) 是 W3C 提出的一个标准, 如今是较为主流的解决跨域资源请求方案. [ IE8+都可以兼容 ]

产生背景

为了防止 csrf

»»»浏览器引入同源(同domain/ip, 同端口, 同协议)策略(sop)保证访问安全, 爱能互相获取资源

»»»前后端不能分离,不能操作 cookies, 不能发送 ajax等问题

提出服务器跨域 (使用反向代理 或 cors)

核心思想

通过一系列新增的 http 头信息来实现 server 和 client 之间的通信, 所以, 要支持 cors, server 端要做一些相应的配置, 这样, 在保证安全性的同事, 也方便了前端的开发

此时, 浏览器会将 cors 请求分为两类:
- 简单请求: HEAD GET POST
- 非简单请求: PUT DELETE OPTIONS
非简单请求会触发 cors preflight (预检请求)

触发预检请求也有其他情况:
- 传输的数据格式不是 application/x-www-form-urlencoded
- 操作 cookies

# 后端header配置(举例: tornado中)
    def set_default_headers(self):
        self.set_header("Access-Control-Allow-Origin", self.request.headers.get("Origin", "*"))  # 限定请求源
        self.set_header("Access-Control-Allow-Headers", "x-requested-with,authorization")  # 请求头
        self.set_header("Access-Control-Allow-Methods", "POST,GET")  # 限定合法的请求方式
        self.set_header("Access-Control-Allow-Credentials", "true")  # 证书
        self.set_header("Content-type", "application/json")  # 限定请求数据格式

参考和延伸:
tornado 的防 csrf
那些跨域
csrf & cors
跨域解决方案一: cors
cors简单请求和预检请求
post 中 content-type 的几种取值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值