类 CsrfProtectionMiddleware
提供 CSRF 保护 & 验证。
此中间件将 CSRF 令牌添加到 Cookie 中。Cookie 值与每个 PATCH、POST、PUT 或 DELETE 请求的请求数据中的令牌或 X-CSRF-Token 标头进行比较。这被称为“双重提交 Cookie”技术。
如果请求数据缺失或与 Cookie 数据不匹配,将引发 InvalidCsrfTokenException 异常。
此中间件与 FormHelper 自动集成,当一起使用时,您的表单将在视图中使用 $this->Form->create(...)
时自动添加 CSRF 令牌。
参见: https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html#double-submit-cookie
常量
属性摘要
-
$_config protected
array<string, mixed>
CSRF 处理的配置。
-
$skipCheckCallback protected
callable|null
用于决定是否跳过对特定请求的令牌检查的回调。
方法摘要
-
__construct() public
构造函数
-
_addTokenCookie() protected
向响应 Cookie 添加 CSRF 令牌。
-
_createCookie() protected
创建响应 Cookie
-
_unsetTokenField() protected
从请求数据中删除 CSRF 保护令牌。
-
_validateToken() protected
验证请求数据与 Cookie 令牌。
-
_verifyToken() protected
验证 CSRF 令牌是否最初由接收应用程序生成。
-
createToken() public
创建一个新的令牌,用于 CSRF 保护
-
isHexadecimalToken() protected
测试令牌是否早于加盐令牌。
-
process() public
根据 HTTP 动词检查和设置 CSRF 令牌。
-
saltToken() public
对 CSRF 令牌应用熵
-
skipCheckCallback() public
设置回调以允许跳过对特定请求的令牌检查。
-
unsaltToken() public
从 CSRF 令牌中删除盐。
方法详细
__construct() ¶ public
__construct(array<string, mixed> $config = [])
构造函数
参数
-
array<string, mixed>
$config 可选 配置选项。有关有效键,请参见 $_config。
_addTokenCookie() ¶ protected
_addTokenCookie(string $token, Psr\Http\Message\ServerRequestInterface $request, Psr\Http\Message\ResponseInterface $response): Psr\Http\Message\ResponseInterface
向响应 Cookie 添加 CSRF 令牌。
参数
-
string
$token 要添加的令牌。
-
Psr\Http\Message\ServerRequestInterface
$request 要验证的请求。
-
Psr\Http\Message\ResponseInterface
$response 响应。
返回
Psr\Http\Message\ResponseInterface
_createCookie() ¶ protected
_createCookie(string $value, Psr\Http\Message\ServerRequestInterface $request): Cake\Http\Cookie\CookieInterface
创建响应 Cookie
参数
-
string
$value Cookie 值
-
Psr\Http\Message\ServerRequestInterface
$request 请求对象。
返回
Cake\Http\Cookie\CookieInterface
_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): void
验证请求数据与 Cookie 令牌。
参数
-
Psr\Http\Message\ServerRequestInterface
$request 要验证的请求。
返回
void
抛出
Cake\Http\Exception\InvalidCsrfTokenException
当 CSRF 令牌无效或缺失时。
_verifyToken() ¶ protected
_verifyToken(string $token): bool
验证 CSRF 令牌是否最初由接收应用程序生成。
参数
-
string
$token CSRF 令牌。
返回
bool
isHexadecimalToken() ¶ protected
isHexadecimalToken(string $token): bool
测试令牌是否早于加盐令牌。
这些令牌是十六进制值,等于具有校验和长度的令牌。虽然它们容易受到 BREACH 的攻击,但它们应该随着时间的推移而轮换,并且在 5.x 中将停止支持。
参数
-
string
$token 要测试的令牌。
返回
bool
process() ¶ public
process(ServerRequestInterface $request, RequestHandlerInterface $handler): Psr\Http\Message\ResponseInterface
根据 HTTP 动词检查和设置 CSRF 令牌。
处理传入的服务器请求以生成响应。如果无法自行生成响应,则可以委托给提供的请求处理程序来执行此操作。
参数
-
ServerRequestInterface
$request 请求。
-
RequestHandlerInterface
$handler 请求处理程序。
返回
Psr\Http\Message\ResponseInterface
saltToken() ¶ public
saltToken(string $token): string
对 CSRF 令牌应用熵
为了避免 BREACH,对令牌应用随机盐值。当令牌与会话进行比较时,需要对令牌进行去盐操作。
参数
-
string
$token 要加盐的令牌。
返回
string
skipCheckCallback() ¶ public
skipCheckCallback(callable $callback): $this
设置回调以允许跳过对特定请求的令牌检查。
回调将接收请求实例作为参数,如果要跳过对当前请求的令牌检查,则必须返回 true
。
参数
-
callable
$callback 一个可调用对象。
返回
$this
unsaltToken() ¶ public
unsaltToken(string $token): string
从 CSRF 令牌中删除盐。
如果令牌不等于 TOKEN_VALUE_LENGTH * 2,它就是一个旧的未加盐值,为了向后兼容而支持。
参数
-
string
$token 可能是加盐的令牌。
返回
string
属性详细
$_config ¶ protected
CSRF 处理的配置。
cookieName
要发送的 Cookie 的名称。expiry
CSRF 令牌的有效期,采用 strotime 兼容的值。默认为浏览器会话。secure
Cookie 是否将设置 Secure 标志。默认为 false。httponly
Cookie 是否将设置 HttpOnly 标志。默认为 false。samesite
Cookie 的“SameSite”属性。默认为null
。有效值:CookieInterface::SAMESITE_LAX
、CookieInterface::SAMESITE_STRICT
、CookieInterface::SAMESITE_NONE
或null
。field
要检查的表单字段。更改此项还需要配置 FormHelper。
类型
array<string, mixed>
$skipCheckCallback ¶ protected
用于决定是否跳过对特定请求的令牌检查的回调。
如果回调函数返回 true
,则会跳过 CSRF 防护令牌检查。
类型
callable|null