标签: csrf-protection

使用无状态(=无会话)身份验证时,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万
查看次数

在请求参数'_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万
查看次数

Laravel 5.6 - 用于自助API的Passport JWT httponly cookie SPA身份验证?

注意:我在这个问题上有4个赏金,但下面没有提出的答案是这个问题所需要的答案.所需的一切都在下面的Update 3中,只是寻找要实现的Laravel代码.


更新3:此流程图正是我想要完成的流程,下面的所有内容都是原始问题以及一些较旧的更新.该流程图总结了所需的一切.

下面的流程图中的绿色部分是我知道如何做的部分.红色部分及其旁注是我正在寻找帮助完成使用Laravel代码.

在此输入图像描述


我已经做了很多研究,但是当使用Laravel和JWT httponly cookie进行自我消费的API时,信息总是很短而且不完整(大多数在线教程只显示JWT存储在本地存储中,这不是很安全).看起来像包含JWT by Passport的httponly cookie应该用于识别Javascript端的用户,当每次请求发送到服务器以验证用户是否是他们所说的用户时.

还有一些额外的东西需要全面了解如何使这个设置工作,我没有在一个教程中遇到这个包括:

  1. Laravel Passport(不是tymon auth)生成加密的JWT并将其作为httponly cookie发送,作为从JS端登录后的响应.使用什么中间件?如果刷新令牌添加更多安全性,如何实现?
  2. JavaScript(例如axios)api伪代码,用于调用auth端点,如何将httponly cookie传递给后端,以及后端验证令牌是如何有效的.
  3. 如果从多个设备登录单个帐户,那么设备被盗,如何撤销所有authed用户设备的访问权限(假设用户从他们可以控制的登录设备更改密码)?
  4. 什么会登录/注册,注销,更改密码,忘记密码控制器方法通常看起来像处理令牌的创建/验证/撤销?
  5. CSRF令牌集成.

我希望这个问题的答案可以作为一个易于遵循的指南,为未来的读者和那些正在努力寻找一个自我消费API的上述观点的答案.

更新1:

  1. 请注意我尝试过CreateFreshApiToken之前的功能,但是在撤销用户令牌时这不起作用(上面的第3点和第4点).这是基于此评论的核心laravel开发商,谈论时CreateFreshApiToken中间件:

由此中间件创建的JWT令牌不会存储在任何位置.它们不能被撤销或"不存在".它们只是为您的api调用提供了一种通过laravel_token cookie进行authed调用的方法.它与访问令牌无关.另外:您通常不会在发布它们的同一个应用程序上使用客户发出的令牌.您可以在第一方或第三方应用中使用它们.使用中间件或客户端发出的令牌,但不能同时使用两者.

所以似乎能够迎合第3点和第4点来撤销令牌,如果使用CreateFreshApiToken中间件则不可能这样做.

  1. 在客户端,Authorization: Bearer <token>处理安全的httpOnly cookie 似乎不是一种方法.我认为请求/响应应该包含安全的httpOnly cookie作为请求/响应头,像这样基于laravel文档:

使用此身份验证方法时,默认的Laravel JavaScript脚手架指示Axios始终发送X-CSRF-TOKEN和X-Requested-With标头.

headerswindow.axios.defaults.headers.common = {
    'X-Requested-With': 'XMLHttpRequest',
    'X-CSRF-TOKEN': (csrf_token goes here)
};
Run Code Online (Sandbox Code Playgroud)

这也是我寻找涵盖上述所有要点的解决方案的原因.道歉,我使用的是Laravel 5.6而不是5.5.

更新2:

似乎密码授予/刷新令牌授权组合是要走的路.使用密码授予/刷新令牌授权组合寻找易于遵循的实施指南.

密码授予: 此授权适用于与我们信任的客户交易,例如我们自己网站的移动应用.在这种情况下,客户端将用户的登录凭据发送到授权服务器,服务器直接发出访问令牌.

刷新令牌授权: 当服务器发出访问令牌时,它还会为访问令牌设置到期时间.当我们想要在访问令牌过期时刷新访问令牌时,使用刷新令牌授予.在这种情况下,授权服务器将在发出访问令牌时发送刷新令牌,该令牌可用于请求新的访问令牌.

我正在寻找一个易于实现,直接,全面的答案,使用密码授予/刷新令牌授权组合,涵盖上述原始5点的所有部分与httpOnly安全cookie,创建/撤销/刷新令牌,登录cookie创建,注销cookie撤销,控制器方法,CSRF等

csrf-protection laravel cookie-httponly laravel-5 laravel-passport

56
推荐指数
4
解决办法
4238
查看次数

如何在某些情况下禁用Django的csrf保护?

我正在尝试在Django中编写一个站点,其中API URL与面向用户的URL相同.但我在使用POST请求和CSRF保护的页面遇到问题.例如,如果我有一个page/foo/add,我希望能够以两种方式向它发送POST请求:

  1. 作为最终用户(使用会话cookie进行身份验证)提交表单.这需要CSRF保护.
  2. 作为API客户端(使用HTTP请求标头进行身份验证).如果启用CSRF保护,则会失败.

我找到了各种禁用CSRF的方法,例如@csrf_exempt,但是这些都禁用了整个视图.有没有办法在更细粒度的水平上启用/禁用它?或者我只是要从头开始实施自己的CSRF保护?

api django csrf-protection

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

令牌如何防止csrf攻击?

我已经阅读了CSRF以及如何使用不可预测的同步器令牌模式来防止它.我不太明白它是如何工作的.

我们来看看这个场景:

用户使用以下格式登录网站:

<form action="changePassword" method="POST">
   <input type="text" name="password"><br>
   <input type="hidden" name="token" value='asdjkldssdk22332nkadjf' >
</form>
Run Code Online (Sandbox Code Playgroud)

服务器还将令牌存储在会话中.发送请求时,它会将表单数据中的标记与会话中的标记进行比较.

当黑客可以编写以下代码的JavaScript代码时,如何防止CSRF:

  1. 向网站发送GET请求
  2. 接收包含请求表单的html文本.
  3. 在html文本中搜索CSRF令牌.
  4. 使用该令牌发出恶意请求.

我错过了什么?

javascript security csrf csrf-protection

26
推荐指数
1
解决办法
5246
查看次数

在Laravel 5中,如何禁用特定路由的VerifycsrfToken中间件?

我正在使用Laravel 5开发应用程序.我的应用程序与VendHQ API相关联,我打算通过他们的webhook从VendHQ获取一些数据.根据他们的文档

当事件发生并触发webhook时,我们会向您选择的URL发送POST请求.POST请求将采用UTF-8字符集和application/x-www-form-urlencoded编码.

问题是,当他们尝试向我的Laravel应用程序发送POST请求时,他们的帖子请求中没有添加CSRF令牌,VerifyCsrfToken中间件正在寻找令牌,最后它会抛出一个TokenMismatchException.

我的问题是,如何VerifyCsrfToken在保持其他帖子请求有效的同时避免某些特定路由的默认中间件?

php csrf-protection laravel laravel-5

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

如何使用Laravel API在AngularJS表单中发送csrf_token()?

我正在尝试构建一个角度+ laravel休息应用程序.我可以获得我的数据库的视图.当我尝试添加新项目时.我500 error告诉我错配csrf令牌.我的表单布局是:

<form class="form-horizontal" ng-submit="addItem()">

  <input type="text" ng-model="itemEntry" placeholder="Type and hit Enter to add item">
</form>
Run Code Online (Sandbox Code Playgroud)

这是我尝试将项添加到数据库的方式:

$scope.addItem = function(CSRF_TOKEN) {
    $http.post('/shop', { text: $scope.itemEntry, csrf_token: CSRF_TOKEN} ).success(function(data, status) {
        if(data) {
            var last = _.last($scope.items);
            _token = CSRF_TOKEN;
            $scope.items.push({text: $scope.itemEntry, bought: false, id: (last.id + 1) });
            $scope.itemEntry = '';
            console.log($scope.items);
        } else {
            console.log('There was a problem. Status: ' + status + '; Data: ' + data);
        }
    }).error(function(data, status) {
            console.log('status: ' + status); …
Run Code Online (Sandbox Code Playgroud)

csrf-protection laravel angularjs

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

codeigniter CSRF错误:"不允许您请求的操作."

我在codeigniter的配置文件中启用了csrf_protection选项,并使用form_open()函数来创建我的表单.但是当我提交表单时,会发生以下错误:

The action you have requested is not allowed.
Run Code Online (Sandbox Code Playgroud)

我已经完成了这个主题的答案(taht与我的问题最相关):问题

但他们没有工作,问题仍然存在.config.php文件

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/*
|--------------------------------------------------------------------------
| Base Site URL
|--------------------------------------------------------------------------
|
| URL to your CodeIgniter root. Typically this will be your base URL,
| WITH a trailing slash:
|
|   http://example.com/
|
| If this is not set then CodeIgniter will guess the protocol, domain and
| path to your installation.
|
*/
$config['base_url'] = '';

/*
|--------------------------------------------------------------------------
| Index …
Run Code Online (Sandbox Code Playgroud)

runtime-error codeigniter csrf-protection

21
推荐指数
5
解决办法
7万
查看次数

angular4 httpclient csrf不发送x-xsrf-token

在角度文档中,提到angular httpclient将自动XSRF-TOKENX-XSRF-TOKENpost请求的标题中发送cookie的值.文档链接

但它并没有为我发送标题.这是我的代码

Nodejs用于设置cookie的代码

router.get('/set-csrf',function(req,res,next){
    res.setHeader('Set-Cookie', "XSRF-TOKEN=abc;Path=/; HttpOnly; SameSite=Strict");    
    res.send();
  })
Run Code Online (Sandbox Code Playgroud)

我在app.module.ts中使用了httpclient

imports: [
  HttpClientModule
]
Run Code Online (Sandbox Code Playgroud)

**以上代码仅用于调试目的.我没有set-csrf端点.

但是当我发送帖子请求时它不会发送任何标题.我无法调试.

我已经在angular的github存储库中添加了这个问题.HttpXsrfInterceptor检查请求是GET还是HEAD,或者是否以http开头.如果为true,则跳过添加标题.

这是HttpXsrfInterceptor类中的代码

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const lcUrl = req.url.toLowerCase();
    // Skip both non-mutating requests and absolute URLs.
    // Non-mutating requests don't require a token, and absolute URLs require special handling
    // anyway as the cookie set
    // on our origin is not the same as the token expected by another origin. …
Run Code Online (Sandbox Code Playgroud)

cookies csrf-protection x-xsrf-token angular

20
推荐指数
2
解决办法
1万
查看次数

如何在Phoenix框架中有选择地禁用CSRF检查

我正在尝试创建指向我网站的Facebook页面标签.Facebook将HTTP POST请求发送到我网站的网址.这里的问题是服务器有一个内置的CSRF检查,它返回以下错误:

(Plug.CSRFProtection.InvalidCSRFTokenError) invalid CSRF (Cross Site  Forgery Protection) token, make sure all requests include a '_csrf_token' param or an 'x-csrf-token' header`
Run Code Online (Sandbox Code Playgroud)

服务器需要Facebook不能拥有的CSRF令牌.所以,我想有选择地为路径www.mywebsite.com/facebook禁用CSRF.

我怎么能在Phoenix Framework中做到这一点?

csrf elixir csrf-protection phoenix-framework

18
推荐指数
1
解决办法
3275
查看次数