gilbitron/easycsrf

一个简单独立的CSRF保护库

1.5.1 2021-12-27 14:29 UTC

This package is auto-updated.

Last update: 2024-08-27 20:01:29 UTC


README

Build Status Packagist Downloads PHP version License

EasyCSRF

EasyCSRF是一个用PHP编写的简单独立的CSRF保护库。它可以用来保护你的表单免受跨站请求伪造攻击。

要求

  • PHP 7.3+

安装

通过composer安装

composer require gilbitron/easycsrf

运行composer install然后按常规使用

require 'vendor/autoload.php';

$sessionProvider = new EasyCSRF\NativeSessionProvider();
$easyCSRF = new EasyCSRF\EasyCSRF($sessionProvider);

使用方法

要使用EasyCSRF,首先你需要生成一个令牌

$sessionProvider = new EasyCSRF\NativeSessionProvider();
$easyCSRF = new EasyCSRF\EasyCSRF($sessionProvider);

$token = $easyCSRF->generate('my_token');

然后,你需要在创建的任何表单中包含这个令牌

<form>
    ...
    <input type="hidden" name="token" value="<?php echo $token; ?>">
    ...
</form>

然后在处理任何数据之前,检查令牌是否有效

use EasyCSRF\Exceptions\InvalidCsrfTokenException;

try {
    $easyCSRF->check('my_token', $_POST['token']);
} catch(InvalidCsrfTokenException $e) {
    echo $e->getMessage();
}

令牌过期

你可以通过传递一个时间段(以秒为单位)到检查方法来为令牌设置时间限制。时间段之前的令牌将无效。

// Example 1 hour expiration
$easyCSRF->check('my_token', $_POST['token'], 60 * 60);

可重复使用的令牌

令牌可以被设置为可重复使用的,而不仅仅是单次使用(对于ajax-heavy请求很有用)。

// Make token reusable
$easyCSRF->check('my_token', $_POST['token'], null, true);

自定义SessionProvider

你的应用程序可能使用第三方库来管理会话,或者你可能希望将令牌存储在除$_SESSION之外的地方(如NativeSessionProvider所做的那样)。在这种情况下,你可以创建一个自定义的SessionProvider,并在实例化EasyCSRF时使用它。

<?php

use EasyCSRF\Interfaces\SessionProvider;

class CustomSessionProvider implements SessionProvider
{
    /**
     * Get a session value.
     *
     * @param string $key
     * @return mixed
     */
    public function get($key)
    {
        // Return your stored data
    }

    /**
     * Set a session value.
     *
     * @param string $key
     * @param mixed $value
     * @return void
     */
    public function set($key, $value)
    {
        // Store your data
    }

}
$sessionProvider = new CustomSessionProvider();
$easyCSRF = new EasyCSRF\EasyCSRF($sessionProvider);

致谢

EasyCSRF是由来自Dev7studiosGilbert Pellegrom创建的。在MIT许可下发布。