轉載連結:http://www.jb51.net/article/13756.htm
PHP Token(令牌)設計設計目標: 避免重複提交資料. 檢查來路,是否是外部提交匹配要執行的動作(如果有多個邏輯在同一個頁面實現,比如新增,刪除,修改放到一個PHP檔案裡操作) 這裡所說的token是在頁面顯示的時候,寫到FORM的一個隱藏表單項目(type=hidden ). token不可明文,如果是明文,那就太危險了,所以要採用一定的加密方式.密文要可逆.俺算法很白痴,所以採用了網上一個現成的方法.
怎樣避免重複提交?
在SESSION裡要存一個數組,這個數組存放以經成功提交的token.在後台處理時,先判斷這個token是否在這個數組裡,如果存在,說明是重複提交.
如何檢查來路?
可選項,這個token在生成的時候,加入了當前的session_id.如果別人copy你的html(token一迸copy),在提交時,理論上token裡包含的session_id不等於當前session_id,就可以判斷這次提交是外部提交.
如何匹配要執行的動作?
在token的時候,要把這個token的動作名稱寫進這個token裡,這樣,在處理的時候,把這個動作解出來進行比較就行了.
GEncrypt.inc. php:
<?php class GEncrypt extends GSuperclass { protected static function keyED($txt,$encrypt_key){ $encrypt_key = md5($encrypt_key); $ctr=0; $tmp = ""; for ($i=0;$i<strlen($txt);$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(rand(0,32000)); $encrypt_key = md5(((float) date("YmdHis") + rand(10000000000000000,99999999999999999)).rand(100000,999999)); $ctr=0; $tmp = ""; for ($i=0;$i<strlen($txt);$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 base64_encode(self::keyED($tmp,$key)); } public static function decrypt($txt,$key){ $txt = self::keyED( base64_decode($txt),$key); $tmp = ""; for ($i=0;$i<strlen($txt);$i++){ $md5 = substr($txt,$i,1); $i++; $tmp.= (substr($txt,$i,1) ^ $md5); } return $tmp; } } ?>方法:
(1)granteToken 參數:formName,即動作名稱,key是加密/解密 密鑰.
回傳一個字串,形式是: 加密(formName:session_id)
(2)isToken 參數:token 即granteToken產生的結果,formName,動作名稱,fromCheck是否檢查來路,如果為真,還要判斷token裡的session_id是否和當前的session_id一至.
(3)dropToken,當成功執行一個動作後,調用這個函數,把這個token記入session裡,
GToken.inc.php
<?php /** * 原理:请求分配token的时候,想办法分配一个唯一的token, base64( time + rand + action) * 如果提交,将这个token记录,说明这个token以经使用,可以跟据它来避免重复提交。 * */ class GToken { /** * 得到当前所有的token * * @return array */ public static function getTokens(){ $tokens = $_SESSION[GConfig::SESSION_KEY_TOKEN ]; if (empty($tokens) && !is_array($tokens)) { $tokens = array(); } return $tokens; } /** * 产生一个新的Token * * @param string $formName * @param 加密密钥 $key * @return string */ public static function granteToken($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){ $tokens = self::getTokens(); if (in_array($token,$tokens)) //如果存在,说明是以使用过的token return false; $source = split(":", GEncrypt::decrypt($token,$key)); if($fromCheck) return $source[1] == session_id() && $source[0] == $formName; else return $source[0] == $formName; } } ?>
從$_POST裡拿出token,用isToken判斷.
如果想取出是否是執行的配對動作,可以把isToken裡的formName改一下,運行,很好,沒有匹配上.證明這個成功.
以上就介紹了PHP Token(令牌)設計,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

问题发现springboot项目生产session-out超时问题,描述下问题:在测试环境通过改动application.yaml配置session-out,经过设置不同时间验证session-out配置生效,于是就直接设置了过期时间为8小时发布到了生产环境。然而中午接到客户反应项目过期时间设置较短,半小时不操作就会话过期需要反复登陆。解决处理开发环境:springboot项目内置Tomcat,所以项目中application.yaml配置session-out是生效的。生产环境:生产环境发布是

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。详细介绍:1、检查Token是否过期,登录Token通常会设置有效期,一旦超过有效期,就会被认为无效等等。

登录token无效问题可以通过检查网络连接、检查token有效期、清除缓存和Cookie、检查登录状态、联系应用程序开发者和加强账号安全来解决。详细介绍:1、检查网络连接,重新连接网络或者更换网络环境;2、检查token有效期,重新获取一个新的token,或者联系应用程序的开发者;3、清除缓存和Cookie,清除浏览器缓存和Cookie,然后重新登录应用程序;4、检查登录状态。

php session刷新后没有了的解决办法:1、通过“session_start();”开启session;2、把所有的公共配置写在一个php文件内;3、变量名不能和数组下标相同;4、在phpinfo里面查看session数据的存储路径,并查看该文件目录下的sessio是否保存成功即可。

session php默认失效时间是1440秒,也就是24分钟,表示客户端超过24分钟没有刷新,当前session就会失效;如果用户关闭了浏览器,会话就会结束,Session就不存在了。

Redis存储用户token在设计类似电商的系统时,一个常见的需求是每个页面都需要携带登录用户信息。常见的解决方法有两种:使用cookie保存使用JWT保存但如果系统中使用了Redis缓存,那么还可以有第三种解决方案–将用户token缓存在Redis中。登陆时生成一个token存入Redis//生成一个token对象,保存在redis中redisTemplate.opsForHash().put("token","user",user)

问题:今天项目中遇到了一个设置时间超时的问题,按SpringBoot2的application.properties更改一直不生效。解决方案:server.*属性用于控制SpringBoot使用的嵌入式容器。SpringBoot将使用ServletWebServerFactory实例之一创建servlet容器的实例。这些类使用server.*属性来配置受控的servlet容器(tomcat,jetty等)。当应用程序作为war文件部署到Tomcat实例时,server.*属性不适用。它们不适用,

一、token登录鉴权jwt:JSONWebToken。是一种认证协议,一般用来校验请求的身份信息和身份权限。由三部分组成:Header、Hayload、Signatureheader:也就是头部信息,是描述这个token的基本信息,json格式{"alg":"HS256",//表示签名的算法,默认是HMACSHA256(写成HS256)"type":"JWT"//表示Token的类型,JWT令牌统一写为JWT}pa


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)