当前位置: 首页 > 网络应用技术

如何认证Djangocsrf(2023年的最新答案)

时间:2023-03-06 16:03:53 网络应用技术

  简介:许多朋友询问有关Djangocsrf的认证方式的问题。本文的首席CTO笔记将为您提供详细的答案,以供所有人参考。我希望这对每个人都会有所帮助!让我们一起看看!

  上次使用Django时,我遇到了这个问题。信息如下:Django请求在邮政请求上验证CSRF_TOKEN验证。后端将检测到从前端发出的令牌。当页面请求页面时,将其放置在后端。

  CSRF(跨站点请求forgey)是OWASP TOP10中排名第五的漏洞,该漏洞迫使认证的用户在Web系统上执行其坚定的操作。此攻击取决于以下内容:

  1)处理与Web浏览器相关的信息的方法(例如Cookie或HTTP认证信息)

  2)攻击者对正确的Web系统URL的理解;

  3)应用程序会话管理仅取决于浏览器所学的信息;

  4)一些HTML标签将导致直接访问HTTP资源。前三点是确认系统是否具有漏洞的主要先决条件,第四点用于帮助攻击者使用漏洞。

  点1:自动发送浏览器以确定用户会话的信息。假设网站是一个Web应用程序网站,受害者是已在系统上认证的用户。在服务器的响应中,网站将带有受害者状态的cookie发送给受害者。原则上,一旦浏览器收到服务器发送的cookie,该cookie将被带入网站的采访中;

  点2:如果应用程序不使用URL中的会话相关信息,则意味着应用程序的URL,其参数,可以识别相应的值。

  点3:它是指诸如Cookie或基于HTTP的身份验证信息,这些信息将包含在浏览器后面的每个请求中。

  在下面,我们使用GET方法来示例。如果用户通过了认证,请求数据下次将在请求数据中自动添加cookie

  获取请求通常会导致多个原因,

  *用户确实正在访问Web系统;

  *用户真的在访问地址栏中撞到了URL;

  *用户单击与URL的连接;

  这些呼叫对于系统来说是必不可少的。特别是,第三种方法相对危险。有很多方法可以使用它模仿连接的真实属性。该连接可以嵌入电子邮件中,也可以是恶意网站,看来此连接似乎正在访问另一个网站,但实际上它被Web系统访问所吸引。如果用户单击连接,因为它具有浏览器已由系统认证通过,将提交系统以提交身份验证信息的GET请求。这将完成系统上的操作(尽管此操作不是由用户本身完成的)。

  您需要在表单后面添加csrf_token。

  表单方法=“ post” {%csrf_token%}

  xxx

  /形式

  或修改DJANGO源代码:django/mideware/csrf.py proces_view

  在“#如果用户没有CSRF cookie”上添加以下代码:

  如果request.path.startswith('/admin'):

  返回接受()

  如果Django版本为1.2.5,则修改了修改:

  如果request.path.startswith('/admin'):

  返回self._accept(请求)

  这意味着请求URL是/admin,即使表格背后没有CSRF_Token,您也可以访问它。

  CSRF_Token在Django中编写表单时的作用:

  Django下的CSRF预防机制

  CSRF预防机制

  CSRF的防御可以从服务器和客户端启动。从服务到服务,防御效果更好。现在,一般的CSRF防御也可以在服务器上执行。

  令牌防御的总体想法是:

  步骤1:后端随机生成一个令牌,并将此令牌保存在会话状态。同时,后端将把这个令牌放在首页上。

  步骤2:当前端需要启动请求(例如发布)时,将此令牌添加到请求数据或头部信息中,然后将其传递到后端;

  步骤3:后端验证前端请求是否一致的令牌和会话是一致的;

  1. Django下的CSRF预防机制

  当Django首次响应客户端的请求时,将在服务器端随机生成一个令牌,并将其放置在cookie中。

  这可以避免受到CSRF的攻击。

  在Templete中,将{%CSRF_Token%}标记添加到每个帖子表单中。

  在HTTP响应的曲奇中,Django将为您添加一个CSRFTKOKN字段,该值是自动令牌令牌

  在所有帖子模板中,添加一个{%csrf_token%}标签,其功能是添加隐藏的输入标签以形式,如下所示

  而且此csrf_token = cookie.csrftoken,有上下文['csrf_token'] = request.cookies ['csrtoken']当呈现模板['csrtoken']时

  通过表单将帖子发送到服务器时,该表单包含隐藏在其上隐藏的输入项上的输入项。服务器收到它后,Django将在此请求中验证cookie中csrftkoken字段的值以及表单中的csrfmiddletken字段的值。如果是相同的,则表示这是法律请求,否则,此请求可能来自其他人的CSRF攻击,并退回403禁止。

  当通过AJAX向服务器发送帖子请求时,需要添加X-CSRFTOKEN标头。值是cookie中csrftoken的值。收到服务湍流后,Django将验证该请求中的CSRFTOKEN字段,并且AJAX邮政消息标题X-CSRFTKEN标头是相同的。如果相同,则表明这是法律请求

  具体实施方法

  Django已完成供用户完成伪造的交叉点请求,并通过django.middle.csrf.csrf.csrfviewmiddleware.for Django,反cross -cross -site请求伪造功能分为全球和本地。

  全球的:

  中间件django.middleware.csrf.csrfviewmiddleware

  当地的:

  @csrf_protect,即使在设置中没有全局中间件,也强行设置了当前功能的fake -cross -stoite请求。

  @csrf_exempt,即使设置中有全局中间件,取消当前功能抗-cross -Cross -site请求伪造功能。

  注意:来自django.views.decocotors.csrf导入csrf_exempt,csrf_protect

  1.原则

  将csrftoken添加到客户端页面,验证服务器,并由服务器验证的工作由'django.middleware.csrfviewmiddleware..csrfviewmiddleware..ine完成,这有两种捍卫Django中CSRF攻击的方法:

  1.以形式添加csrftoken

  2.将X-CSRFTKEN请求头添加到请求请求。

  注意:Django默认情况下对所有帖子请求进行了CSRFTKOOK验证。如果验证失败,则403错误等待。

  django套装在cookie中

  VUE发送职位403:CSRF失败:CSRF代币任务或不正确的解决方案:

  首先,让我们开始创建项目和应用程序。我还详细解释了如何详细创建项目和应用程序。

  创建数据库和授权用户。

  root@cd-ftp-vpn:/opt/jastme#树

  然后,然后

  | - jastme

  | - __init__.py

  || - __ Init __。pyc

  || - settings.py

  || - settings.pyc

  || - urls.py

  || - urls.pyc

  || -wsgi.py

  |`-wsgi.pyc

  | - 登录

  || - admin.py

  | - __init__.py

  || - __ Init __。pyc

  || -models.py

  || -models.pyc

  || - tests.py

  | - views.py

  |`-Views.pyc

  | - manage.py

  ` - start.sh

  2个目录,18个文件

  root@cd-ftp-vpn:/opt/jastme#

  使用python manage.py syncdb创建一个名为jastme的超级用户,密码为jastme。我们可以使用django-admin来管理这些用户。

  首先查看setter.py

  root@cd-ftp-vpn:/opt/jastme#更多jastme/settings.py

  ”“”

  Jastme项目的Django设置。

  有关此文件的更多信息,请参阅

  有关设置及其价值的完整列表,请参阅,请参阅

  ”“”

  #这样的项目内构建路径:OS.Path.join(base_dir,...)

  导入操作系统

  base_dir = os.path.dirname(os.path.dirname(__file__))

  #快速 - 启动开发设置 - 适用于生产

  # 看

  #安全警告:保留生产秘密中的秘密密钥使用!

  secret_key ='r!1 = i^3qhwglr(zf*9n*ii!b_oy2h()ICS(6(de3wuo0-oh8h')

  #安全警告:不要随着调试而运行!

  调试= true

  template_debug = true

  允许_host = []

  #应用程序定义

  instasted_apps =((

  #'django.contrib.admin',#Note Drop Admin

  'django.contrib.auth',

  'django.contrib.contenttypes',

  'django.contrib.sessions',

  'django.contrib.messages',

  'django.contrib.staticfiles',

  '登录',

  治愈

  mideware_classes =(

  'django.contrib.sessions.middleware.sessionmiddleware',

  'django.middleware.common.commonmiddleware',

  #'django.midderware.csrf.csrfviewmiddleware',#此中间件是为了防止交叉点攻击。启动朋友可以搜索。

  'django.contrib.auth.middle.authenticationmiddleware',,

  'django.contrib.auth.midderware.sessionauthenticationmiddleware',

  'django.contrib.messages.middle.messagemiddleware',,

  'django.middleware.clickjackinginginginginginginginginginging

  治愈

  root_urlconf ='jastme.urls'

  wsgi_application ='jastme.wsgi.application'

  #数据库

  #

  数据库= {#database相关配置

  '默认': {

  '引擎':'django.db.backends.mysql',

  “名字”:'jastme',

  “用户”:'jastme',

  “密码”:'jastme',

  “主持人”:“ localhost”,

  '端口':'3306',

  }

  }

  #国际化

  #

  lanking_code ='en-us'

  time_zone ='亚洲/上海'

  use_i18n = true

  use_l10n = true

  use_tz = true

  #静态文件(CSS,JavaScript,图像)

  #

  static_url ='/static/'

  Template_dirs =(#模板的路径

  '/var/www/jastme/',

  治愈

  Views.py

  root@cd-ftp-vpn:/opt/jastme#更多登录/views.py

  从django.shortcuts导入渲染

  来自django.contrib导入auth

  #在这里创建您的视图。

  来自django.shortcuts导入render_to_response

  来自django.contrib.auth导入验证,登录,登录

  来自django.template.loader import_template

  来自django.template导入上下文

  从django.http导入httpresponse,httpresponsedirect

  来自django.contrib.auth.decorators导入login_required

  def my_login(请求):#we自定义一个函数。此函数名称不得将其写入登录名,因为Django具有登录模块。

  如果request.method =='post':#我们使用帖子方法获取从html传递的表单内容

  用户名= request.post ['用户名'] #get帐户和密码

  密码= request.post ['密码']

  user = authenticate(用户名=用户名,密码=密码)#我们使用用户实例化身份验证(用户名=用户名,密码=密码)

  如果使用者不是没有:#username不是空的

  如果user.is_active:#is激活用户

  登录(请求,用户)#call django.contrib.auth中的登录函数,您可以专门查看源代码

  返回httpresponseredirect('/main')#

  别的:

  login_error ='登录错误。

  返回render_to_response('login.html',{'login_error':login_error,'is_display':'display:block'})

  返回render_to_response('login.html',{'is_display':'display:none''})##

  @login_required #call此修饰符,因此仅在成功着陆后才能访问此页面

  def main(请求):

  返回httpresponse('login sucess')#直接返回此字符串

  再次查看urls.py

  root@cd-ftp-vpn:/opt/jastme#更多jastme/urls.py

  来自django.conf.urls导入模式,包括URL

  #from django.contrib导入管理员

  从login.views导入my_login,main#here是views.py在我们导入的项目中的模块,这是我们自己写的函数

  #from Django.contrib.auth.views导入登录,注销,注销

  urlpatterns =模式('',,

  # 例子:

  #url(r'^$','jastme.views.home',name ='home'),

  #url(r'^blog/',include('blog.urls'),),

  #url(r'^admin/',infulude(admin.site.urls)),

  (r'^main/$',main),

  (r'^login/$',my_login),

  治愈

  login.html

  root@cd-ftp-vpn:/var/www/jastme#pwd

  /var/www/jastme

  root@cd-ftp-vpn:/var/www/jastme#ls

  login.html

  form action =“” method =“ post”#在此页面上,在帖子中提交参数

  输入类型=文本名称=“用户名”

  输入类型=文本名称=“密码”

  输入类型=提交值=“发送”

  /形式

  结论:以上是CTO首席执行官注释为所有人编写的Djangocsrf如何编写的相关内容的摘要。希望它对您有所帮助!如果您解决了问题,请与更多关心此问题的朋友分享?