国内 网络安全沙箱

CSRF攻击

CSRF攻击概述:

CSRFCross Site Request Forgery跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一。其他安全隐患,比如 SQL 脚本注入跨站域脚本攻击等在近年来已经逐渐为众人熟知,很多网站也都针对他们进行了防御。然而,对于大多数人来说,CSRF 却依然是一个陌生的概念。即便是大名鼎鼎的 Gmail, 在 2007 年底也存在着 CSRF 漏洞,从而被黑客攻击而使 Gmail 的用户造成巨大的损失。

CSRF攻击原理:

网站是通过cookie来实现登录功能的。而cookie只要存在浏览器中,那么浏览器在访问这个cookie的服务器的时候,就会自动的携带cookie信息到服务器上去。那么这时候就存在一个漏洞了,如果你访问了一个别有用心或病毒网站,这个网站可以在网页源代码中插入js代码,使用js代码给其他服务器发送请求(比如ICBC的转账请求)。那么因为在发送请求的时候,浏览器会自动的把cookie发送给对应的服务器,这时候相应的服务器(比如ICBC网站),就不知道这个请求是伪造的,就被欺骗过去了。从而达到在用户不知情的情况下,给某个服务器发送了一个请求(比如转账)。

防御CSRF攻击:

CSRF攻击的要点就是在向服务器发送请求的时候,相应的cookie会自动的发送给对应的服务器。造成服务器不知道这个请求是用户发起的还是伪造的。这时候,可以在用户每次访问有表单的页面的时候,在网页源代码中加一个随机的字符串叫做csrf_token,在cookie中也加入一个相同值的csrf_token字符串。以后给服务器发送请求的时候,必须在body中以及cookie中都携带csrf_token,服务器只有检测到cookie中的csrf_tokenbody中的csrf_token都相同,才认为这个请求是正常的,否则就是伪造的。那么黑客就没办法伪造请求了。在Django中,如果想要防御CSRF攻击,应该做两步工作。第一个是在settings.MIDDLEWARE中添加CsrfMiddleware中间件。第二个是在模版代码中添加一个input标签,加载csrf_token。示例代码如下:

  1.  settings.py
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.middleware.gzip.GZipMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware'
]
    <input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}"/>
    • 1.

    或者是直接使用csrf_token标签,来自动生成一个带有csrf tokeninput标签:

    {% csrf_token %}
    • 1.

    使用ajax处理csrf防御:

    如果用ajax来处理csrf防御,那么需要手动的在form中添加csrfmiddlewaretoken,或者是在请求头中添加X-CSRFToken。可以从返回的cookie中提取csrf token,再设置进去。示例代码如下:

    function getCookie(name) {var cookieValue = null;if (document.cookie && document.cookie !== '') {var cookies = document.cookie.split(';');for (var i = 0; i < cookies.length; i++) {var cookie = jQuery.trim(cookies[i]);// Does this cookie string begin with the name we want?if (cookie.substring(0, name.length + 1) === (name + '=')) {cookieValue = decodeURIComponent(cookie.substring(name.length + 1));break;}}}return cookieValue;
    }var myajax = {'get': function (args) {args['method'] = 'get';this.ajax(args);},'post': function (args) {args['method'] = 'post';this._ajaxSetup();this.ajax(args);},'ajax': function (args) {$.ajax(args);},'_ajaxSetup': function () {$.ajaxSetup({beforeSend: function(xhr, settings) {if (!/^(GET|HEAD|OPTIONS|TRACE)$/.test(settings.type) && !this.crossDomain) {xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));}}});}
    };$(function () {$("#submit").click(function (event) {event.preventDefault();var email = $("input[name='email']").val();var money = $("input[name='money']").val();myajax.post({'url': '/transfer/','data':{'email': email,'money': money},'success': function (data) {console.log(data);},'fail': function (error) {console.log(error);}});})
    });

      iframe相关知识:

      1. iframe可以加载嵌入别的域名下的网页。也就是说可以发送跨域请求。比如可以在自己的网页中加载百度的网站,示例代码如下:
      <iframe src="http://www.baidu.com/">
      </ifrmae>
      • 1.
      • 2.
      1. 因为iframe加载的是别的域名下的网页。根据同源策略js只能操作属于本域名下的代码,因此js不能操作通过iframe加载来的DOM元素。
      2. 如果ifrmaesrc属性为空,那么就没有同源策略的限制,这时候就可以操作iframe下面的代码了。并且,如果src为空,那么可以在iframe中,给任何域名都可以发送请求。
      3. 直接在iframe中写html代码,浏览器是不会加载的。

      XSS攻击:

      XSSCross Site Script)攻击又叫做跨站脚本攻击。他的原理是用户在使用具有XSS漏洞的网站的时候,向这个网站提交一些恶意的代码,当用户在访问这个网站的某个页面的时候,这个恶意的代码就会被执行,从而来破坏网页的结构,获取用户的隐私信息等。

      XSS攻击场景:

      比如A网站有一个发布帖子的入口,如果用户在提交数据的时候,提交了一段js代码比如:<script>alert("hello world");</script>,然后A网站在渲染这个帖子的时候,直接把这个代码渲染了,那么这个代码就会执行,会在浏览器的窗口中弹出一个模态对话框来显示hello world!如果攻击者能成功的运行以上这么一段js代码,那他能做的事情就有很多很多了!

      XSS攻击防御:

      1. 如果不需要显示一些富文本,那么在渲染用户提交的数据的时候,直接进行转义就可以了。在Django的模板中默认就是转义的。也可以把数据在存储到数据库之前,就转义再存储进去,这样以后在渲染的时候,即使不转义也不会有安全问题,示例代码如下:
      from django.template.defaultfilters import escape
      from .models import Comment
      from django.http import HttpResponse
      def comment(request):content = request.POST.get("content")escaped_content = escape(content)Comment.objects.create(content=escaped_content)return HttpResponse('success')
        1. 如果对于用户提交上来的数据包含了一些富文本(比如:给字体换色,字体加粗等),那么这时候在渲染的时候也要以富文本的形式进行渲染,也即需要使用safe过滤器将其标记为安全的,这样才能显示出富文本样式。但是这样又会存在一个问题,如果用户提交上来的数据存在攻击的代码呢,那将其标记为安全的肯定是有问题的。示例代码如下:
        #views.py
        def index(request):message = "<span style='color:red;'>红色字体</span><script>alert('hello world');</script>";return render_template(request,'index.html',context={"message":message})

        那么这时候该怎么办呢?这时候可以指定某些标签是需要的(比如:span标签),而某些标签是不需要的(比如:script)那么在服务器处理数据的时候,就可以将这些需要的标签保留下来,把那些不需要的标签进行转义,或者干脆移除掉,这样就可以解决问题了。这个方法是可行的,包括很多线上网站也是这样做的,在Python中,有一个库可以专门用来处理这个事情,那就是sanitizer

        bleach库:

        bleach库是用来清理包含html格式字符串的库。他可以指定哪些标签需要保留,哪些标签是需要过滤掉的。也可以指定标签上哪些属性是可以保留,哪些属性是不需要的。想要使用这个库,可以通过以下命令进行安装:

        pip install bleach
        • 1.

        这个库最重要的一个方法是bleach.clean方法,bleach.clean示例代码如下:

        import bleach
        from bleach.sanitizer import ALLOWED_TAGS,ALLOWED_ATTRIBUTES@require_http_methods(['POST'])
        def message(request):# 从客户端中获取提交的数据content = request.POST.get('content')# 在默认的允许标签中添加img标签tags = ALLOWED_TAGS + ['img']# 在默认的允许属性中添加src属性attributes = {**ALLOWED_ATTRIBUTES,'img':['src']}# 对提交的数据进行过滤cleaned_content=bleach.clean(content,tags=tags,attributes=attributes)# 保存到数据库中Message.objects.create(content=cleaned_content)return redirect(reverse('index'))

        相关介绍如下:

        1. tags:表示允许哪些标签。
        2. attributes:表示标签中允许哪些属性。
        3. ALLOWED_TAGS:这个变量是bleach默认定义的一些标签。如果不符合要求,可以对其进行增加或者删除。
        4. ALLOWED_ATTRIBUTES:这个变量是bleach默认定义的一些属性。如果不符合要求,可以对其进行增加或者删除。

        clickjacking攻击:

        clickjacking攻击又称作点击劫持攻击。是一种在网页中将恶意代码等隐藏在看似无害的内容(如按钮)之下,并诱使用户点击的手段。

        clickjacking攻击场景:

        场景一:

        如用户收到一封包含一段视频的电子邮件,但其中的“播放”按钮并不会真正播放视频,而是链入一购物网站。这样当用户试图“播放视频”时,实际是被诱骗而进入了一个购物网站。

        场景二:

        用户进入到一个网页中,里面包含了一个非常有诱惑力的按钮A,但是这个按钮上面浮了一个透明的iframe标签,这个iframe标签加载了另外一个网页,并且将这个网页的某个按钮和原网页中的按钮A重合,所以你在点击按钮A的时候,实际上点的是通过iframe加载的另外一个网页的按钮。

        clickjacking防御:

        像以上场景1,是没有办法避免的,受伤害的是用户。而像场景2,受伤害的是百度贴吧网站和用户。这种场景是可以避免的,只要设置百度贴吧不允许使用iframe被加载到其他网页中,就可以避免这种行为了。可以通过在响应头中设置X-Frame-Options来设置这种操作。X-Frame-Options可以设置以下三个值:

        1. DENY:不让任何网页使用iframe加载这个页面。
        2. SAMEORIGIN:只允许在相同域名(也就是自己的网站)下使用iframe加载这个页面。
        3. ALLOW-FROM origin:允许任何网页通过iframe加载这个网页。
          Django中,使用中间件django.middleware.clickjacking.XFrameOptionsMiddleware可以堵上这个漏洞,这个中间件设置了X-Frame-OptionSAMEORIGIN,也就是只有在自己的网站下才可以使用iframe加载这个网页,这样就可以避免其他别有心机的网页去通过iframe去加载了。

        SQL注入:

        所谓SQL注入,就是通过把SQL命令插入到表单中或页面请求的查询字符串中,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。 比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符曝出的。

        场景:

        比如现在数据库中有一个front_user表,表结构如下:

        class User(models.Model):telephone = models.CharField(max_length=11)username = models.CharField(max_length=100)password = models.CharField(max_length=100)

        然后使用原生sql语句实现以下需求:

        1. 实现一个根据用户id获取用户详情的视图。示例代码如下:
        def index(request):user_id = request.GET.get('user_id')cursor = connection.cursor()cursor.execute("select id,username from front_user where id=%s" % user_id)rows = cursor.fetchall()for row in rows:print(row)return HttpResponse('success')

        这样表面上看起来没有问题。但是如果用户传的user_id是等于1 or 1=1,那么以上拼接后的sql语句为:

        select id,username from front_user where id=1 or 1=1
        • 1.

        以上sql语句的条件是id=1 or 1=1,只要id=1或者是1=1两个有一个成立,那么整个条件就成立。毫无疑问1=1是肯定成立的。因此执行完以上sql语句后,会将front_user表中所有的数据都提取出来。

        1. 实现一个根据用户的username提取用户的视图。示例代码如下:
        def index(request):username = request.GET.get('username')cursor = connection.cursor()cursor.execute("select id,username from front_user where username='%s'" % username)rows = cursor.fetchall()for row in rows:print(row)return HttpResponse('success')

        这样表面上看起来也没有问题。但是如果用户传的usernamezhouxin' or '1=1,那么以上拼接后的sql语句为:

        select id,username from front_user where username='zhiliao' or '1=1'

          以上sql语句的条件是username='zhouxin'或者是一个字符串,毫无疑问,字符串的判断是肯定成立的。因此会将front_user表中所有的数据都提取出来。

          sql注入防御:

          以上便是sql注入的原理。他通过传递一些恶意的参数来破坏原有的sql语句以便达到自己的目的。当然sql注入远远没有这么简单,现在的只是冰山一角。那么如何防御sql注入呢?归类起来主要有以下几点:

          1. 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等
          2. 永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。比如:
          def index(request):user_id = "1 or 1=1"cursor = connection.cursor()cursor.execute("select id,username from front_user where id=%s",(user_id,))rows = cursor.fetchall()for row in rows:print(row)return HttpResponse('success')
          1. 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
          2. 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
          3. 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。

          Django中如何防御sql注入:

          1. 使用ORM来做数据的增删改查。因为ORM使用的是参数化的形式执行sql语句的。
          2. 如果万一要执行原生sql语句,那么建议不要拼接sql,而是使用参数化的形式
          网络安全学习路线

          对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

          同时每个成长路线对应的板块都有配套的视频提供:

          需要网络安全学习路线和视频教程的可以在评论区留言哦~

          最后
          • 如果你确实想自学的话,我可以把我自己整理收藏的这些教程分享给你,里面不仅有web安全,还有渗透测试等等内容,包含电子书、面试题、pdf文档、视频以及相关的课件笔记,我都已经学过了,都可以免费分享给大家!

          给小伙伴们的意见是想清楚,自学网络安全没有捷径,相比而言系统的网络安全是最节省成本的方式,因为能够帮你节省大量的时间和精力成本。坚持住,既然已经走到这条路上,虽然前途看似困难重重,只要咬牙坚持,最终会收到你想要的效果。

          黑客工具&SRC技术文档&PDF书籍&web安全等(可分享)

          结语

          网络安全产业就像一个江湖,各色人等聚集。相对于欧美国家基础扎实(懂加密、会防护、能挖洞、擅工程)的众多名门正派,我国的人才更多的属于旁门左道(很多白帽子可能会不服气),因此在未来的人才培养和建设上,需要调整结构,鼓励更多的人去做“正向”的、结合“业务”与“数据”、“自动化”的“体系、建设”,才能解人才之渴,真正的为社会全面互联网化提供安全保障。

          特别声明:
          此教程为纯技术分享!本教程的目的决不是为那些怀有不良动机的人提供及技术支持!也不承担因为技术被滥用所产生的连带责任!本教程的目的在于最大限度地唤醒大家对网络安全的重视,并采取相应的安全措施,从而减少由网络安全而带来的经济损失

          本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/17747.html

          如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

          相关文章

          Web3 的虚实融合之路:从虚拟交互到元宇宙构建

          在这个数字技术日新月异的时代&#xff0c;我们正站在 Web3 的门槛上&#xff0c;见证着互联网的又一次革命。Web3 不仅仅是技术的迭代&#xff0c;它代表了一种全新的交互方式和价值创造模式。本文将探讨 Web3 如何推动虚拟交互的发展&#xff0c;并最终实现元宇宙的构建&…

          项目中菜单按照层级展示sql

          效果如图&#xff1a; 直接上脚本 查四级菜单 select EFT_FLAG,MENU_ID, CASE LEN(MENU_LVL)WHEN 4THEN MENU_NAME ELSE - END AS MENU_NAME1, CASE LEN(MENU_LVL)WHEN 8THEN MENU_NAME ELSE - END AS MENU_NAME2, CASE LEN(MENU_LVL)WHEN 12THEN MENU_NAME ELSE - END …

          Reasoning in High Gear 推理加速发展

          Reasoning in High Gear 推理加速发展 关键信息&#xff1a;OpenAI推出GPT - 3 - mini&#xff0c;它是GPT - 1模型后续版本&#xff0c;在速度、成本及特定领域能力上有显著优势。 模型特性 推理强度可选&#xff1a;提供低、中、高三个推理 “强度” 级别&#xff0c;不同级别…

          Linux驱动层学习:LED 驱动开发

          前置知识&#xff1a; 1、地址映射 MMU 全称叫做 Memory Manage Unit&#xff0c;也就是内存管理单元。 MMU 主要完成的功能如下&#xff1a; ①、完成虚拟空间到物理空间的映射。 ②、内存保护&#xff0c;设置存储器的访问权限&#xff0c;设置虚拟存储空间的缓冲特性。 第…

          数据挖掘智能Agent

          &#x1f917; CodeGenie - 智能编程助手 数据处理和分析对于数据分析工作人员来说&#xff0c;往往既复杂又令人头疼&#xff0c;需要耗费大量精力进行重复性工作。为了解决这一问题&#xff0c;我们开发了一款集成了自然语言处理和代码生成功能的智能编程助手——CodeGenie。…

          【C++】Vector容器

          为什么要学习vector&#xff1f; 1. 上一章分享了string&#xff0c;而string实际上是一个管理字符的顺序表。 2. 而除了字符以外&#xff0c;我们经常用到整形数组&#xff0c;所以我们需要针对其他类型数据的顺序表。 3. vector实际上也是一个顺序表&#xff0c;而且主要用来…

          国内 ChatGPT Plus/Pro 订阅教程

          1. 登录 chat.openai.com 依次点击 Login &#xff0c;输入邮箱和密码 2. 点击升级 Upgrade 登录自己的 OpenAI 帐户后&#xff0c;点击左下角的 Upgrade to Plus&#xff0c;在弹窗中选择 Upgrade plan。 如果升级入口无法点击&#xff0c;那就访问这个网址&#xff0c;htt…

          Winform禁止高分辨下缩放布局成功方法

          Windows自动缩放布局会导致窗体上的按钮和文本挤在一起根本看不清楚。 那么该如何解决呢&#xff1f; 具体操作步骤如下&#xff1a; 1、在项目属性上切换到【安全性】菜单&#xff0c;勾选【启用ClickOnce安全设置】&#xff0c;然后立刻取消勾选&#xff1b; 为了生成app.…

          数据结构——Makefile、算法、排序(2025.2.13)

          目录 一、Makefile 1.功能 2.基本语法和相关操作 &#xff08;1&#xff09;创建Makefile文件 &#xff08;2&#xff09;编译规则 &#xff08;3&#xff09;编译 &#xff08;4&#xff09;变量 ①系统变量 ②自定义变量 二、 算法 1.定义 2.算法的设计 &#xff…

          Xcode证书密钥导入

          证书干嘛用 渠道定期会给xcode证书&#xff0c;用来给ios打包用&#xff0c;证书里面有记录哪些设备可以打包进去。 怎么换证书 先更新密钥 在钥匙串访问中&#xff0c;选择系统。(选登录也行&#xff0c;反正两个都要导入就是了)。 mac中双击所有 .p12 后缀的密钥&#xff…

          span标签 鼠标移入提示框 el-tooltip element-ui

          <el-tooltip :content"item.value" placement"top"><span>{{ item.valueHidden }}</span></el-tooltip>

          [创业之路-300]:进一步理解货币与金钱, 货币与货币政策

          目录 一、货币 1.1 概述 1、货币的定义 2、货币的形态演变 3、货币的职能 4、货币的价值衡量 1.2 货币的分层 1、货币分层的目的与意义 2、货币分层的划分标准与层次 3、各国货币分层的实践 4、货币分层的影响与应用 1.3、M0、M1、M2变化对股市的影响 1、M0变化对…

          pnpm的使用

          pnpm的使用 1.安装和使用2.统一包管理工具下载依赖 1.安装和使用 pnpm:performant npm &#xff0c;意味“高性能的npm”。 pnpm由npm/yarn衍生而来,解决了npm/yarn内部潜在的bug,极大的优化了性能,扩展了使用场景。被誉为“最先进的包管理工具”。 pnpm安装指令: npm i -g p…

          vue+springboot+webtrc+websocket实现双人音视频通话会议

          前言 最近一些时间我有研究&#xff0c;如何实现一个视频会议功能&#xff0c;但是找了好多资料都不太理想&#xff0c;最终参考了一个文章 WebRTC实现双端音视频聊天&#xff08;Vue3 SpringBoot&#xff09; 只不过&#xff0c;它的实现效果里面只会播放本地的mp4视频文件&…

          nginx播放视频(auth_request鉴权)

          学习链接 Nginx通过auth_request结合Springboot实现静态文件下载鉴权 nginx搭建直播推流服务&推流拉流鉴权 步骤 1、安装nginx 这里nginx的版本是nginx-1.24.0 ./configure --with-http_ssl_module --with-stream --with-stream_ssl_module --with-http_auth_req…

          【论文笔记】ZeroGS:扩展Spann3R+GS+pose估计

          spann3r是利用dust3r做了增量式的点云重建&#xff0c;这里zeroGS在前者的基础上&#xff0c;进行了增量式的GS重建以及进行了pose的联合优化&#xff0c;这是一篇dust3r与GS结合的具有启发意义的工作。 abstract NeRF和3DGS是重建和渲染逼真图像的流行技术。然而&#xff0c;…

          Webpack相关优化总结

          在使用webpack时提供了各种配置&#xff0c;这里结合在业务中常用的配置汇总一下可以进行的一系列的webpack优化 缩小文件搜索范围 其原理是在构建时&#xff0c;会以用户配置的Entry为开始依次递归遍历每个Module&#xff0c;在遍历每个Module时会调用相应合适的Loader对原模…

          【操作系统】操作系统结构

          内核 什么是内核&#xff1f; 内核作为应用程序连接硬件设备的桥梁&#xff0c;使得应用程序只需关心与内核交互&#xff0c;不用关心硬件细节。 内核有哪些能力呢&#xff1f; 内核是怎么工作的&#xff1f; Linux 的设计 MultiTask SMP ELF ELF 的意思是可执行文件链接格式…

          【无线感知会议系列-22 】Vivisecting Mobility Management in 5G Cellular Networks

          这篇是发表在SIGCOMM上的一篇paper 研究方向国内一些移动应用APP厂商&#xff1a;比如抖音,腾讯可以借鉴一下&#xff0c;和终端 厂商联合开发&#xff0c;提高其QOE。 摘要 随着5G技术对多种无线电频段和不同部署模式&#xff08;例如独立组网&#xff08;SA&#xff09;与…

          【RAG落地利器】Weaviate、Milvus、Qdrant 和 Chroma 向量数据库对比

          什么是向量数据库? 向量数据库是一种将数据存储为高维向量的数据库&#xff0c;高维向量是特征或属性的数学表示。每个向量都有一定数量的维度&#xff0c;根据数据的复杂性和粒度&#xff0c;可以从数十到数千不等。 向量通常是通过对原始数据(如文本、图像、音频、视频等)…