标签: django-csrf

django csrf_token不打印隐藏的输入字段

我的views.py:

from django.core.context_processors import csrf
from django.views.decorators.csrf import csrf_protect
from django.http import *
from django.template import *
from django.shortcuts import *
# Create your views here.
@csrf_protect
def homepage(request):
        return render_to_response('index.html', {'files':os.listdir('/home/username/public_html/posters') })
@csrf_protect
def upload(request):
        return render_to_response('list.html', )
Run Code Online (Sandbox Code Playgroud)

在我的模板中index.html:

<html>
<body>
<h1> All uploaded posters: </h1>
<form action='/posters/upload' method= 'POST'>{%csrf_token%}
<input type='file' name= 'uploadfile'>Upload new poster <input type="submit" value = "Upload">
</form>
{%for file in files %}
<a href = 'http://servername/~username/posters/{{file}}'>{{file}}</a> <br />
{%endfor%}
</body> …
Run Code Online (Sandbox Code Playgroud)

python django csrf django-csrf

7
推荐指数
1
解决办法
4264
查看次数

管理面板的 Django CSRF 验证失败

我用一个应用程序、一个模型和一个管理面板开始了一个新的 Django 1.11 项目。在本地,一切正常。当我将它部署到 Amazon EC2 并尝试登录到管理面板时,我收到 403(CSRF 验证失败。请求中止。)。我在调试日志中看到了这一点:

[WARNING] 2017-05-21 11:23:52,142 csrf 14263 140377210439424 Forbidden (Referer checking failed - Referer is insecure while host is secure.): /admin/login/

我使用 Chrome 的网络实用程序检查了请求,我注意到在我的请求标头中我有:

Cookie:csrftoken=hFhzOJPMOhkNWWWfRtlMOEum9jXV8XXWnOtw3OwZm2En9JUqYRVq632xyZfwSpzU

在我的表单数据中,我有:

csrfmiddlewaretoken:RHNpPfOHhg42FZnXmn9PZgNm3bN40C41XQZm4kvUP1oCSMl8tLJthFlxsR5FK4GZ

这两个应该是一样的吧?根据我的理解,它们确实如此,但是当我在本地环境中尝试相同的方法时,我发现它们也不相同,但是在那里工作正常,并且我在响应标头中获得了与请求中发送的相同的令牌标题,所以我认为它们不需要完全相同?注意:我目前没有安全连接 (https),​​但会在修复此问题后进行处理。

我已经尝试/检查了以下内容:

我在 SO 上找到的其他答案提到您需要在表单本身中做一些事情,但这是来自 Django 框架的表单。

附加信息

我的 nginx 配置来自/etc/nginx/nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events …
Run Code Online (Sandbox Code Playgroud)

django csrf amazon-ec2 django-csrf

7
推荐指数
1
解决办法
2364
查看次数

让 Django、VUE、CORS 和 CSRF 与真实世界的例子一起工作

我真的被困住了。这就是我想要做的。

  1. 保持 CSRF 开启。- 请不要告诉我关掉它。
  2. 我有一个由 Django 和 Django Rest Framework 运行的 API 应用程序
  3. 我有一个由 Vue 运行的前端应用程序
  4. 我已经安装了 django-cors-headers 来管理 CORS

一切都很好本地化。一旦我将其投入生产,我就开始收到 CSRF 错误。这就是一切的运作方式。

我已经看到了从关闭 CSRF 到允许所有事情的所有答案。我想正确地做到这一点,而不仅仅是关闭和打开所有东西并最终导致安全漏洞。

所以,这就是我所拥有的。

已安装:django-cors-headers django-rest-framework drf-nested-routers ...等

我的 api 在 api.websitename.com 上运行,Vue.js 应用程序在 websitename.com 上运行。

GET 请求效果很好。OPTION 请求似乎有效。

任何有风险的请求都不起作用。

对于我的 CORS,我'corsheaders.middleware.CorsMiddleware',在其他MIDDLEWARE.

然后我的 CORS 设置是:

CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
    '*.websitename.com',
)
Run Code Online (Sandbox Code Playgroud)

我的 CSRF 设置是:

CSRF_TRUSTED_ORIGINS = [
    "api.websitename.com",
]
Run Code Online (Sandbox Code Playgroud)

无论我如何使用这些,最终都会出现 CSRF 令牌错误。

我已经尝试过在我的 Vue App.vue 文件中做这样的事情的方法:

mounted () {
  this.getCSRFToken() …
Run Code Online (Sandbox Code Playgroud)

django django-csrf django-rest-framework vue.js django-cors-headers

7
推荐指数
2
解决办法
4680
查看次数

带有jquery的CSRF和django 1.3中的$ .post

在django 1.3中,你现在必须使用csrf甚至是ajax.我使用jquery,现在我想将csrf标记添加到$ .post.我怎样才能做到这一点?我对jquery不是很熟练,所以对于一个很好的描述会很好.

这是一个评级应用程序,点击星标时发送帖子.我见过django文档,但不明白在我的情况下该怎么做.我的代码如下:

$(function() {  
            $("#avg").children().not(":input").hide();
            $("#rating-widget").children().not("select").hide();    

            $caption = $("<span/>");

            $("#avg").stars({captionEl: $caption});
            $("#rating-widget").stars({
                inputType: "select",
                cancelShow: false,
                captionEl: $caption,
                callback: function(ui, type, value){
-------------->     $.post($("#rating-widget").attr("action"), {score: value}, function(data){

                    });
                }
            });
               $caption.appendTo("#rating-widget");

});
Run Code Online (Sandbox Code Playgroud)

应该说javascript不在模板中,而是在静态文件中.最好将它放在模板中,以便我可以使用{{ csrf_token }}

提前致谢!

django jquery django-csrf

6
推荐指数
1
解决办法
7364
查看次数

CSRF验证失败,但仅限于IE9

我已经按照Django文档(使用Django 1.3)中的描述设置了CSRF .它适用于FF和Safari,但在IE9上我得到了

<div id="summary">
<h1>Forbidden <span>(403)</span></h1>
<p>CSRF verification failed. Request aborted.</p>
</div>
Run Code Online (Sandbox Code Playgroud)

在我发现的Ajax请求的响应头中

Set-Cookie  csrftoken=8db3637951243ffb591e6b2d6998ed03; expires=Fri, 14-Sep-2012 08:01:52 GMT; Max-Age=31449600; Path=/
Run Code Online (Sandbox Code Playgroud)

当它以普通形式使用时,它在IE9中工作(即不涉及Ajax).

我在nginx/1.1.2后面使用Django.

我在这里缺少什么提示?

django csrf django-csrf

6
推荐指数
1
解决办法
4799
查看次数

Django管理员提出CSRF验证失败

我已经启动了新的django项目并启用了管理员应用程序.我可以登录管理站点,但是当我尝试添加/更改站点或用户时,我正在获取

CSRF verification failed. Request aborted.
Reason given for failure:
CSRF token missing or incorrect.
Run Code Online (Sandbox Code Playgroud)

这就是我在settings.py中所拥有的:

TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)

MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
# Uncomment the next line for simple clickjacking protection:
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
)
Run Code Online (Sandbox Code Playgroud)

当我查看管理页面来源时,我看到了

<input type='hidden' name='csrfmiddlewaretoken' value='T9Mfk1LRXi5jPE2dh5jcvdKwzYM6Iy5I' />
Run Code Online (Sandbox Code Playgroud)

那里

我有Django版本1.4.1

python django csrf django-csrf

6
推荐指数
1
解决办法
6716
查看次数

为什么Selenium会导致CSRF 403?

我正在尝试使用Django和Selenium创建一个简单的登录测试,但由于CSRF失败而获得403.我期待中间件在GET请求上添加cookie,然后在POST上解析它.

这是我到目前为止检查的内容:

1. Cookie是否在GET请求中设置/accounts/login/

是的,cookie正在process_response方法中设置

2. Selenium驱动程序上是否提供cookie?

ipdb> self.selenium.get_cookies()
[{u'domain': u'localhost', u'name': u'csrftoken', u'value': u'DzNbEn9kZw0WZQ4OsRLouriFN5MOIQos', u'expiry': 1470691410, u'path': u'/', u'httpOnly': False, u'secure': True}]
Run Code Online (Sandbox Code Playgroud)

3.在POST请求期间是否找到了cookie?

不,这个尝试/除了django.middleware.CsrfViewMiddleware.process_view失败:

资源

try:
    csrf_token = _sanitize_token(
        request.COOKIES[settings.CSRF_COOKIE_NAME])
    # Use same token next time
    request.META['CSRF_COOKIE'] = csrf_token
except KeyError:
    csrf_token = None
    # Generate token and store it in the request, so it's
    # available to the view.
    request.META["CSRF_COOKIE"] = _get_new_csrf_key()
Run Code Online (Sandbox Code Playgroud)

class TestLogin(StaticLiveServerTestCase):

    @classmethod
    def setUpClass(cls):
        cls.selenium = getattr(webdriver, …
Run Code Online (Sandbox Code Playgroud)

django cookies selenium csrf django-csrf

6
推荐指数
1
解决办法
1629
查看次数

使用CSRF_COOKIE_HTTPONLY将Django CSRF令牌传递给Angular

在Django中,当CSRF_COOKIE_HTTPONLY设置设置为True时,CSRF cookie获得了httponly标志,这从安全角度来看是理想的,但是打破了将此cookie添加到httpProvider的标准角度解决方案,如下所示:

$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
Run Code Online (Sandbox Code Playgroud)

通过Django 1.9,有一个解决方法,你可以通过将它放在模板中直接将cookie传递给应用程序:

<script>
    window.csrf_token = "{{ csrf_token }}";
</script>
Run Code Online (Sandbox Code Playgroud)

把它放在角度应用程序中:

angularApp.config(["$httpProvider", function($httpProvider)e {
    $httpProvider.defaults.headers.common["X-CSRFToken"] = window.csrf_token;
}]
Run Code Online (Sandbox Code Playgroud)

不幸的是,这对于Django 1.10+中的单页角度应用程序不起作用,因为CSRF cookie在每次请求后都会更改.如何通过CSRF_COOKIE_HTTPONLY设置从Angular发送到Django 1.10+的帖子请求?
注意:禁用CSRF保护是不可接受的答案.

django cookies csrf django-csrf angularjs

6
推荐指数
1
解决办法
1127
查看次数

如何将Django的CSRF令牌添加到jQuery POST请求的标头中?

我正在尝试使用动态填充的字段创建Django表单:也就是说,当checkin_type从下拉菜单中选择一个字段()时,其他字段会自动填充相应的数据。为此,一旦选择了下拉选项,我想向服务器发送POST请求。

到目前为止,我已经尝试了以下模板(遵循https://docs.djangoproject.com/en/2.0/ref/csrf/):

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js"></script>
<script>
    $(document).ready(function(){
        var csrftoken = Cookies.get('csrftoken');

        $(".auto-submit").change(function() {
            $.post({
                url: "{% url 'get-checkin-type' %}",
                data: $(".auto-submit option:selected").val(),
                headers: {
                    X-CSRFToken: csrftoken
                }
            })
        });
    });
</script>


<form action="" method="post">{% csrf_token %}
    {% for field in form %}
        <div class="{% if field.name == 'checkin_type' %}auto-submit{% endif %}">
            {{ field.errors }}
            {{ field.label_tag }}
            {{ field }}
        </div>
    {% endfor %}
    <input type="submit" value="Send message" />
</form>
Run Code Online (Sandbox Code Playgroud)

但是,当我选择一个下拉选项时,

新增:17个未捕获的SyntaxError:意外令牌-

从该X-CSRFToken: csrftoken …

javascript django jquery django-csrf

6
推荐指数
1
解决办法
1876
查看次数

从 Vue.js 向 Django 发送 POST/DELETE 请求时禁止(未设置 CSRF cookie。)

一段时间以来,我一直在尝试从 Vue 前端向 Django 后端发送 POST 或 DELETE 请求。

我在 localhost:3000 上运行 Vue.js,在 localhost:8000 上运行 Django。我已经使用django-cors-headers设置了 CORS ,并且能够获取请求。但是,一旦我尝试删除或发布,就会收到此错误:

Forbidden (CSRF cookie not set.)

据我了解,我需要在请求标头中传递 CSRF 令牌,我有:

    deleteImage() {
      const url = this.serverURL + 'images/delete/' + this.image_data.pk;

      const options = {
        method: "DELETE",
        headers: {'X-CSRFToken': this.CSRFtoken}
      };
      fetch(url, options)
        .then(response => {
          console.log(response);
          if (response.ok){ 
            // if response is successful, do something
          }
        })
        .catch(error => console.error(error));
    }
Run Code Online (Sandbox Code Playgroud)

我从 GET 请求获取,如果我使用Django 文档this.CSRFtoken 中显示的方法,令牌是相同的。

我的姜戈settings.py看起来像这样:

rom …
Run Code Online (Sandbox Code Playgroud)

django django-csrf vue.js django-cors-headers csrf-token

6
推荐指数
1
解决办法
7930
查看次数