mar*_*rue 10 django csrf django-csrf csrf-protection
这个问题比直接关于如何编码的问题更像是一种再保险.作为一个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)有关这些危险的进一步阅读的任何有价值的链接?
也许其中一些问题听起来并不太明确,但我正试图克服这个问题.如果有人可以帮助我,我会很高兴.
CSRF攻击是强制受害者浏览器发送伪造请求.为GET和POST方法执行此操作的简单<img>或自动提交的<form>足够用户.当请求由浏览器发送时,它会发送任何身份验证凭据,从而使请求看起来真实合法,从服务器的角度来看,因为它们基本上与用户操作发起的请求不同.
这正是CSRF令牌的用途:确定用户发起的请求与第三方站点伪造的请求之间的差异.为此,CSRF令牌充当仅供服务器和用户所知的秘密.服务器将文档中的秘密放入响应中,并期望在下一个请求中将其发回.
由于秘密嵌入在为特定用户分配的响应文档中,因此攻击者需要窃听特定响应或以其他方式访问文档.当然有攻击获得CSRF令牌(例如窃听,MITM,XSS等).但是,如果您受到这些攻击的保护,攻击者将无法伪造真实的请求.
CSRF攻击
我诱骗你查看一个网页,在那里我插入了一些代码(一个请求,通常是通过img或form)到另一个网站(你可能有一些权利).
无害的例子
<img src="http://www.yoursite.net/changelanguage?lang=fr">
Run Code Online (Sandbox Code Playgroud)
我残酷地将你的会话语言改为法语.哦,不!您可以安全地删除csrf保护并保存数据库命中.
危险的例子
<img src="http://www.yourbank.net/sendmoney?amt=9999&account=123>
Run Code Online (Sandbox Code Playgroud)
如果您在yourbank.net登录(并且没有csrf或任何其他保护),那么您的帐户现在应该感觉更轻松.(我是123.)
<img src="http://www.yoursite.net/admin/users/123/edit?admin=1">
Run Code Online (Sandbox Code Playgroud)
如果您以管理员身份登录yoursite.net,那么我们都是.(我是123.)