类 SessionCsrfProtectionMiddleware
通过基于会话的令牌提供 CSRF 保护。
此中间件在会话中添加一个 CSRF 令牌。每个请求必须在请求数据中包含一个令牌,或在每个 PATCH、POST、PUT 或 DELETE 请求的 X-CSRF-Token 标头中包含一个令牌。这遵循“同步器令牌”模式。
如果请求数据丢失或与会话数据不匹配,将引发 InvalidCsrfTokenException。
此中间件会自动与 FormHelper 集成,当一起使用时,您的表单将在视图中使用 $this->Form->create(...)
时自动添加 CSRF 令牌。
如果您使用此中间件,不要也使用 CsrfProtectionMiddleware。
参见: https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html#synchronizer-token-pattern
常量
-
int
TOKEN_VALUE_LENGTH ¶32
属性摘要
-
$_config protected
array<string, mixed>
用于 CSRF 处理的配置。
-
$skipCheckCallback protected
callable|null
用于决定是否为特定请求跳过令牌检查的回调。
方法摘要
-
__construct() public
构造函数
-
createToken() public
创建一个用于 CSRF 保护的新令牌
-
process() public
根据 HTTP 动词检查并设置 CSRF 令牌。
-
replaceToken() public static
替换提供的请求中的令牌。
-
saltToken() public
将熵应用于 CSRF 令牌
-
skipCheckCallback() public
设置回调以允许跳过特定请求的令牌检查。
-
unsaltToken() protected
从 CSRF 令牌中移除盐。
-
unsetTokenField() protected
从请求数据中移除 CSRF 保护令牌。
-
validateToken() protected
根据 cookie 令牌验证请求数据。
方法详情
__construct() ¶ public
__construct(array<string, mixed> $config = [])
构造函数
参数
-
array<string, mixed>
$config optional 配置选项。有关有效键,请参阅 $_config。
createToken() ¶ public
createToken(): string
创建一个用于 CSRF 保护的新令牌
此令牌是一个简单的唯一随机值,因为比较值存储在会话中,在那里无法被篡改。
返回
string
process() ¶ public
process(ServerRequestInterface $request, RequestHandlerInterface $handler): Psr\Http\Message\ResponseInterface
根据 HTTP 动词检查并设置 CSRF 令牌。
处理传入的服务器请求以生成响应。如果无法生成响应本身,它可能会委托给提供的请求处理程序来执行此操作。
参数
-
ServerRequestInterface
$request 请求。
-
RequestHandlerInterface
$handler 请求处理程序。
返回
Psr\Http\Message\ResponseInterface
replaceToken() ¶ public static
replaceToken(Cake\Http\ServerRequest $request, string $key = 'csrfToken'): Cake\Http\ServerRequest
替换提供的请求中的令牌。
替换会话和请求属性中的令牌。在权限升级或权限降低期间替换令牌是一个好主意。
参数
-
Cake\Http\ServerRequest
$request 要更新的请求
-
string
$key optional 要设置的会话键/属性。
返回
Cake\Http\ServerRequest
saltToken() ¶ public
saltToken(string $token): string
将熵应用于 CSRF 令牌
为避免 BREACH,将随机盐值应用于令牌。当令牌与会话进行比较时,需要取消令牌的盐。
参数
-
string
$token 要加盐的令牌。
返回
string
skipCheckCallback() ¶ public
skipCheckCallback(callable $callback): $this
设置回调以允许跳过特定请求的令牌检查。
回调将接收请求实例作为参数,如果要跳过当前请求的令牌检查,则必须返回 true
。
参数
-
callable
$callback 一个可调用对象。
返回
$this
unsaltToken() ¶ protected
unsaltToken(string $token): string
从 CSRF 令牌中移除盐。
如果令牌不是 TOKEN_VALUE_LENGTH * 2,则它是一个旧的未加盐的值,为了向后兼容而支持。
参数
-
string
$token 可能是加盐的令牌。
返回
string
unsetTokenField() ¶ protected
unsetTokenField(Psr\Http\Message\ServerRequestInterface $request): Psr\Http\Message\ServerRequestInterface
从请求数据中移除 CSRF 保护令牌。
这确保了令牌在表单篡改保护期间不会导致故障。
参数
-
Psr\Http\Message\ServerRequestInterface
$request 请求对象。
返回
Psr\Http\Message\ServerRequestInterface
validateToken() ¶ protected
validateToken(Psr\Http\Message\ServerRequestInterface $request, Cake\Http\Session $session): void
根据 cookie 令牌验证请求数据。
参数
-
Psr\Http\Message\ServerRequestInterface
$request 要验证的请求。
-
Cake\Http\Session
$session 会话实例。
返回
void
抛出
Cake\Http\Exception\InvalidCsrfTokenException
当 CSRF 令牌无效或丢失时。