当应用程序依赖无状态身份验证(使用HMAC之类的东西)时,是否有必要使用CSRF保护?
例:
我们有一个单页应用程序(否则我们必须在每个链接上附加令牌:<a href="...?token=xyz">...</a>.
用户使用身份验证自己POST /auth.成功验证后,服务器将返回一些令牌.
令牌将通过JavaScript存储在单页面应用程序内的某个变量中.
此令牌将用于访问受限制的URL,例如/admin.
令牌将始终在HTTP标头内传输.
没有Http Session,也没有Cookies.
据我所知,应该(?!)不可能使用跨站点攻击,因为浏览器不会存储令牌,因此它无法自动将其发送到服务器(这就是使用Cookies时会发生的情况/会议).
我错过了什么吗?
authentication csrf stateless csrf-protection single-page-application
我有一个rails应用程序,为iPhone应用程序提供一些api.我希望能够简单地在资源上发布,而无需考虑获取正确的csrf令牌.我尝试了一些我在stackoverflow中看到的方法,但似乎它们不再适用于rails 3.感谢您帮助我.
我的注册页面正确显示表单,表单中{{ csrf_field() }}存在CsrfToken().
表单HTML
<form class="form-horizontal registration-form" novalidate method="POST" action="{{ route('register') }}">
{{ csrf_field() }}
....
</form>
Run Code Online (Sandbox Code Playgroud)
我正在为用户使用内置身份验证.除路线和重定向外没有改变任何东西.
当我提交表单时(仅在重新加载之后),它表示由于不活动而页面已过期.请刷新并重试.错误.
我很想念一个非常小的东西.但不确定它是什么.有帮助吗?
更新
发现了这个问题.会话驱动程序设置为数组.将其更改为文件,错误现在消失了.但是如果我使用数组有什么问题?
我知道有关于Django Rest Framework的答案,但我无法找到解决问题的方法.
我有一个具有身份验证和一些功能的应用程序.我添加了一个新的应用程序,它使用Django Rest Framework.我想只在这个应用程序中使用该库.我也想发出POST请求,我总是收到这个回复:
{
"detail": "CSRF Failed: CSRF token missing or incorrect."
}
Run Code Online (Sandbox Code Playgroud)
我有以下代码:
# urls.py
from django.conf.urls import patterns, url
urlpatterns = patterns(
'api.views',
url(r'^object/$', views.Object.as_view()),
)
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from django.views.decorators.csrf import csrf_exempt
class Object(APIView):
@csrf_exempt
def post(self, request, format=None):
return Response({'received data': request.data})
Run Code Online (Sandbox Code Playgroud)
我想添加API而不影响当前的应用程序.所以我的问题是如何才能为此应用禁用CSRF?
此问题仅针对防止跨站点请求伪造攻击.
具体来说:通过Origin头(CORS)保护和通过CSRF令牌保护一样好吗?
例:
所以:
我知道,如果我们相信W3C规范在所有现代浏览器中都能正确实现,那么XHR就不可能实现这一点(参见例如跨源资源共享的安全性),至少不是这样(我们可以吗?)
但是其他类型的请求呢 - 例如表单提交?加载脚本/ img/...标签?或者页面可以用来(合法地)创建请求的任何其他方式?或者也许是一些已知的JS黑客攻击?
注意:我不是在谈论
配置Spring Security 3.2后,_csrf.token不会绑定请求或会话对象.
这是spring security配置:
<http pattern="/login.jsp" security="none"/>
<http>
<intercept-url pattern="/**" access="ROLE_USER"/>
<form-login login-page="/login.jsp"
authentication-failure-url="/login.jsp?error=1"
default-target-url="/index.jsp"/>
<logout/>
<csrf />
</http>
<authentication-manager>
<authentication-provider>
<user-service>
<user name="test" password="test" authorities="ROLE_USER/>
</user-service>
</authentication-provider>
</authentication-manager>
Run Code Online (Sandbox Code Playgroud)
login.jsp文件
<form name="f" action="${contextPath}/j_spring_security_check" method="post" >
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
<button id="ingresarButton"
name="submit"
type="submit"
class="right"
style="margin-right: 10px;">Ingresar</button>
<span>
<label for="usuario">Usuario :</label>
<input type="text" name="j_username" id="u" class="" value=''/>
</span>
<span>
<label for="clave">Contraseña :</label>
<input type="password"
name="j_password"
id="p"
class=""
onfocus="vc_psfocus = 1;"
value="">
</span>
</form>
Run Code Online (Sandbox Code Playgroud)
它呈现下一个HTML:
<input type="hidden" name="" …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我网站上的表单添加一些安全性.其中一种形式使用AJAX,另一种形式是直接的"联系我们"形式.我正在尝试添加CSRF令牌.我遇到的问题是令牌只在某些时候出现在HTML"值"中.剩下的时间,值是空的.这是我在AJAX表单上使用的代码:
PHP:
if (!isset($_SESSION)) {
session_start();
$_SESSION['formStarted'] = true;
}
if (!isset($_SESSION['token']))
{$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;
}
Run Code Online (Sandbox Code Playgroud)
HTML
<form>
//...
<input type="hidden" name="token" value="<?php echo $token; ?>" />
//...
</form>
Run Code Online (Sandbox Code Playgroud)
有什么建议?
帮助
\n失败原因给出:
\nOrigin checking failed - https://praktikum6.jhoncena.repl.co does not match any trusted origins.\nRun Code Online (Sandbox Code Playgroud)\n一般来说,当存在真正的跨站请求伪造时,或者当 Django\xe2\x80\x99s CSRF 机制未正确使用时,就会发生这种情况。对于 POST 表单,您需要确保:
\nYour browser is accepting cookies.\nThe view function passes a request to the template\xe2\x80\x99s render method.\nIn the template, there is a {% csrf_token %} template tag inside each POST form that targets an internal URL.\nIf you are not using CsrfViewMiddleware, then you must use csrf_protect on any views that use the csrf_token template tag, as well as those …Run Code Online (Sandbox Code Playgroud) 通常使用以下方法之一阻止跨站点请求伪造(CSRF):
我的想法是使用用户秘密,一个神秘但静态的表单ID和JavaScript来生成令牌.
<form method="POST" action="/someresource" id="7099879082361234103">
<input type="hidden" name="token" value="generateToken(...)">
...
</form>
Run Code Online (Sandbox Code Playgroud)
GET /usersecret/john_doe 由经过身份验证的用户从JavaScript中获取.OK 89070135420357234586534346这个秘密在概念上是静态的,但可以每天/每小时更改......以提高安全性.这是唯一保密的事情.generateToken(7099879082361234103, 89070135420357234586534346)这种方法有问题,尽管事实上没有JavaScript它不起作用吗?
附录:
csrf ×10
security ×3
django ×2
django-csrf ×2
php ×2
cors ×1
devise ×1
http ×1
javascript ×1
laravel ×1
laravel-5.5 ×1
python ×1
python-3.x ×1
rest ×1
session ×1
spring ×1
stateless ×1