您现在的位置是:首页 > 正文

php加密令牌,Token PHP令牌 Token改进版

2024-02-29 14:00:55阅读 0

想了解PHP令牌 Token改进版的相关内容吗,在本文为您仔细讲解Token的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:PHP令牌,Token,下面大家一起来学习吧。

正是由于使用了 base64 ,所以在把这个令牌通过 GET方法发送的时候,出现了问题。

比如:http://test/test.php?a=1+2

你用 $_GET["a"] 取得是:1 2 ,即那个加号没有了。一开始我用 urlencode 对其进行转换,但是总有那么一两的结果是意料外的。

后来想想 base64 的字符就限定于: [A-Za-z0-9\+\/=] 这么多,加号出问题,我就把加号换成不出问题的符号,下划线是最好的选择。下面是修改后的代码:

GEncrypt.inc.php

class GEncrypt {

protected static function keyED($txt, $encrypt_key) {

$encrypt_key = md5 ( $encrypt_key );

$ctr = 0;

$tmp = "";

for($i = 0; $i 

if ($ctr == strlen ( $encrypt_key ))

$ctr = 0;

$tmp .= substr ( $txt, $i, 1 ) ^ substr ( $encrypt_key, $ctr, 1 );

$ctr ++;

}

return $tmp;

}

public static function encrypt($txt, $key) {

$encrypt_key = md5 ( (( float ) date ( "YmdHis" ) + rand ( 10000000000000000, 99999999999999999 )) . rand ( 100000, 999999 ) );

$ctr = 0;

$tmp = "";

for($i = 0; $i 

if ($ctr == strlen ( $encrypt_key ))

$ctr = 0;

$tmp .= substr ( $encrypt_key, $ctr, 1 ) . (substr ( $txt, $i, 1 ) ^ substr ( $encrypt_key, $ctr, 1 ));

$ctr ++;

}

return ( preg_replace("/\\+/s","_", base64_encode ( self::keyED ( $tmp, $key ) ) ));

}

//base64 [A-Za-z0-9\+\/=]

public static function decrypt($txt, $key) {

if($txt == ""){ return false;}

//echo preg_replace("/_/s","+",$txt);

$txt = self::keyED (base64_decode ( preg_replace("/_/s","+", $txt) ), $key );

$tmp = "";

for($i = 0; $i 

$md5 = substr ( $txt, $i, 1 );

$i ++;

$tmp .= (substr ( $txt, $i, 1 ) ^ $md5);

}

return $tmp;

}

}

?>

GToken.inc.php

/**

* 原理:请求分配token的时候,想办法分配一个唯一的token, base64( time + rand + action)

* 如果提交,将这个token记录,说明这个token以经使用,可以跟据它来避免重复提交。

*

*/

class GToken {

/**

* 得到当前所有的token

*

* @return array

*/

public static function getTokens(){

$tokens = $_SESSION[GConfig::SSN_KEY_TOKEN ];

if (empty($tokens) && !is_array($tokens)) {

$tokens = array();

}

return $tokens;

}

/**

* 产生一个新的Token

*

* @param string $formName

* @param 加密密钥 $key

* @return string

*/

public static function newToken($formName,$key = GConfig::ENCRYPT_KEY ){

$token = GEncrypt::encrypt($formName.session_id(),$key);

return $token;

}

/**

* 删除token,实际是向session 的一个数组里加入一个元素,说明这个token以经使用过,以避免数据重复提交。

*

* @param string $token

*/

public static function dropToken($token){

$tokens = self::getTokens();

$tokens[] = $token;

GSession::set(GConfig::SESSION_KEY_TOKEN ,$tokens);

}

/**

* 检查是否为指定的Token

*

* @param string $token 要检查的token值

* @param string $formName

* @param boolean $fromCheck 是否检查来路,如果为true,会判断token中附加的session_id是否和当前session_id一至.

* @param string $key 加密密钥

* @return boolean

*/

public static function isToken($token,$formName,$fromCheck = false,$key = GConfig::ENCRYPT_KEY){

if(empty($token)) return false;

$tokens = self::getTokens();

if (in_array($token,$tokens)) //如果存在,说明是以使用过的token

return false;

$source = GEncrypt::decrypt($token,$key);

if($fromCheck)

return $source == $formName.session_id();

else{

return strpos($source,$formName) === 0;

}

}

public static function getTokenKey($token,$key = GConfig::ENCRYPT_KEY){

if($token == null || trim($token) == "") return false;

$source = GEncrypt::decrypt($token,$key);

return $source != "" ? str_replace(session_id(),"",$source) : false;

}

public function newTokenForSmarty($params){

$form = null;

extract($params);

return self::newToken($form);

}

}

?>

相关文章

网站文章

  • Linux环境变量配置

    当前用户的PAM环境配置文件,用于设置当前用户的环境变量和启动Shell时需要执行的命令,它也可以影响其他应用程序。当前用户的Bash Shell的配置文件,用于设置当前用户的环境变量和启动Shell...

    2024-02-29 14:00:26
  • 7-3 选择法排序 (25 分)

    本题要求将给定的n个整数从大到小排序后输出。 输入格式: 输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。 输出格式: 在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。 输入样例: 4 5 1 7 6 输出样例: 7 6 5 1 #include int main() { int n,i,k; scanf("...

    2024-02-29 14:00:19
  • Java向上转型与向下转型 最新发布

    Java向上转型与向下转型 最新发布

    ② 为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。有了对象的多态性以后,内存中实际上是加载...

    2024-02-29 14:00:03
  • Mysql身份认证绕过漏洞(CVE-2012-2122)复现

    Mysql身份认证绕过漏洞(CVE-2012-2122)复现

    当连接MariaDB/MySQL时,输入的密码会与期望的正确密码比较,由于不正确的处理,会导致即便是memcmp()返回一个非零值,也会使MySQL认为两个密码是相同的。也就是说只要知道用户名,不断尝试就能够直接登入SQL数据库。

    2024-02-29 13:59:33
  • 分布式CAP原理:一致性、可用性、分区容错

    分布式CAP原理:一致性、可用性、分区容错

    CAP概念 单机系统由于所有的处理都在单机完成的,所以不存在数据一致性问题,但是如果系统崩溃了,就导致服务不可用。 分布式系统可以实现服务的高可用,现有的大型网站几乎都是分布式的,特别是微服务的出现,...

    2024-02-29 13:59:29
  • foreachRDD

    需求: 将统计结果写入到MySQLcreate table wordcount( word varchar(50) default null, wordcount int(10) default null);通过该sql将统计结果写入到MySQL "insert into wordcount(word, wordcount) vlaues('" + record._1 +...

    2024-02-29 13:59:20
  • poj 1326 Mileage Bank【四舍五入】

    说实话,这道题虽然不难,但是考人的点还是有的,我WA了一次,后来检查发现了两个错误,看网上的结题报告,发现基本每个人都错了很多次。。。这说明不只是不仔细这么简单。。。 这道题有两个考人的点: 1.1-500 miles 就说明了 0miles 就不能算跑了路,如果出现 0miles 得算0处理 2.就是四舍五入的地方,只可能出现在 “B” 中,任何整数乘以1.5,只可

    2024-02-29 13:59:12
  • leetcode144/102/103 二叉树的各种遍历节点

    二叉树的遍历节点算法题有几种类型:前/中/后序遍历 层序遍历 Z型层序遍历前/中/后序遍历首先从前中后序遍历来看,三者的代码基本一致,就是不同顺序代码的顺序也换换。前序是根节点第一个也就是最先遍历,中...

    2024-02-29 13:58:42
  • 高性能高并发商品秒杀系统设计与优化

    高性能高并发商品秒杀系统设计与优化

    本项目主要是模拟应对大并发场景下,如何完成商品的秒杀,以及针对秒杀场景下为应对大并发所做的优化。项目的技术结构如下图所示:分布式会话用户登录、商品列表、商品详情、订单详情模块缓存优化系统压测,测试系统的QPS信息队列接口安全GitHub - Grootzz/dis-seckill: :punch:SpringBoot+Zookeeper+Dubbo打造分布式高并发商品秒杀系统。

    2024-02-29 13:58:35
  • 哈工大软件构造第十章总结

    哈工大软件构造第十章总结

    本章讲解面向可维护性的编程概念,通过合理的设计来让软件能够以较小的代价完成更新来适应新的需求。

    2024-02-29 13:58:29