当应用程序依赖无状态身份验证(使用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
配置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) 注意:我在这个问题上有4个赏金,但下面没有提出的答案是这个问题所需要的答案.所需的一切都在下面的Update 3中,只是寻找要实现的Laravel代码.
更新3:此流程图正是我想要完成的流程,下面的所有内容都是原始问题以及一些较旧的更新.该流程图总结了所需的一切.
下面的流程图中的绿色部分是我知道如何做的部分.红色部分及其旁注是我正在寻找帮助完成使用Laravel代码.
我已经做了很多研究,但是当使用Laravel和JWT httponly cookie进行自我消费的API时,信息总是很短而且不完整(大多数在线教程只显示JWT存储在本地存储中,这不是很安全).看起来像包含JWT by Passport的httponly cookie应该用于识别Javascript端的用户,当每次请求发送到服务器以验证用户是否是他们所说的用户时.
还有一些额外的东西需要全面了解如何使这个设置工作,我没有在一个教程中遇到这个包括:
我希望这个问题的答案可以作为一个易于遵循的指南,为未来的读者和那些正在努力寻找一个自我消费API的上述观点的答案.
更新1:
CreateFreshApiToken之前的功能,但是在撤销用户令牌时这不起作用(上面的第3点和第4点).这是基于此评论的核心laravel开发商,谈论时CreateFreshApiToken中间件:由此中间件创建的JWT令牌不会存储在任何位置.它们不能被撤销或"不存在".它们只是为您的api调用提供了一种通过laravel_token cookie进行authed调用的方法.它与访问令牌无关.另外:您通常不会在发布它们的同一个应用程序上使用客户发出的令牌.您可以在第一方或第三方应用中使用它们.使用中间件或客户端发出的令牌,但不能同时使用两者.
所以似乎能够迎合第3点和第4点来撤销令牌,如果使用CreateFreshApiToken中间件则不可能这样做.
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
我正在尝试在Django中编写一个站点,其中API URL与面向用户的URL相同.但我在使用POST请求和CSRF保护的页面遇到问题.例如,如果我有一个page/foo/add,我希望能够以两种方式向它发送POST请求:
我找到了各种禁用CSRF的方法,例如@csrf_exempt,但是这些都禁用了整个视图.有没有办法在更细粒度的水平上启用/禁用它?或者我只是要从头开始实施自己的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:
我错过了什么?
我正在使用Laravel 5开发应用程序.我的应用程序与VendHQ API相关联,我打算通过他们的webhook从VendHQ获取一些数据.根据他们的文档
当事件发生并触发webhook时,我们会向您选择的URL发送POST请求.POST请求将采用UTF-8字符集和application/x-www-form-urlencoded编码.
问题是,当他们尝试向我的Laravel应用程序发送POST请求时,他们的帖子请求中没有添加CSRF令牌,VerifyCsrfToken中间件正在寻找令牌,最后它会抛出一个TokenMismatchException.
我的问题是,如何VerifyCsrfToken在保持其他帖子请求有效的同时避免某些特定路由的默认中间件?
我正在尝试构建一个角度+ 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) 我在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) 在角度文档中,提到angular httpclient将自动XSRF-TOKEN在X-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,则跳过添加标题.
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) 我正在尝试创建指向我网站的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-protection ×10
csrf ×4
laravel ×3
laravel-5 ×2
angular ×1
angularjs ×1
api ×1
codeigniter ×1
cookies ×1
django ×1
elixir ×1
javascript ×1
php ×1
security ×1
spring ×1
stateless ×1
x-xsrf-token ×1