所以我想知道在这里做什么...我正在从iOS调用我的Django服务器,并且我一直收到403错误(无效的CSRF令牌).我正在考虑实现一个函数,它将返回令牌(您需要登录才能访问该函数),然后将令牌添加到我的POST调用中.
现在......我不明白这样做有什么意义?如果我使用TastyPie并且所需的登录名是APIKey ...我应该免除csrf检查吗?
为了确保我理解正确...是每个用户会话生成的CSRF吗?因此,如果我不使用Cookie,CSRF是不是必要的?
人们通常如何在iOS上使用他们的Django服务器并进行此类POST调用?
谢谢!
我的网站有一个AJAX POST视图,可以从应用程序的任何页面调用(事件跟踪).此视图受CSRF保护.在某些情况下,未设置CSRF cookie,POST调用失败.
不用手动装饰都与意见@ensure_csrf_cookie,我想写作的我创建的强制Django的设置CSRF饼干上所有响应中间件.这种方法是否正确?它是否会造成我不知道的安全漏洞?
更新:这是中间件代码:
from django.middleware.csrf import get_token
class ForceCsrfCookieMiddleware(object):
def process_request(self, request):
get_token(request)
Run Code Online (Sandbox Code Playgroud) 我最近升级到Django 1.2.3,我的上传表格现在已经破了.每当我尝试上传时,都会收到"CSRF验证失败.请求中止".错误信息.
在阅读关于此主题的Django文档后,它指出我需要在模板中的HTML <form>中添加{%csrf_token%}模板标记.不幸的是,我<form>是通过JavaScript生成的(具体来说,是Panel上的ExtJs的"html"属性).
简而言之,<form>当我<form>没有包含在Django模板中时,如何向我添加所需的CSRF令牌标签?
这个问题比直接关于如何编码的问题更像是一种再保险.作为一个autodidact我没有很多可能性问专业人士这样的事情,所以我在这里尝试.
我已经阅读了django-docs(https://docs.djangoproject.com/en/1.3/ref/contrib/csrf/)中的文档以及该页面上的一些信息:http://cwe.mitre.org/top25 /#CWE-352
据我所知,django向用户提供了一个令牌(某种代码).为了验证它真的是他,他必须在下次提出请求时将其归还.谷歌的一些人发现,甚至可以通过ajax请求实现这一点,这就是为什么我们自1.2.6以来也有保护它们的新政策.CSRF是关于某人给我一些东西(坏的,危险的代码,腐败的文件或类似的东西)假装成其他人.
所以如果我有这样的代码:
@csrf_exempt
def grab(request):
"""
view to download an item
POST because it stores that a user has downloaded this item
"""
item_id = request.POST.get('item', None)
if not loop: return HttpResponseBadRequest('no item id provided')
item = Item.objects.get(pk=int(item_id))
Run Code Online (Sandbox Code Playgroud)
应该保存,因为在尝试将给定值转换为整数之前,我没有访问数据库或应用程序的任何部分.如果我对某人下载文件的记录错误(在这种情况下几乎没有),则没有太多损害.假设我会根据这个观点编写账单,CSRF豁免会有不同的想法(是吗?).
我也不明白为什么有人不能从用户那里窃取CSRF令牌并使用它来欺骗我(或用户).所以我对这个主题有一些疑问:
1)我的假设来自上面吗?
2)有人可以告诉我,有些不那么好的家伙可以使用上面的观点来做肮脏的伎俩(也可能是怎样),他们会是什么?
3)CSRF是中间人攻击的一个例子,它只与它有关,还是完全不同的东西?
4)有关这些危险的进一步阅读的任何有价值的链接?
也许其中一些问题听起来并不太明确,但我正试图克服这个问题.如果有人可以帮助我,我会很高兴.
作为cookie的初学者,CSRF和Django(使用1.4),从我可以看出它是如何工作的,请纠正我出错的地方......
以下适用于MIDDLEWARE_CLASSES元组中包含django.middleware.csrf.CsrfViewMiddleware的情况.
如果POST表单包含csrf_token标记,并且相关视图传递RequestContext给模板,请求页面意味着Django包含一个包含字母数字字符串的隐藏表单字段.Django还会向浏览器返回一个名称设置为的cookie,csrftoken并将值设置为相同的字母数字字符串.
收到表单提交时,Django会检查隐藏表单字段中的字母数字字符串值是否匹配以及从浏览器收到的csrftoken cookie.如果它们不匹配则发出403响应.
CSRF攻击可能以包含iframe的恶意网站的形式出现.iframe包含POST表单和一些JavaScript.表单的action属性指向我的Django站点.该表单旨在在我的站点上做一些讨厌的事情,并且在加载iframe时JS提交表单.
浏览器将csrftoken在表单提交的标题中包含cookie.但是,表单不会包含带有匹配的字母数字字符串的隐藏字段,因此返回403并且攻击失败.如果iframe JS试图访问cookie,以便创建正确的hiddden表单字段,浏览器将阻止它这样做.
它是否正确?
我正在实现一个API,它既可以使用API密钥,也可以使用CSRF令牌.目标是通过Web应用程序(受CSRF保护)或第三方应用程序(受API密钥保护)使用它.
基本上每个请求(都通过POST),我检查是否有API密钥.如果有一个有效的,那就好了.如果没有,我想回到验证CSRF.
我可以打电话来验证CSRF吗?视图本身是@csrf_exempt因为API密钥需要工作.
TLDR;如果客户端具有经过身份验证的会话,则我的 POST(到 DRF 端点)似乎仅受 CSRF 保护。这是错误的,并留下了登录CSRF攻击的应用程序选项。我怎样才能解决这个问题?
我开始为 ReactJS 前端构建 django rest 框架 API,我们希望通过 API 处理一切,包括身份验证。我们正在使用 SessionAuthentication。
如果我有一个经过身份验证的会话,那么 CSRF 完全按预期工作(当经过身份验证时,客户端应该设置一个 CSRF cookie,这需要与 POST 数据中的 csrfmiddlewaretoken 配对)。
但是,如果未通过身份验证,则似乎没有 POST 需要接受 CSRF 检查。包括已经创建的(基本)登录APIView。这使得该站点容易受到登录 CSRF漏洞的攻击。
有谁知道如何在未经身份验证的会话上强制执行 CSRF 检查?和/或 DRF 似乎如何绕过 CSRF 检查以进行登录?
下面是我的粗略设置...
设置.py:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
}
Run Code Online (Sandbox Code Playgroud)
视图.py:
class Login(APIView):
permission_classes = (permissions.AllowAny,)
@method_decorator(csrf_protect) # shouldn't be needed
def post(self, request, format=None):
user = authenticate(
request,
username=request.POST['username'],
password=request.POST['password'] …Run Code Online (Sandbox Code Playgroud) django csrf django-csrf csrf-protection django-rest-framework
我怎样才能jquery.post()在Django中使用该方法?
这就是我想要做的:
var postdata={
'username':$('#login-email').val(),
'password':$('#login-password').val()
}
$.post('/login/',postdata)
Run Code Online (Sandbox Code Playgroud)
我如何在django中保护CSRF?有没有办法将CSRF令牌添加到帖子数据?
我有一个单页angularjs应用程序利用JWT身份验证.因为JWT随每个请求一起发送,所以在我的表单中使用CSRF令牌似乎是多余的.为了禁用CSRF检查,我在settings.py中间件类中注释掉了'django.middleware.csrf.CsrfViewMiddleware'.一切正常.
但是,当我使用Django Admin面板时,使用CSRF.这似乎是合理的,因为JWT不保护管理页面.
当我登录Admin时,会设置一个包含CSRF令牌的cookie.当我在登录管理会话时尝试从我的angularjs应用程序POST到REST端点时,请求包含CSRF cookie,Django REST后端拒绝POST状态为403.如果我从浏览器设置中删除cookie并重新POST,它会按预期进行.
我可以将我的应用程序配置为不设置CSRF cookie,但是如果将应用程序配置为忽略CSRF cookie(如果它是由同一域上的另一个应用程序设置的话)?我不能保证令牌不会被其他东西设置,因为我不控制将在域上运行的所有应用程序.
我正在使用基于类的视图来扩展Django REST Framework中的视图集.我尝试通过使用csrf_exempt来装饰我的类来解决这个问题,但这似乎不起作用(仍然得到403响应).我可能做错了,还是有其他解决方案我错过了?
这是我对csrf_exempt的尝试:
class AccountList(generics.ListCreateAPIView):
serializer_class = serializers.AccountSerializer
def get_queryset(self):
return models.Account.objects.all()
@method_decorator(csrf_exempt)
def dispatch(self, *args, **kwargs):
return super(AccountList, self).dispatch(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud) 我被困在 Django 中,如果有人可以帮助我,我将不胜感激。
我需要一个第 3 方 API 的入口点。所以我创建了一个视图并用@csrf_exempt 装饰它
现在的问题是我无法访问我之前设置的任何会话变量。 编辑 - 我设置了多个会话变量,如用户电子邮件,以了解用户是否已登录。我能够在调用 3rd 方 API 之前使用会话。当第 3 方 API 发送响应时,他们不发送 CSRF 令牌,因此我从 csrf 中免除了该视图。收到有效回复后,我想更新我的数据库。为此,我需要知道我丢失的用户的电子邮件 ID,因为我不再拥有会话变量。
ppConfirmPaymentProcess是另一个处理由这个 3rd 方 API 发送的 POST 数据的函数。一切正常,csrf_exempt 也工作正常,但我无法request.session["foo"]处理此请求。有人可以帮忙吗?
@csrf_exempt
def ppConfirmPayment(request):
print(request.session, "=======================================")
for key, value in request.session.items():
print('{} => {}'.format(key, value))
return ppConfirmPaymentProcess(request)
Run Code Online (Sandbox Code Playgroud)