volnix/csrf

一个用于比较提供的令牌与会话令牌以确保请求有效性的CSRF保护库。

1.2.1 2017-09-19 13:24 UTC

This package is auto-updated.

Last update: 2024-09-14 19:14:39 UTC


README

Build Status Downloads Latest Stable Version Code Coverage

CSRF保护库,通过比较提供的令牌与会话令牌来确保请求的有效性。令牌值存储在会话中,并与该会话存储进行验证以验证请求。令牌在每次请求时都会更改,以确保频繁更改并增加猜测令牌值的难度。

安装

此软件包通过composer安装,并以volnix/csrf软件包的形式引入。

"require": {
    "volnix/csrf": "~1.0"
}

单元测试

此应用程序的单元测试位于./tests目录中。在安全包中的每个库都有一个测试。PHPUnit xml文件位于项目根目录中(./phpunit.xml)。

用法

此库用于防止跨站请求伪造。目前,您可以检索令牌、预构建的查询字符串或预构建的隐藏输入标签。

此库主要有两个部分

  1. CSRF令牌注入
  2. CSRF令牌验证

1. 令牌注入

有多种方法可以将您的CSRF令牌放入表单标记中

仅值

	
<?php

<form action="index.php" method="post">
	<input type="hidden" name="<?= \Volnix\CSRF\CSRF::TOKEN_NAME ?>" value="<?= \Volnix\CSRF\CSRF::getToken() ?>"/>
	<input type="text" name="action" placeholder="Enter an action."/>
	<input type="submit" value="Submit" name="sub"/>
</form>

隐藏输入字符串

<form action="index.php" method="post">
	<?= \Volnix\CSRF\CSRF::getHiddenInputString() ?>
	<input type="text" name="action" placeholder="Enter an action."/>
	<input type="submit" value="Submit" name="sub"/>
</form>

查询字符串

<form action="index.php?<?= \Volnix\CSRF\CSRF::getQueryString() ?>" method="get">
	<input type="text" name="action" placeholder="Enter an action."/>
	<input type="submit" value="Submit" name="sub"/>
</form>

如果需要不同的令牌名称,可以在获取令牌的任何调用中传入它(例如getToken()getHiddenInputString()getQueryString()

<form action="index.php" method="post">
	<?= \Volnix\CSRF\CSRF::getHiddenInputString('custom_token_name') ?>
	<input type="text" name="action" placeholder="Enter an action."/>
	<input type="submit" value="Submit" name="sub"/>
</form>

2. 令牌验证

要验证令牌,只需传递您的POST/GET/REQUEST数据数组。如果您有自定义的令牌名称,则还有一个可选的第二个参数。

注意:令牌验证使用恒时比较方法进行,以防止时间攻击。

基本的POST数据验证

// generic POST data
if ( CSRF::validate($_POST) ) {
	// good token
} else {
	// bad token
}

使用Symfony的HTTP基础

// symfony object
$request = \Symfony\Component\HttpFoundation\Request::createFromGlobals();

if ( CSRF::validate($request->request->all()) ) {
	// good token
} else {
	// bad token
}

验证自定义名称的令牌

// validating with a custom token name
if ( CSRF::validate($_POST, 'my_custom_name') ) {
	// good token
} else {
	// bad token
}