mmdm / sim-csrf
简单而优秀的CSRF库
Requires
- php: >=7.2
- ext-openssl: *
README
用于CSRF令牌管理的库。
安装
composer
composer require mmdm/sim-csrf
或者,您可以直接从GitHub下载zip文件,然后解压,将文件放置到项目库中,像其他库一样使用。
只需添加以下行以自动加载文件
require_once 'path_to_library/autoloader.php';
即可。
如何使用
// to instance a csrf object $csrf = new Csrf(); // then use csrf mothods like $field = $csrf->getField(); // the output will be // <input type="hidden" name="csrftoken" value="generated token">
__construct(ICsrfStorage $storage = null)
如果您想传递自定义存储,只需实现ICsrfStorage
类,并通过构造函数传递它即可。
有关如何创建自定义存储的更多信息,请参阅自定义Csrf存储部分。
可用函数
- setStorage(ICsrfStorage $storage): ICsrf
您可以使用此方法在构建后设置存储。
- getStorage(): ICsrfStorage
获取CSRF存储。
- setExpiration(int $timeout): ICsrf
此方法将CSRF令牌的过期时间从现在设置。默认过期时间为300秒。
// to set token expiration $csrf->setExpiration(10); // token is valid just for 10 seconds from now // after 10 seconds it'll be generate again
注意:如果您计划在代码片段中连续获取令牌,则应在获取字段或令牌之前指定过期时间。
示例:如果不指定任何过期时间,则没有问题,所有这些都将使用默认过期时间,但如果您在其中一个中指定过期时间,则应在每个使用后指定过期时间。
示例:没有问题
$token1 = $csrf->getToken(); // some code // ... $token2 = $csrf->getToken(); // some othe code // ... $token3 = $csrf->getToken();
示例:有问题
$token1 = $csrf->setExpiration(20)->getToken(); // some code // ... // in this code, expiration time will be 20 seconds //according to previous codes // if you want anothe expiration, specify it then $token2 = $csrf->setExpiration(300)->getToken(); // some othe code // ... // same thing here $token3 = $csrf->getToken();
- getExpiration(): int
获取过期时间。
// an integer value in seconds like 300 $timeout = $csrf->getExpiration();
- extendExpiration(bool $answer = true)
默认情况下,如果存储类中实现了此功能,或者您想防止此行为,可以向此方法发送false
。
重要提示:如果您将过期时间设置为7200秒(2小时)且扩展功能处于开启状态,则每次成功验证CSRF后,都会扩展过期时间。这意味着您有3600秒的时间,例如,如果表单已提交,则现在您有7200秒,因为您没有关闭扩展功能,但如果您关闭此功能或您有自定义CSRF存储,并且未在扩展方法中实现任何功能,则现在如果您的过期时间为3600秒并且提交表单,则您将有3600秒的时间,并且时间不会扩展。
从v1.2.0版本开始添加
- getField(string $name = null, string $input_name = null): string
此方法将返回类型为hidden的输入,其值为令牌。$name是生成令牌的ID,$input_name是隐藏输入的名称。
// returns filed string for form $field = $csrf->getField(); // output is // <input type="hidden" name="csrftoken" value="generated token">
- getToken(string $name = null): string
此方法将仅返回令牌值。
注意:如果我们之前有带有$name的令牌且它有效,则返回它。
// returns token string $token = $csrf->getToken(); // output is a hashed string
- regenerateToken(string $name = null): string
与getToken不同,每次都会返回一个新的令牌。
// returns token string $token = $csrf->regenerateToken(); // output is a hashed string
- validate($token, $name = null): bool
此方法验证令牌。
// returns true on valid and false otherwise $isValid = $csrf->validate();
- clear(): ICsrf
此方法清除所有生成的令牌。
// to clear all tokens $csrf->clear();
自定义Csrf存储
只需实现ICsrfStorage
接口
interface ICsrfStorage { /** * @param $key * @param $value * @param $time * @return ICsrfStorage */ public function set($key, $value, $time): ICsrfStorage; /** * @param $key * @return mixed */ public function get($key); /** * @param $key * @return bool */ public function has($key): bool; /** * @param $key * @return ICsrfStorage */ public function remove($key): ICsrfStorage; /** * Extend CSRF timeout if you want to * * @param $key * @param int $expiration * @return ICsrfStorage */ public function extend($key, int $expiration): ICsrfStorage; /** * Remove all stored tokens * * @param string $prefix * @return ICsrfStorage */ public function clear($prefix): ICsrfStorage; }
重要提示:所有$key
参数都有一个额外的前缀,该前缀与令牌的哈希名称连接。
$key will be something like
__simplicity_csrf_tokens_.f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0
as you can see [__simplicity_csrf_tokens_] is prefix and
[f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0] is hashed of
token name that is [Hello] here
许可证
在MIT许可证下。