【问题标题】:CSRF token missing or incorrect on one page一页上的 CSRF 令牌丢失或不正确
【发布时间】:2013-07-30 04:42:21
【问题描述】:

在那里有一个主页,每个带有表单的页面都可以正常工作。
在我的起始页中添加了一个表单,在我的本地服务器中它工作正常。
但是当我将它添加到生产服务器时它不起作用。
它说 CSRF- 令牌丢失或不正确
但我已经添加了令牌,它适用于所有其他页面。

我错过了什么……?

查看

  @login_required
    def start(request) :
        libs = Library.objects.all();
        header = Header('Start');
        studies = None;
        source = None;
        if request.method == 'POST' :
            if 'Show_studie' in request.POST:
                studies = Study.objects.all;
            if 'Show_source' in request.POST:
                source = Source.objects.all;
        dctArgs = {
            'library_list': libs,
            'styles_dir': conf.styles_path,
            'header': header.html,
            'studies_list':studies,
            'source_list':source,
            'images_dir': conf.images_path,
            };
        return render_to_response('start.html', dctArgs, RequestContext(request));

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<HTML>
<HEAD>
<TITLE></TITLE>
<link rel="stylesheet" type="text/css" href="{{styles_dir}}/common.css" />
<link rel="stylesheet" type="text/css" href="{{styles_dir}}/header.css" />
<link rel="stylesheet" type="text/css" href="{{styles_dir}}/Headerstyles.css" />
</HEAD>
<BODY>
{{header|safe}}
<h1></h1>
<table id="doc_tbl" class="data" cellspacing=0>
<tr>
  <th>Name</th>
  <th>Documents</th>
  <th>Export</th>
</tr>
{% for library in library_list %}
    <tr>
    <td><a href="/library_overview/{{library.id}}/">{{library.name}}</a></td>
    <td>{{library.source_set.all|length}}</td>
    <td><a href="/library_export/{{library.id}}/format/TS/">Andra till Jesper Export</a></td>
    </tr>
{% endfor %}
</table>
<h3>Messages</h3>
{{messages}}
</br>
<form id="form1" name="form1" method="post" action="/start/" enctype="multipart/form-data">
{% csrf_token %}
<fieldset style="width:300px; margin-left:5px;">
<legend> Show all </legend>
<input type="checkbox" name="Show_studie" value="Show Studie"> Studie
<input type="checkbox" name="Show_source" value="Show Source"> Source
</br>
</br>
<input type="submit" value="Show All">
</fieldset>
{% if studies_list %}
<h3> Studies </h3>
<table class="table1">
<thead>
<tr>
  <th></th>
  <th scope="col1" >Name</th>
  <th scope="col1" >Added by</th>
</tr>
</thead>
{% for study in studies_list %}
<tbody>
<tr>
<td>
  <a href="/define_study/{{study.id}}/edit/"><img class="icon" src="{{images_dir}}/edit-icon.png"/></a>
  &nbsp;
  <img onclick="javascript:return confirmDelete_name('Are you sure? The study and any associated information will be deleted.', {{study.id}}, 'delete_study');" class="icon" src="{{images_dir}}/delete-icon.png"/>
</td>
<td><a href="/define_study/{{study.id}}/">{{study.name}}</a></td>
<td>{{study.metadata_added_by_user.first_name}}&nbsp;{{study.metadata_added_by_user.last_name}}</td>
</tr>
{% endfor %}
</table>
{% endif %}
{% if source_list %}
<h3> Source </h3>
<table class="table1">
<thead>
<tr>
  <th></th>
  <th scope="col1" >Name</th>
  <th scope="col1" >Added by</th>
</tr>
</thead>
{% for source in source_list %}
<tbody>
<tr>
<td>
  <a href="/define_study/{{study.id}}/edit/"><img class="icon" src="{{images_dir}}/edit-icon.png"/></a>
  &nbsp;
  <img onclick="javascript:return confirmDelete_name('Are you sure? The study and any associated information will be deleted.', {{study.id}}, 'delete_study');" class="icon" src="{{images_dir}}/delete-icon.png"/>
</td>
<td><a href="/define_study/{{study.id}}/">{{source.name}}</a></td>
<td>{{source.metadata_added_by_user.first_name}}&nbsp;{{source.metadata_added_by_user.last_name}}</td>
</tr>
{% endfor %}
{% endif %}
</tbody>
</table>
</form> 
</BODY>
</HTML>

禁止 (403) CSRF 验证失败。请求中止。 帮助 失败原因: CSRF 令牌丢失或不正确。

一般来说,当存在真正的跨站请求伪造时,或者 Django 的
CSRF 机制没有被正确使用。对于 POST 表单,您需要确保:
• 视图函数使用RequestContext 作为模板,而不是Context。
• 在模板中,每个 POST 表单内都有一个 {% csrf_token %} 模板标签,以内部 URL 为目标。
• 如果您没有使用 CsrfViewMiddleware,那么您必须在任何视图上使用 csrf_protect
使用 csrf_token 模板标签的,以及接受 POST 数据的。 您看到此页面的帮助部分是因为您的 Django 设置文件中有 DEBUG = True。将其更改为 False,将仅显示初始错误消息。
您可以使用 CSRF_FAILURE_VIEW 设置自定义此页面。

设置

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',
)

在工作的页面上我收到这条消息:

<django.contrib.messages.storage.fallback.FallbackStorage object at 0x03B7A270> 

【问题讨论】:

  • 向我们展示一些细节!
  • 除非我们看到您正在使用的代码,否则我们无法为您提供帮助。因此,请使用您的 views.py 和导致问题的模板更新问题。
  • CRSF 令牌适用于 cookie 和 HTTP 标头。您是否更改了网络浏览器?我们能否提供一些有关您的服务器和浏览器 cookie 政策以及您如何添加 CSRF 令牌的信息?
  • 您是否将 CSRF 中间件添加到您的站点?
  • 啊,这里是:return render_to_response('start.html', dctArgs, RequestContext(request));应该是return render_to_response('start.html', dctArgs, context_instance=RequestContext(request));

标签: django python-2.6


【解决方案1】:

尝试将您的视图包装在 @requires_csrf_token 装饰器中,如下所示:

from django.views.decorators.csrf import requires_csrf_token

@requires_csrf_token
@login_required
def start(request):
    ...

【讨论】:

  • 它现在适用于这个解决方案。感谢@Vasily Alexeev Knbk Inforian 和所有人的帮助。
【解决方案2】:

您可以使用 csrf_exempt 装饰器来禁用特定视图的 CSRF 保护。

from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def someview():
    ......

我知道这不是你想要的,但如果你愿意,你可以试试这个:)

【讨论】:

    猜你喜欢
    • 2021-07-14
    • 2011-12-26
    • 2014-03-29
    • 1970-01-01
    • 2014-12-25
    • 2021-01-16
    • 2014-02-26
    • 2021-10-01
    • 2021-11-13
    相关资源
    最近更新 更多