当前位置:   article > 正文

django 安全_django在数据通信和传输过程中安全性

django在数据通信和传输过程中安全性

CSRF攻击

CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一。

CSRF攻击原理

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

防御CSRF攻击

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

前后端不分离场景

  1. settings.py配置django.middleware.csrf.CsrfViewMiddleware:
    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’
    ]

  2. 模版代码:

    或者是直接使用csrf_token标签,来自动生成一个带有csrf token的input标签:
    {% csrf_token %}

前后端分离场景

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

  1. 在cookie中传csrftoken(后台接口会在cookie中保存csrftoken)。
  2. 在form中添加csrfmiddlewaretoken,或者是在请求头中添加X-CSRFToken
    在这里插入图片描述
    在这里插入图片描述

XSS攻击

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

XSS攻击场景

比如A网站有一个发布帖子的入口,如果用户在提交数据的时候,提交了一段js代码比如:,然后A网站在渲染这个帖子的时候,直接把这个代码渲染了,那么这个代码就会执行,会在浏览器的窗口中弹出一个模态对话框来显示hello world!

XSS攻击防御

django模板转义

如果不需要显示一些富文本,那么在渲染用户提交的数据的时候,直接进行转义就可以了。
Django的模板中默认就是转义的,比如

 from django.template.defaultfilters import escape
 from .models import Comment
 from django.http import HttpResponse
 def comment(request):
     content = request.POST.get("content")
     # 通过escape转义后再存储到数据库中
     escaped_content = escape(content)
     Comment.objects.create(content=escaped_content)
     return HttpResponse
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/746619
推荐阅读
相关标签
  

闽ICP备14008679号