Django 的 CsrfViewMiddleware 设置了“Vary: Cookie”标头,这意味着缓存系统不仅会考虑页面 URL,还会考虑每个用户唯一的用户 Cookie。因此页面不会为所有用户缓存一次,而是为每个用户缓存一次。就我而言,我的网站负载非常大,这种行为并不令我满意。
我正在开发一个通过API为移动应用程序提供服务的Rails 4应用程序,并且有一个用于管理员管理应用程序的Web UI.还有一些用户可以看到的网页(成功的电子邮件确认和重置密码).
我创建了两组控制器:一组继承自APIController,另一组继承自AdminController.这两个都继承自ApplicationController.负责面向用户的网页的其余控制器也继承自ApplicationController.
鉴于此方案,我不确定如何使用protect_from_forgery正确实施CSRF保护.我目前有以下内容:
class ApplicationController < ActionController::Base
# ...
end
module API
class APIController < ApplicationController
protect_from_forgery with: :null_session, if: Proc.new { |c| c.request.format == 'application/json' }
# ...
end
end
module Admin
class AdminController < ApplicationController
protect_from_forgery with: :exception
# ...
end
end
class UsersController < ApplicationController
protect_from_forgery with: :exception
# ...
end
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:这是正确的吗?有没有办法改善它?APIController中的检查是否毫无意义,因为所有API请求都只是JSON吗?
Brakeman抱怨说ApplicationController中没有protect_from_forgery调用,但也许它看不到子类中的调用.
提前致谢!
TL;DR 我需要保护我的表单免受 CSRF 攻击,我想在前端使用 ReactJS,在后端使用 Flask/Flask-WTF。
我正在重构一个使用 Python、Flask 和 Flask-WTF 构建的用于表单的网站,我想将 React 用于前端,而不是通过 PyPugjs 使用 Jinja2。我正在使用 Flask-WTF 来呈现表单,它负责处理 CSRF 令牌等。我知道如何使用 React 制作表单,但如何获得 CSRF 保护?
现在我的表单渲染看起来像这样:(使用 Pug)
mixin render_form(form, id='', action='Submit')
form(method='POST', action='', id=id)
=form.csrf_token
each field in form
fieldset
if field.errors
each error in field.errors
.notification.error
#{error}
#{field(placeholder=field.label.text)}
button(type='submit') #{action}
Run Code Online (Sandbox Code Playgroud) 我们正在使用 ASP.NET Core 构建 3 个不同的应用程序 MVC 应用程序、API、SPA(不是 Angular)。此应用程序中的所有操作仅适用于授权用户。这就是我们使用 IdentityServer 保护它们的原因。
我们使用 cookie 来存储不记名令牌的值。我知道 cookie 的值会自动发送到服务器。但是因为它应该作为授权标头添加,所以浏览器不会自动完成。
这是否降低了 CSRF 攻击的可能性?或者CSRF仍然可以使用不记名令牌,我们是否需要添加CSRF令牌?
我已经阅读了一些关于使用ValidateAntiForgeryToken防止 XSRF/CSRF 攻击的文章。然而,我所看到的似乎只与 MVC 相关。
这些是我看过的文章:
ValidateAntiForgeryToken 用途、解释和示例
ASP.NET MVC 和网页中的 XSRF/CSRF 预防
我如何在 WebForms 应用程序中实现这个或类似的东西?
我在同一台服务器上托管了多个 Laravel 站点。在我创建的最新网站中,联系表单拒绝提交,并且不会抛出 419 错误。我已经在 web.php 文件中设置了路由,就像其他网站一样,这些网站有实时、有效的联系表单,并且我以完全相同的方式生成和发送令牌 - 使用{{ csrf_field() }}.
我找到了类似问题的答案,指出您可以通过$except向 中的数组添加条目来禁用 Csrf 检查app/Http/Middleware/VerifyCsrfToken.php。我已经验证这确实解决了 419 错误:
protected $except = [
'contact',
'contact*',
];
Run Code Online (Sandbox Code Playgroud)
但我当然希望保留 Csrf 功能,并且我仅更新了$except用于故障排除值的数组。
有谁知道新的 Laravel 环境可能有什么不同,尽管传递了生成的令牌,但仍会出现 419 行为?我尝试过更新一些 ENV 设置并切换不同的东西,但除了修改$except数组之外,没有任何其他方法对这个问题产生任何影响。
由于到目前为止已经进行了一些讨论,我想我应该提供一些额外的信息和代码。
首先,这是一个 ajax 形式,但先不要从座位上跳起来。我一直在使用和不使用ajax 的情况下测试表单。如果我想使用 ajax 进行测试,我只需单击连接到 jQuery 侦听器的按钮即可。如果没有,我会更改或删除按钮的 ID,或者$("#formName").submit();在控制台窗口中运行。
上述(ajax、老式提交和带有 的 jquery 选择器.submit();)都会产生完全相同的响应 - 419 错误。
为了完整起见,这是我的 ajax 代码,它可以在我托管的所有其他网站上运行。我定义了一个 postData 数组以使其保持整洁,并console.log()在其后面直接添加了一条语句以(再次)确认令牌生成良好并且正在随请求正确传递。
var postData = {
name: $("#name").val(),
email: …Run Code Online (Sandbox Code Playgroud) 我正在使用JWT令牌进行身份验证并将其存储在本地存储中,现在想添加CSRF令牌,是否可以CSRF仅以角度激活?
由于 JWT 令牌生成是否可以CSRF随机生成并存储它?
我正在尝试像下面这样
身份验证.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import { map } from 'rxjs/operators/map';
import { Router } from '@angular/router';
export interface UserDetails {
_id: string;
email: string;
name: string;
exp: number;
iat: number;
}
interface TokenResponse {
token: string;
}
export interface TokenPayload {
email: string;
password: string;
name?: string;
}
@Injectable()
export class AuthenticationService …Run Code Online (Sandbox Code Playgroud) confirm.php
Run Code Online (Sandbox Code Playgroud)<?php session_start(); $token= md5(uniqid()); $_SESSION['delete_customer_token']= $token; session_write_close(); ?> <form method="post" action="confirm_save.php"> <input type="hidden" name="token" value="<?php echo $token; ?>" /> Do you really want to delete? <input type="submit" value=" Yes " /> <input type="button" value=" No " onclick="history.go(-1);" />
confirm_save.php
<?php
session_start();
$token= $_SESSION['delete_customer_token'];
unset($_SESSION['delete_customer_token']);
session_write_close();
if ($_POST['token']==$token) {
// delete the record
} else {
// log potential CSRF attack.
}
?>
Run Code Online (Sandbox Code Playgroud)
假设我们有一个像这样的典型CSRF保护如果攻击者使用此代码绕过csrf令牌怎么办?
//On any site
<img src="http://cia.teletubbies.com/csrf.php" height="0" weight="0"/>
//csrf.php
$cont = get_file_contents("http://cia.google.com/confirm.php");
// parse the html using …Run Code Online (Sandbox Code Playgroud) 我正在尝试获取标头值:
Request::header('csrf_token')
虽然,我的firebug在标题中说我将csrf_token设置为baMDpF0yrfRerkdihFack1Sa9cchUk8qBzm0hK0C.事实上,我可以csrf_token用本机的PHP代码来获取它:
getallheaders()['csrf_token']
现在问题是我正在进行XSRF保护吗?或者我的PHP代码有一个缺陷,我真的必须使用bug的laravel 4功能
Request::header('csrf_token')
它只返回空白.而我只是错过了一些东西.也许在我的Laravel 4配置等?
PS:我正在使用AngularJS,但也许我使用的客户端并不重要.我有这个链接作为我的指南:如何使用Laravel API在AngularJS表单中发送csrf_token()?
我正在根据文档使用Spring安全性实现CSRF保护
我有一个问题是:当这个令牌被Spring安全性失效时?令牌是否因每次请求提交而失效?
csrf-protection ×10
php ×3
csrf ×2
laravel ×2
angular ×1
angularjs ×1
asp.net ×1
asp.net-core ×1
asp.net-mvc ×1
c# ×1
caching ×1
cookies ×1
csrf-token ×1
django ×1
header ×1
java ×1
javascript ×1
reactjs ×1
security ×1
webforms ×1
xss ×1