volnix / csrf
一个用于比较提供的令牌与会话令牌以确保请求有效性的CSRF保护库。
1.2.1
2017-09-19 13:24 UTC
Requires
- php: >= 5.3
Requires (Dev)
- phpunit/phpunit: ~3.7
README
CSRF保护库,通过比较提供的令牌与会话令牌来确保请求的有效性。令牌值存储在会话中,并与该会话存储进行验证以验证请求。令牌在每次请求时都会更改,以确保频繁更改并增加猜测令牌值的难度。
安装
此软件包通过composer安装,并以volnix/csrf
软件包的形式引入。
"require": { "volnix/csrf": "~1.0" }
单元测试
此应用程序的单元测试位于./tests
目录中。在安全包中的每个库都有一个测试。PHPUnit xml文件位于项目根目录中(./phpunit.xml
)。
用法
此库用于防止跨站请求伪造。目前,您可以检索令牌、预构建的查询字符串或预构建的隐藏输入标签。
此库主要有两个部分
- CSRF令牌注入
- 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 }