kaiser_cn 发表于 2017-3-28 12:32:38

PHP之Token应用

<?php
/**
* Token
*
* 令牌类,避免CSFR/XSFR、会话劫持、固定攻击、表单伪造攻击等。
* 使用方法:
* 1.提交页面获取Token,并赋值到隐藏域中,获取Token代码如下:
* $token_value = Utils_Token::getInstance()->gen_token();
* 2.提交后在Action页面验证Token,根据返回值进行相应页面处理,验证代码如下:
* $isValid = Utils_Token::getInstance()->validate($token_value);
* 3.验证失败也可直接指定跳转URL如:
* Utils_Token::getInstance()->validate($token_value,'http://xx.xxx.com')
*
* @package Utils
* @author 张东宇
* @version 1.0
* @example
* $token_value = Utils_Token::getInstance()->gen_token(); //获取Token
*echo 'TOKEN_VALUE:'.$token_value.'<br>';//打印Token
*$checkValue = Utils_Token::getInstance()->validate($token_value);//验证令牌
*echo $checkValue;//验证结果:1-成功 0-失败
*
*/
class Utils_Token {
const TOKEN_NAME = 'TOKEN'; // 令牌名
private static $instance; // 类实例
private function __construct() { // 构造函数
}
/**
* 获取令牌类实例
*
* @access public
* @return Token Utils_Token 实例
*/
public static function getInstance() {
if (! isset ( $_SESSION ))
session_start ();
if (! isset ( self::$instance ))
return new Utils_Token ();
else
return self::$instance;
}
/**
* 生成令牌,供表单或其他业务逻辑使用
*
* @access public
* @return string 令牌值
*/
public function gen_token() {
$hash = md5 ( uniqid ( rand () . 'WXT', true ) );
$n = rand ( 0, 24 );
$token = substr ( $hash, $n, 8 );
$this->_tokenValue = $token;
$this->destroy_token ();
$_SESSION = $this->_tokenValue;
return $token;
}
/**
* 销毁令牌
*
* @access private
* @return void
*/
private function destroy_token() {
if ($_SESSION )
unset ( $_SESSION );
}
/**
* 检测令牌是否有效
*
* @access public
* @param string $token
*      令牌值
* @param string $url
*      校验失败跳转URL
* @return boolean 1-校验成功 0-校验失败
*
*/
public function validate($token, $url = '') {
if ($token == $_SESSION ) {
$this->destroy_token ();
return 1;
} elseif ($url) {
$this->destroy_token ();
Header ( "Location: $url" );
} else {
$this->destroy_token ();
return 0;
}
}
}
/*
$token_value = Utils_Token::getInstance()->gen_token(); //获取Token
echo 'TOKEN_VALUE:'.$token_value.'<br>';//打印Token
$checkValue = Utils_Token::getInstance()->validate($token_value);//验证令牌
echo $checkValue;//验证结果:1-成功 0-失败
*/
 
页: [1]
查看完整版本: PHP之Token应用