csrf

django(中间件)

梦想与她 提交于 2020-01-14 19:49:53
一、中间件 1.什么是中间件? 中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。说的直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。 2.使用范围 只要是全局相关的功能你都应该考虑使用django中间件来帮你完成   - 全局用户身份校验   - 全局用户访问频率校验   - 用户访问黑名单   - 用户访问白名单 3.django7个默认中间件 打开Django项目的Settings.py文件,看到下图的MIDDLEWARE配置项 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware

How browsers know what cookies to send to server when requesting?

帅比萌擦擦* 提交于 2020-01-14 09:32:51
问题 I know how the cookies work, just started to dig why Codeigniter does not store generated csrf token in SESSION, it just store in cookie. Concerned about security, I'v started to think about php setcookie() function params such as path and domain. And I have asked myself is it possible to set 'evil_cookie' with a path='/' and domain = 'www.goodsite.com' from another domain, from some 'www.evilsite.com'? And another question is, will 'evil_cookie' be sent to 'www.goodsite.com' when performing

csrf的中间件

余生长醉 提交于 2020-01-11 18:23:38
csrf的中间件 源码简略分析: def process_request(self, request): # 从cookies中获取csrf_token csrf_token = self._get_token(request) if csrf_token is not None: # Use same token next time. # 将csrf_token添加到request的头部信息中 request.META['CSRF_COOKIE'] = csrf_token def process_view(self, request, callback, callback_args, callback_kwargs): # csrf校验已经完成 if getattr(request, 'csrf_processing_done', False): return None # Wait until request.META["CSRF_COOKIE"] has been manipulated before # bailing out, so that get_token still works # 豁免 if getattr(callback, 'csrf_exempt', False): return None # Assume that anything not

csrf的中间件

谁都会走 提交于 2020-01-11 10:59:57
csrf的中间件 源码简略分析: def process_request(self, request): # 从cookies中获取csrf_token csrf_token = self._get_token(request) if csrf_token is not None: # Use same token next time. # 将csrf_token添加到request的头部信息中 request.META['CSRF_COOKIE'] = csrf_token def process_view(self, request, callback, callback_args, callback_kwargs): # csrf校验已经完成 if getattr(request, 'csrf_processing_done', False): return None # Wait until request.META["CSRF_COOKIE"] has been manipulated before # bailing out, so that get_token still works # 豁免 if getattr(callback, 'csrf_exempt', False): return None # Assume that anything not

CSRF Cookie not set when posting request with AngularJs - Django Backend

痴心易碎 提交于 2020-01-11 09:58:07
问题 I'm building a web app with angularjs and django and I'm submitting form via Ajax request. My problem is that when posting an Ajxa request with angular (ng-file-upload precisely) the csrfmiddlewaretoken expected by django is not set. From my lectures on angular documentation and other forums I ended up with the following configuration. In the config part of angular : $httpProvider.defaults.xsrfCookieName = 'csrftoken'; $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'; $httpProvider

laravel 5.1 auth csrf token mismatch

烈酒焚心 提交于 2020-01-11 07:56:33
问题 before make any judgment I read all the related questions related to my problem but none of them fixed it. so here's my problem when I use the authentication facility of laravel 5.1 and want to register a user the csrf token generate twice one when I requesting to show my register form and one when I post the form data to auth/register post route and this cause my to receive a csrf token mismatch exception. here's my register form markup <form method="POST" action="/auth/register" class="ui

Generating CSRF tokens for multiple forms on a single page

懵懂的女人 提交于 2020-01-11 04:39:05
问题 I am currently generating a CSRF token in my forms to prevent cross-site request forgery. It looks like: <form method="post" action="action.php"> <input type="hidden" id="security_token" name="security_token" value="gTt96phAcretR99rafEjepHebrEZadEdezadagaZ3gAS5es33WReJeZaMADU2AWr" /> ... </form> The problem is that I have multiple forms on a single page. Must I create a security token for each form so security_token_1 , security_token_2 , or can I simply instead of generating the security

CSRF攻击与防护讲解

十年热恋 提交于 2020-01-09 13:14:39
CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解: 攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。 如下:其中Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户。 CSRF攻击攻击原理及过程如下: 1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A; 2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A; 3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B; 4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A; 5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。 CSRF攻击实例 受害者 Bob 在银行有一笔存款,通过对银行的网站发送请求

yii2表单提交CSRF验证

对着背影说爱祢 提交于 2020-01-07 15:49:43
Yii2表单提交默认需要验证CSRF,如果CSRF验证不通过,则表单提交失败,解决方法如下: 第一种解决办法是关闭Csrf public $enableCsrfValidation = false; 第二种解决办法是在form表单中加入隐藏域(如果是高级版的name值分前后台区分) <input type="text" name="_csrf-frontend" value="<?= Yii::$app->request->csrfToken ?>" />(前台实例) 第三种解决办法是在AJAX中加入_csrf字段 var csrfToken = $('meta[name="csrf-token"]').attr("content"); $.ajax({ type: 'POST', url: url, data: {_csrf:csrfToken}, success: success, dataType: dataType }); Yii2表单提交默认需要验证CSRF,如果CSRF验证不通过,则表单提交失败,解决方法如下: 第一种解决办法是关闭Csrf public $enableCsrfValidation = false; 第二种解决办法是在form表单中加入隐藏域(如果是高级版的name值分前后台区分) <input type="text" name="_csrf

CSRF绕过后端Referer校验

巧了我就是萌 提交于 2020-01-07 15:47:55
CSRF绕过后端Referer校验分正常情况和不正常的情况,我们这里主要讨论开发在写校验referer程序时,不正常的情况下怎么进行绕过。 正常情况 正常的情况指服务器端校验Referer的代码没毛病,那么意味着前端是无法绕过的。 我之前考虑过的方案: JS修改Referer,失败; 请求恶意网页后,后端重新送包,问题是你怎么跨域拿Cookie,失败; 不正常的情况 不正常的情况指服务器端校验Referer的代码有漏洞,前端才能做到绕过,下面介绍几个可能会绕过Referer的案例; 添加无Referer标签 可以尝试无Referer标签,万一逻辑刚好没判断无Referer的情况呢; <meta name="referrer" content="never"> <html> <meta name="referrer" content="never"> <body> <script>history.pushState('', '', '/')</script> <!-- 实现浏览器页面不刷新修改url链接 --> <form action="http://www.baidu.com/setProfile" method="POST"> <input type="hidden" name="nickname" value="new22" /> <input type="hidden"