Python Web 开发笔记(2)

登录流程及防止跨域伪造攻击

第 1 步

浏览器使用 POST 方法发送登录请求。

服务器收到浏览器发来的请求,Flask 框架在处理请求的时候,利用 Flask-WTF 插件生成一个随机的字符串,下图所示:

40 位 16 进制的随机字符串

这个就是 csrf_token 字段,它会经过 A 令牌生成器生成一个令牌塞到响应 body 的表单的隐藏域里。

第 2 步

每个请求都由一个单独的线程处理,这个线程会创建一个请求上下文对象,它有个 session 属性,属性值是类字典对象。

捎带脚,这个「 csrf_token 字段及其值」会作为「请求上下文对象的 session 属性值」的键值对,这个字典的键值对可能很多,例如 _id (它是根据 IP 地址和 USER_AGENT 生成的 128 位字符串)、_user_id 是用户存在数据库里的主键等等。

先瞎编一个字典:

然后有一个 B 令牌生成器将「请求对象的 session 属性值」作为参数调用令牌生成器的 dumps 方法,就生成了一个字符串,它就是 session

这个 session 字符串会被扔到响应对象的头部字典的 Set-Cookie 键中,粗略代码如下:

response.headers.add('Set-Cookie', b'session={}'.format(session))

响应对象传回浏览器,浏览器设置 Cookies 后,Cookies 键值对中就有了 session 字段。

额外说明:浏览器首次访问网站时,Flask Web 应用也会在响应对象中提供一个 session ,如果响应 body 有表单,也会在隐藏域中提供 csrf_token 。

第 3 步

浏览器再次发送了一个请求,假设是带表单的 POST 请求,修改用户信息之类的操作。

这个请求对象里就携带了 cookies 和表单,表单里有 csrf_token 的加密令牌。

服务器收到请求后,把表单隐藏域中的值拿出来使用 A 令牌生成器解密并赋值给一个变量,我们假设它是 c1 。

把 cookies 里的 session 字段的值拿出来,使用 B 令牌生成器解密得到字典:

然后从中拿出 csrf_token 字段的值跟 c1 比较,就可以判断这个请求了。

如果坏人使用「跨域伪造攻击」,可以得到用户浏览器上的 cookies ,也就得到了 session ,但它得不到表单隐藏域 csrf_token ,这个 csrf_token 跟 session 是一套。

防止 CSRF 跨域伪造攻击

  • 用户访问「某某银行」的网站,登录后,浏览器保存带有 session 的 Cookies

  • 而 csrf_token 呢,它作为一个 40 位的字符串,会被加密成一个更复杂的字符串

  • 这个字符串被放到响应对象的 body 中的表单的隐藏域里头,返回给浏览器

  • 也就是说只有包含表单的页面才有这个 csrf_token ,下图所示:

  • 现在攻击者诱导用户访问钓鱼网站,钓鱼网站获取用户的 Cookie
  • 然后自动使用 POST 方法访问地址,这个地址就是转账请求,这个请求会带上偷来的 Cookie
  • 虽然有偷来的 Cookie ,但没有表单的隐藏字段 csrf_token ,所以请求会失败
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342