mmdm/sim-csrf

简单而优秀的CSRF库

v1.2.2 2021-07-12 19:43 UTC

This package is auto-updated.

Last update: 2024-09-13 02:18:50 UTC


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许可证下。