标签: csrf

使用无状态(=无会话)身份验证时,CSRF令牌是否必要?

当应用程序依赖无状态身份验证(使用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

114
推荐指数
2
解决办法
5万
查看次数

在rails 3中关闭CSRF令牌

我有一个rails应用程序,为i​​Phone应用程序提供一些api.我希望能够简单地在资源上发布,而无需考虑获取正确的csrf令牌.我尝试了一些我在stackoverflow中看到的方法,但似乎它们不再适用于rails 3.感谢您帮助我.

csrf ruby-on-rails-3

98
推荐指数
3
解决办法
6万
查看次数

"由于不活动,该页面已过期" - Laravel 5.5

我的注册页面正确显示表单,表单中{{ 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)

我正在为用户使用内置身份验证.除路线和重定向外没有改变任何东西.

当我提交表单时(仅在重新加载之后),它表示由于不活动而页面已过期.请刷新并重试.错误.

我很想念一个非常小的东西.但不确定它是什么.有帮助吗?

更新

发现了这个问题.会话驱动程序设置为数组.将其更改为文件,错误现在消失了.但是如果我使用数组有什么问题?

php csrf laravel laravel-5.5

96
推荐指数
5
解决办法
14万
查看次数

Django Rest Framework删除csrf

我知道有关于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?

django csrf django-csrf django-rest-framework

95
推荐指数
8
解决办法
6万
查看次数

使用CORS Origin头与CSRF令牌进行CSRF保护

此问题仅针对防止跨站点请求伪造攻击.

具体来说:通过Origin头(CORS)保护和通过CSRF令牌保护一样好吗?

例:

所以:

  • 如果我们不检查Origin头(服务器端),并且没有CSRF令牌,我们就有一个CSRF安全漏洞.
  • 如果我们检查一个CSRF令牌,我们是安全的(但它有点乏味).
  • 如果我们检查Origin标头,应该阻止来自evil.com的客户端代码的请求,就像使用CSRF令牌时一样 - 除非,如果有可能的话,evil.com的代码可以设置Origin标头.

我知道,如果我们相信W3C规范在所有现代浏览器中都能正确实现,那么XHR就不可能实现这一点(参见例如跨源资源共享的安全性),至少不是这样(我们可以吗?)

但是其他类型的请求呢 - 例如表单提交?加载脚本/ img/...标签?或者页面可以用来(合法地)创建请求的任何其他方式?或者也许是一些已知的JS黑客攻击?

注意:我不是在谈论

  • 原生应用,
  • 操纵浏览器,
  • example.com页面中的跨站点脚本错误,
  • ...

javascript security csrf cors

93
推荐指数
3
解决办法
3万
查看次数

在请求参数'_csrf'或标题'X-CSRF-TOKEN'上找到无效的CSRF令牌'null'

配置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&ntilde;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)

spring csrf spring-security csrf-protection

88
推荐指数
7
解决办法
13万
查看次数

如何使用PHP正确添加CSRF令牌

我正在尝试为我网站上的表单添加一些安全性.其中一种形式使用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)

有什么建议?

php security session csrf

81
推荐指数
2
解决办法
10万
查看次数

rails - 对于json设计请求,"警告:无法验证CSRF令牌真实性"

如何检索CSRF令牌以传递JSON请求?

我知道出于安全原因,Rails正在检查所有请求类型(包括JSON/XML)上的CSRF令牌.

我可以放入我的控制器skip_before_filter :verify_authenticity_token,但我会失去CRSF保护(不建议:-)).

这个类似的(仍未被接受的)答案暗示

检索令牌 <%= form_authenticity_token %>

问题是如何?我是否需要先对我的任何页面进行调用以检索令牌,然后使用Devise进行真正的身份验证?或者它是一个一次性的信息,我可以从我的服务器获得然后一致地使用(直到我在服务器本身手动更改它)?

csrf devise ruby-on-rails-3 ruby-on-rails-3.1

81
推荐指数
3
解决办法
8万
查看次数

禁止 (403) CSRF 验证失败。请求被中止。失败原因:来源检查失败与任何可信来源不匹配

帮助

\n

失败原因给出:

\n
Origin checking failed - https://praktikum6.jhoncena.repl.co does not match any trusted origins.\n
Run Code Online (Sandbox Code Playgroud)\n

一般来说,当存在真正的跨站请求伪造时,或者当 Django\xe2\x80\x99s CSRF 机制未正确使用时,就会发生这种情况。对于 POST 表单,您需要确保:

\n
Your 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)

python django csrf django-csrf python-3.x

80
推荐指数
3
解决办法
9万
查看次数

如何在RESTful应用程序中阻止CSRF?

通常使用以下方法之一阻止跨站点请求伪造(CSRF):

  • 检查referer - RESTful但不可靠
  • 将令牌插入表单并将令牌存储在服务器会话中 - 而不是真正的RESTful
  • 含糊不清的一次性URI - 由于与令牌相同的原因而不是RESTful
  • 手动为此请求发送密码(不是HTTP身份验证使用的缓存密码) - RESTful但不方便

我的想法是使用用户秘密,一个神秘但静态的表单ID和JavaScript来生成令牌.

<form method="POST" action="/someresource" id="7099879082361234103">
    <input type="hidden" name="token" value="generateToken(...)">
    ...
</form>
Run Code Online (Sandbox Code Playgroud)
  1. GET /usersecret/john_doe 由经过身份验证的用户从JavaScript中获取.
  2. 回复:OK 89070135420357234586534346这个秘密在概念上是静态的,但可以每天/每小时更改......以提高安全性.这是唯一保密的事情.
  3. 使用JavaScript阅读神秘的(但对所有用户都是静态的!)表单id,将其与用户密码一起处理: generateToken(7099879082361234103, 89070135420357234586534346)
  4. 将表单与生成的令牌一起发送到服务器.
  5. 由于服务器知道用户密钥和表单ID,因此可以在发送之前运行与客户端相同的generateToken函数并比较两个结果.只有当两个值相等时,才会授权操作.

这种方法有问题,尽管事实上没有JavaScript它不起作用吗?

附录:

security rest authorization http csrf

75
推荐指数
4
解决办法
6万
查看次数