0

0

有关对同源策略和csrf安全策略的知识点讲解

巴扎黑

巴扎黑

发布时间:2017-07-23 14:27:37

|

1798人浏览过

|

来源于php中文网

原创

虽然做web开发有一段时间了,但是对于同源策略和csrf安全策略理解一直不深刻,特抽出时间做了简单的实验进行理解。实验过程如下,与大家一起分享。

 

实验目的:验证同源策略和csrf安全策略的关系和区别

实验方案:1.Linux搭建django框架的python服务器(a);Windows搭建简单的js服务器(b)
                 2.b的首页中做了如下内容:(1)通过post\get方式提交向a表单
                                                             (2)通过ajax方式(post\get)向a请求数据

实验结果:1.a没有开启csrf安全策略的情况下,打开b的首页,b的页面可以通过post\get方式正常的向a提交表单并得到回复页面;但是通过ajax的get\post方式无法请求到a的数据。观察a的log日志,发现b的request请求在a上能够收到,但是b的request附带的数据均加载不成功,b的ajax(get\post)请求均能得到a的response,在下发到打开b的浏览器时报出了同源策略的警告。
 2.a开启csrf安全策略的情况下,打开b的首页,b的页面可以通过get方式正常的向a提交表单并得到回复页面,但是并不能通过post方式提交;b页面通过ajax的get\post方式均无法请求到a的数据。

萝卜简历
萝卜简历

免费在线AI简历制作工具,帮助求职者轻松完成简历制作。

下载

结论:1.同源策略:js语言的设计安全考虑,只允许同源访问。非同源访问也能向对应服务器发送请求,但是浏览器request中附带的数据全部丢失,服务器能回传request的response。但是在浏览器解析服务器下发的response阶段会有同源策略的警告。(解释基于js的ajax技术)
     2.csrf安全策略:搭建服务器时的安全考虑,需要普通开发者进行相关的设计(框架一般自带csrf安全策略的设计)。csrf策略过程为:在请求服务器的页面时,服务器的response会向浏览器设置一个cookie,当有post方式的表单向服务器提交时,服务器设置的cookie会附加在浏览器的request中一起提交,服务器在接收request时,会验证附加的cookie是否正确(每个用户与服务器的通讯连接只有一个唯一的cookie,连接中断后,下次连接时服务器会向浏览器设置新的cookie),只有cookie验证通过才能下发正确的response,验证失败会有“403”错误码下发。

 

  1 # --------------Django服务器部分代码--------------  2 # -*- coding:utf-8 -*-  3 from django.shortcuts import render  4 from django.http import HttpResponse, HttpResponseRedirect, JsonResponse  5   6 # Create your views here.  7   8   9 def index(request): 10  11     context = {'contents': 'hello world'} 12     # return HttpResponse("ok") 13     response= render(request, 'booktest/index.html', context) 14     return response 15  16  17 def args(request, id1, id2): 18  19     string = '%s--%s' % (id1, id2) 20     return HttpResponse(string) 21  22  23 def get1(request): 24  25     mode = request.encoding 26     dict = request.GET 27     a = dict.get('a') 28     b = dict.get('b') 29     c = dict.get('c') 30     string = 'method:%s--%s--%s--%s' % (mode, a, b, c) 31     return HttpResponse(string) 32  33  34 def get2(request): 35  36     dict = request.GET 37     a = dict.getlist('a') 38     b = dict.get('b') 39     c = dict.get('c') 40     d = dict.get('d', 'have no') 41     string = '%s--%s--%s--%s' % (a, b, c, d) 42     return HttpResponse(string) 43  44  45 def post(requst): 46  47     str_data = '---%s---%s' % (requst.method, requst.POST.get('uname')) 48  49     return HttpResponse(str_data) 50  51  52 def get3(request): 53  54     dict = request.GET 55     a = dict.get('a') 56     b = dict.get('b') 57     c = dict.get('c') 58     context = {'1': a, '2': b, '3': c} 59     # return HttpResponse("ok") 60     return HttpResponse(context) 61     # return render(request, 'booktest/get1.html', context) 62  63  64 def get4(request): 65  66     return HttpResponseRedirect('/admin/') 67  68  69 def ajax(request): 70  71     # return HttpResponse('ok') 72     return render(request, 'booktest/ajax.html/') 73  74  75 def json(request): 76  77     data1 = request.POST.get('csrfmiddlewaretoken') 78     data2 = request.POST.get('data') 79     print('------------%s------------%s---' % (data1, data2)) 80     a = {'h1': 'hello', 'h2': 'world', 'method': request.method, 'csrf': data1, 'data': data2} 81  82     return JsonResponse(a) 83  84  85 def cookie_set(request): 86     print('123') 87     cookie_value = 'hello' 88  89     response = HttpResponse("

设置Cookie,请查看响应报文头

") 90 # response = HttpResponse("hello") 91 # Cookie中设置汉字键值对失败 92 response.set_cookie('h1', cookie_value) 93 # return HttpResponse('ok') 94 return response 95 96 97 def cookie_get(request): 98 99 response = HttpResponse('

读取Cookie,数据如下:
')100 cookies = request.COOKIES101 if cookies.get('h1'):102 response.write('

'+cookies['h1']+'

')103 104 return response
 1 <--Django服务器template部分的index.html代码--> 2  3  4  5  6      7     index 8  9 10 {#    #}11     返回主页12 13     
14

参数

15 get一键传一值16
17 get一键传多值18

19
20 21 {% csrf_token %}22 23 姓名:
24 密码:
25 性别:男26
27 爱好:胸口碎大石28 脚踩电灯炮29 口吐火
30 31
32 33
34

GET属性

35 一键传一值36
37 一键传多值38 39
40

JsonResponse

41 ajax42 43
44

Cookie

45 设置Cookie46
47 获取Cookie48 49
 1 <--Django服务器ajax.html代码--> 2  3  4  5  6      7     ajax 8  9 10 25 26 27     
hello world!
28 {% csrf_token %}29 30
    31 32
     1 <--JS搭建的服务器首页代码--> 2  3  4  5  6      7     index 8      9     10     11     26     27     28 29 30 {#    #}31     返回主页32 33     
    34

    参数

    35 get一键传一值36
    37 get一键传多值38

    39
    40 41 {% csrf_token %}42 43 姓名:
    44 密码:
    45 性别:男46
    47 爱好:胸口碎大石48 脚踩电灯炮49 口吐火
    50 51
    52 53
    54

    GET属性

    55 一键传一值56
    57 一键传多值58 59
    60

    JsonResponse

    61 ajax62 63
    64

    Cookie

    65 设置Cookie66
    67 获取Cookie68 69
    70
    hello world!
    71 {% csrf_token %}72 73
      74 75

       

      相关专题

      更多
      C++ 高级模板编程与元编程
      C++ 高级模板编程与元编程

      本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

      10

      2026.01.23

      php远程文件教程合集
      php远程文件教程合集

      本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

      29

      2026.01.22

      PHP后端开发相关内容汇总
      PHP后端开发相关内容汇总

      本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

      21

      2026.01.22

      php会话教程合集
      php会话教程合集

      本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

      21

      2026.01.22

      宝塔PHP8.4相关教程汇总
      宝塔PHP8.4相关教程汇总

      本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

      13

      2026.01.22

      PHP特殊符号教程合集
      PHP特殊符号教程合集

      本专题整合了PHP特殊符号相关处理方法,阅读专题下面的文章了解更多详细内容。

      11

      2026.01.22

      PHP探针相关教程合集
      PHP探针相关教程合集

      本专题整合了PHP探针相关教程,阅读专题下面的文章了解更多详细内容。

      8

      2026.01.22

      菜鸟裹裹入口以及教程汇总
      菜鸟裹裹入口以及教程汇总

      本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

      55

      2026.01.22

      Golang 性能分析与pprof调优实战
      Golang 性能分析与pprof调优实战

      本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

      9

      2026.01.22

      热门下载

      更多
      网站特效
      /
      网站源码
      /
      网站素材
      /
      前端模板

      精品课程

      更多
      相关推荐
      /
      热门推荐
      /
      最新课程
      Rust 教程
      Rust 教程

      共28课时 | 4.7万人学习

      JavaScript
      JavaScript

      共185课时 | 20万人学习

      【web前端】Node.js快速入门
      【web前端】Node.js快速入门

      共16课时 | 2万人学习

      关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
      php中文网:公益在线php培训,帮助PHP学习者快速成长!
      关注服务号 技术交流群
      PHP中文网订阅号
      每天精选资源文章推送

      Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号