CSRF - 跨站请求伪造

CSRF 是什么?

CSRF (Cross Site Request Forgery)攻击,中文名:跨站请求伪造。其原理是攻击者构造网站后台某个功能接口的请求地址,诱导用户去点击或者用特殊方法让该请求地址自动加载。用户在登录状态下这个请求被服务端接收后会被误以为是用户合法的操作。对于 GET 形式的接口地址可轻易被攻击,对于 POST 形式的接口地址也不是百分百安全,攻击者可诱导用户进入带 Form 表单可用POST方式提交参数的页面。

方法

  1. 服务端在收到路由请求时,生成一个随机数,在渲染请求页面时把随机数埋入页面(一般埋入 form 表单内,)
  2. 服务端设置setCookie,把该随机数作为cookie或者session种入用户浏览器
  3. 当用户发送 GET 或者 POST 请求时带上_csrf_token参数(对于 Form 表单直接提交即可,因为会自动把当前表单内所有的 input 提交给后台,包括_csrf_token)
  4. 后台在接受到请求后解析请求的cookie获取_csrf_token的值,然后和用户请求提交的_csrf_token做个比较,如果相等表示请求是合法的。

session是什么?

我们知道,用浏览器打开一个网页,用到的是HTTP协议,而这个协议是无状态的。也就是说,这一次的请求和上一次的请求是没有任何关系的,互不相认。所以就会产生一个问题,比如我在购物的时候,在某页面浏览了商品,购买时跳转第二个页面,由于是无状态的,第二个请求无法获取第一个页面的商品信息。
这时候就需要用到session机制了。就是当访问一个页面时给浏览器创建一个独一无二的号码,也给同时创建的session赋予同样的号码。这样就可以在打开同一个网站的第二个页面时获取到第一个页面中session保留下来的信息。这个号码就是sessionID,session的ID号,独一无二。
cookies就是把session的ID放在cookie里面(因为cookie有临时的也有定时的,而临时的就是当浏览器什么时候关掉即消失,也就是说session本来就是当浏览器关闭即消失,所以用临时的cookie存放。)
cookies是存放在客户端本地,而session的数据是保存在服务器端。

示例代码

import requests

s = requests.session()  # 创建一个session会话,模拟浏览器功能
print(s.headers)
print(s.cookies)
url = 'http://xx.xx.xx.xx:9000/api/v1/login'
body = {
    'username': 'test',
    'password': '123'
}
re = s.post(url, json=body)
print(re.json())

# token
token = re.json()['token']
print('获取的token:%s' % token)

h = {'Authorization': 'Token %s' % token}
s.headers.update(h) # 更新到session会话
# 更新之后的头部
print(s.headers)

'''
=======================================================================================================================
{'User-Agent': 'python-requests/2.22.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
<RequestsCookieJar[]>
{'code': 0, 'msg': 'login success!', 'username': 'test', 'token': 'a1e27565bcbfa0a950f3b041a1e38bf0b9d2a45d'}
获取的token:a1e27565bcbfa0a950f3b041a1e38bf0b9d2a45d
{'User-Agent': 'python-requests/2.22.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Token a1e27565bcbfa0a950f3b041a1e38bf0b9d2a45d'}

'''

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值