phptoken驗證
① php中的token怎麼用
token一般理解為通行證,經過各種演算法處理的唯一加密的字元串
比如用戶登錄,你只需cookie記錄用戶uid 和 token
token沒有超時的話,不用驗證密碼直接登錄
這樣也能保證用戶信息、密碼不被cookie竊取
② 安卓php開發token驗證怎麼加失效時間
<?php
$mole = $_GET['mole'];
$action = $_GET['action'];
$token = md5sum($mole.date('Y-m-d',time()).'#$@%!*'.$action);
if($token != $_GET['token']){
alarm('access deny');
exit();
}
?>
③ Thinkphp3.2.3接入公眾號響應微信發送的Token驗證總是失敗
用得著判斷那個TOKEN?是不是多此一舉,用我這個,包你滿意
<?php
namespaceHomeController;
useThinkController;
{
publicfunctionindex(){
$v=$_GET["echostr"];
if(!isset($v)){//根據隨機字元串判斷是否之前已經驗證過,避免重復驗證
$this->receive();
}else{
$this->checkSignature();
}
}
//未驗證執行驗證
publicfunctioncheckSignature(){
$signature=I("signature");//加密簽名
$timestamp=I("timestamp");//時間戳
$nonce=I("nonce");//隨機數
$token=TOKEN;//token
$tmpArr=array($token,$timestamp,$nonce);//組成新數組
sort($tmpArr,SORT_STRING);//重新排序
$tmpStr=implode($tmpArr);//轉換成字元串
$tmpStr=sha1($tmpStr);//再將字元串進行加密
if($tmpStr==$signature)
{
echo$_GET["echostr"];
exit;
//returntrue;
}else{
returnfalse;
}
}
//已經驗證過執行這里
publicfunctionreceive(){
$postStr=$GLOBALS["HTTP_RAW_POST_DATA"];//獲取用戶發送的消息,格式為xml
//$postStr=file_get_contents("php://input");
libxml_disable_entity_loader(true);
$postObj=simplexml_load_string($postStr,"SimpleXMLElement",LIBXML_NOCDATA);
$this->logger($postStr);
//並且回復信息給用戶
if(!empty($postObj)){
switch($postObj->MsgType){
case"text":
$result=$this->receiveText($postObj);
//避免錯誤信息報出
if(empty($result)){
$xml="<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),$postObj->MsgType,"多圖文信息沒有獲取到");
}
echo$result;
break;
case"image":
$result=$this->receiveImage($postObj);
if(empty($result)){
$xml="<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<ArticleCount>1</ArticleCount>
<Articles>
<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
</Articles>
</xml>";
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"news","跟老李一起來做微信開發","微信開發即微信公眾平台開發,將企業信息、服務、活動等內容通過微信網頁的方式進行表現,用戶通過簡單的設置,就能生成微信3G網站。通過微信公眾平台將企業品牌展示給微信用戶,減少宣傳成本,建立企業與消費者、客戶的一對一互動和溝通,將消費者接入企業CRM系統,進行促銷、推廣、宣傳、售後等。形成了一種主流的線上線下微信互動營銷方式。","https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/ke/w%3D268%3Bg%3D0/sign=/.jpg","http://www..com");
}
echo$result;
break;
case"event":
$result=$this->receiveEvent($postObj);
if(empty($result)){
$xml="<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","感謝您關注微信介面測試服務號,我是李先生!");
}
echo$result;
break;
default:
$result="你發送的數據類型暫時不做處理:".$postObj->MsgType;
echo$result;
break;
}
}
}
//log
privatefunctionlogger($content){
$logSize=100000;
$log="./log.txt";
if(file_exists($log)&&filesize($log)>$logSize){
unlink($log);
}
file_put_contents($log,date("Y-m-dH:i:s")."".$content." ",FILE_APPEND);
}
//關注自動回復信息
privatefunctionreceiveEvent($postObj){
$xml="<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
if($postObj->Event=="subscribe"){
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","感謝您關注微信介面測試服務號,我是李先生!");
}elseif($postObj->Event=="CLICK"){
if($postObj->EventKey=="getSalary"){
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","您點擊了【查詢->工資】按鈕");
}elseif($postObj->EventKey=="getAttendance"){
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","您點擊了【查詢->考勤記錄】按鈕");
}elseif($postObj->EventKey=="getBonus"){
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","您點擊了【查詢->獎金明細】按鈕");
}elseif($postObj->EventKey=="getAbout"){
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","您點擊了【關於我們->聯系】按鈕");
}elseif($postObj->EventKey=="getJoin"){
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","您點擊了【關於我們->加入我們】按鈕");
}elseif($postObj->EventKey=="getCustomer"){
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","您點擊了【關於我們->客服】按鈕");
}elseif($postObj->EventKey=="getInternational"){
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","您點擊了【新聞->國際】按鈕");
}elseif($postObj->EventKey=="getInstry"){
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","您點擊了【新聞->行業】按鈕");
}
}elseif($postObj->Event=="scancode_waitmsg"){
//掃碼帶提示的事件
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","您使用了掃碼帶提示事件,事件KEY:{$postObj->EventKey}");
}elseif($postObj->Event=="scancode_push"){
//掃碼推事件
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","您使用了掃碼推事件,事件KEY:{$postObj->EventKey}");
}else{
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"text","您的操作有點奇葩");
}
return$result;
}
//處理接收的文本信息並且回復給用戶
privatefunctionreceiveText($postObj){
$content=trim($postObj->Content);
//if(strstr($content,"你好")){
if(preg_match("/^d*$/",$content)){
//回復多圖文信息
$result=$this->receiveNews($postObj);
return$result;
}elseif($content=="圖片"){
//回復圖片信息
$xml="<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Image>
<MediaId><![CDATA[%s]]></MediaId>
</Image>
</xml>";
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"image","-");
return$result;
}else{
//回復文本信息
$xml="<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),$postObj->MsgType,$content);
return$result;
}
}
//處理接收的文本信息並且回復給用戶為單圖文信息
privatefunctionreceiveImage($postObj){
$xml="<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<ArticleCount>1</ArticleCount>
<Articles>
<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
</Articles>
</xml>";
$result=sprintf($xml,$postObj->FromUserName,$postObj->ToUserName,time(),"news","跟老李一起來做微信開發","微信開發即微信公眾平台開發,將企業信息、服務、活動等內容通過微信網頁的方式進行表現,用戶通過簡單的設置,就能生成微信3G網站。通過微信公眾平台將企業品牌展示給微信用戶,減少宣傳成本,建立企業與消費者、客戶的一對一互動和溝通,將消費者接入企業CRM系統,進行促銷、推廣、宣傳、售後等。形成了一種主流的線上線下微信互動營銷方式。","https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/ke/w%3D268%3Bg%3D0/sign=/.jpg","http://www..com");
return$result;
}
//處理接收的文本信息並且回復給用戶為多圖文信息
privatefunctionreceiveNews($postObj){
$con=array(
array("Title"=>"觀前街","Description"=>"hjhhj","PicUrl"=>"https://gss0..com/9fo3dSag_xI4khGko9WTAnF6hhy/image/pic/item/.jpg","Url"=>"https://gss0..com/9fo3dSag_xI4khGko9WTAnF6hhy/image/pic/item/.jpg"),
array("Title"=>"平江路","Description"=>"mkbkbjj","PicUrl"=>"http://imgtu.5011.net/uploads/content/shehui/wanxiang/2015-08-26/.jpg","Url"=>"http://imgtu.5011.net/uploads/content/shehui/wanxiang/2015-08-26/.jpg"),
array("Title"=>"觀前街","Description"=>"hjhhj","PicUrl"=>"http://img2.a0bi.com/upload/ttq/20160729/1469781927056.jpeg","Url"=>"http://img2.a0bi.com/upload/ttq/20160729/1469781927056.jpeg"),
array("Title"=>"平江路","Description"=>"mkbkbjj","PicUrl"=>"http://gaoxiao.zhutou.com/html/UploadPic/2010-3/201033173945493.jpg","Url"=>"http://gaoxiao.zhutou.com/html/UploadPic/2010-3/201033173945493.jpg"),
array("Title"=>"觀前街","Description"=>"hjhhj","PicUrl"=>"http://www.haha365.com/uploadfile/2013/0508/20130508102432191.jpg","Url"=>"http://www.haha365.com/uploadfile/2013/0508/20130508102432191.jpg"),
array("Title"=>"平江路","Description"=>"mkbkbjj","PicUrl"=>"http://img1.imgtn.bdimg.com/it/u=995757682,3656700920&fm=214&gp=0.jpg","Url"=>"http://img1.imgtn.bdimg.com/it/u=995757682,3656700920&fm=214&gp=0.jpg"),
array("Title"=>"觀前街","Description"=>"hjhhj","PicUrl"=>"http://down.laifu.com/tupian/201261510566.jpg","Url"=>"http://down.laifu.com/tupian/201261510566.jpg"),
array("Title"=>"平江路","Description"=>"mkbkbjj","PicUrl"=>"http://img.tupianzj.com/uploads/allimg/160528/9-16052Q54439-50.jpg","Url"=>"http://img.tupianzj.com/uploads/allimg/160528/9-16052Q54439-50.jpg")
);
$bodys="<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>";
$tpl2="";
foreach($conas$key=>$newArray){
$tpl2.=sprintf($bodys,$newArray["Title"],$newArray["Description"],$newArray["PicUrl"],$newArray["Url"]);
}
$fromUsername=$postObj->FromUserName;
$toUsername=$postObj->ToUserName;
$tpl1="<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<ArticleCount>%s</ArticleCount>
<Articles>";
$tpl3="</Articles>
</xml>";
$tpl1=sprintf($tpl1,$fromUsername,$toUsername,time(),"news",count($con));
$result=$tpl1.$tpl2.$tpl3;
return$result;
}
}
④ php介面怎樣安全接收並驗證token
<?php
/*
*PHP簡單利用token防止表單重復提交
*此處理方法純粹是為了給初學者參考
*/
session_start();
functionset_token(){
$_SESSION[『token』]=md5(microtime(true));
}
functionvalid_token(){
$return=$_REQUEST[『token』]===$_SESSION[『token』]?true:false;
set_token();
return$return;
}
//如果token為空則生成一個token
if(!isset($_SESSION[『token』])||$_SESSION[『token』]==」){
set_token();
}
if(isset($_POST[『test』])){
if(!valid_token()){
echo"tokenerror";
}else{
echo『成功提交,Value:』.$_POST[『test』];
}
}
?>
<formmethod="post"action="">
<inputtype="hidden"name="token"value="<?phpecho$_SESSION[『token』]?>">
<inputtype="text"name="test"value="Default">
<inputtype="submit"value="提交"/>
</form>
⑤ PHP在控制器中怎麼添加token驗證,具體代碼 謝謝
//獲得token
privatefunctiongetToken(){
$tokenName=C('TOKEN_NAME',null,'__hash__');
$tokenType=C('TOKEN_TYPE',null,'md5');
if(!isset($_SESSION[$tokenName])){
$_SESSION[$tokenName]=array();
}
//標識當前頁面唯一性
$tokenKey=md5($_SERVER['REQUEST_URI']);
if(isset($_SESSION[$tokenName][$tokenKey])){//相同頁面不重復生成session
$tokenValue=$_SESSION[$tokenName][$tokenKey];
}else{
$tokenValue=is_callable($tokenType)?$tokenType(microtime(true)):md5(microtime(true));
$_SESSION[$tokenName][$tokenKey]=$tokenValue;
if(IS_AJAX&&C('TOKEN_RESET',null,true))
header($tokenName.':'.$tokenKey.'_'.$tokenValue);//ajax需要獲得這個header並替換頁面中meta中的token值
}
returnarray($tokenName,$tokenKey,$tokenValue);
}
⑥ 程序員應該如何設計更優雅的Token認證方式
通過上一篇你大體已經了解session和cookie認證了,session認證需要服務端做大量的工作來保證session信息的一致性以及session的存儲,所以現代的web應用在認證的解決方案上更傾向於客戶端方向,cookie認證是基於客戶端方式的,但是cookie缺點也很明顯,到底有哪些缺點可以跳轉上一次的文章。那有沒有一種比較折中的方案呢?有的
把認證信息保存在客戶端,關鍵點就是安全的驗證,如果能解決認證信息的安全性問題,完全可以把認證信息保存在客戶端,服務端完全無認證狀態,這樣的話服務端擴展起來要方便很多。關於信息的安全解決方案,現在普遍的做法就是簽名機制,像微信公眾介面的驗證方式就基於簽名機制。
當用戶成功登陸系統並成功驗證有效之後,伺服器會利用某種機制產生一個token字元串,這個token中可以包含很多信息,例如來源IP,過期時間,用戶信息等, 把這個字元串下發給客戶端,客戶端在之後的每次請求中都攜帶著這個token,攜帶方式其實很自由,無論是cookie方式還是其他方式都可以,但是必須和服務端協商一致才可以。當然這里我不推薦cookie。當服務端收到請求,取出token進行驗證(可以驗證來源ip,過期時間等信息),如果合法則允許進行操作。
基於token的驗證方式也是現代互聯網普通使用的認證方式,那它有什麼優點嗎?
1. 支持跨域訪問,Cookie是不允許垮域訪問的,這一點對Token機制是不存在的,前提是傳輸的用戶認證信息通過HTTP頭傳輸.
2. 無狀態:Token機制在服務端不需要存儲session信息,因為Token自身包含了所有登錄用戶的信息,只需要在客戶端的cookie或本地介質存儲狀態信息.
3. 解耦 不需要綁定到一個特定的身份驗證方案。Token可以在任何地方生成,只要在你的API被調用的時候,你可以進行Token生成調用即可.
4. 適用性更廣:只要是支持http協議的客戶端,就可以使用token認證。
5. 服務端只需要驗證token的安全,不必再去獲取登錄用戶信息,因為用戶的登錄信息已經在token信息中。
6. 基於標准化:你的API可以採用標准化的 JSON Web Token (JWT). 這個標准已經存在多個後端庫(.NET, Ruby, Java,Python,PHP)和多家公司的支持(如:Firebase,Google, Microsoft).
那基於token的認證方式有哪些缺點呢?
1. 網路傳輸的數據量增大:由於token中存儲了大量的用戶和安全相關的信息,所以比單純的cookie信息要大很多,傳輸過程中需要消耗更多流量,佔用更多帶寬,
2. 和所有的客戶端認證方式一樣,如果想要在服務端控制token的注銷有難度,而且也很難解決客戶端的劫持問題。
3. 由於token信息在服務端增加了一次驗證數據完整性的操作,所以比session的認證方式增加了cpu的開銷。
但是整體來看,基於token的認證方式還是比session和cookie方式要有很大優勢。在所知的token認證中,jwt是一種優秀的解決方案
一個JWT實際上就是一個字元串,它由三部分組成,頭部、載荷與簽名。
header典型的由兩部分組成:token的類型(「JWT」)和演算法名稱(比如:HMAC SHA256或者RSA等等)。
Payload 部分也是一個JSON對象,用來存放實際需要傳遞的數據。JWT 規定了7個官方欄位,供選用。
除了以上欄位之外,你完全可以添加自己想要的任何欄位,這里還是提醒一下,由於jwt的標准,信息是不加密的,所以一些敏感信息最好不要添加到json裡面
為了得到簽名部分,你必須有編碼過的header、編碼過的payload、一個秘鑰(這個秘鑰只有服務端知道),簽名演算法是header中指定的那個,然對它們簽名即可。
算出簽名以後,把 Header、Payload、Signature 三個部分拼成一個字元串,每個部分之間用"點"(.)分隔,就可以返回給用戶。需要提醒一下:base64是一種編碼方式,並非加密方式。
基於token的認證方式,大體流程為:
這里再重復一次,無論是token認證,cookie認證,還是session認證,一旦別人拿到客戶端的標識,還是可以偽造操作。所以採用任何一種認證方式的時候請考慮加入來源ip或者白名單,過期時間,另外有條件的情況下一定要使用https。
⑦ thinkphp5微信伺服器配置問題,為什麼一直驗證不了token
首先你要看一下你微信填寫的url是不是正確,然後在那個url下官方要求的那些個欄位要字典排序
⑧ php token 是什麼東西,有什麼作用,具體要怎麼實現 希望配合代碼解釋
token可以用來作登陸驗證的。比如做微信公眾號開發,一般他們會在用戶使用微信登陸的時候,生成一個唯一的token,來標記這個用戶登陸的狀態。這個token是生成的唯一標識,所以裡面不攜帶用戶的信息。這樣就降低用戶用戶名密碼的被竊取的風險性。實現你可以根據用戶的id以及固定的字元串加上時間戳來生成,像存用戶名密碼一樣存起來,你也可以給這個token設置一個過期時間,到期重新生成一個token。
⑨ php給app開發介面的token機制
破解確實是個問題,不過一般情況下,破解是需要時間的,你可以給token加一個過期時間,比如兩個小時,一般情況下,兩個小時是不足以破解一個密碼的。加密演算法的話,可以根據自己的習慣選擇。
⑩ 微信平台 php 示例 token驗證失敗
你的伺服器沒有正確響應Token驗證,請閱讀消息介面使用指南這樣回頭檢查一下各項配置是否正確。如果確定配置沒有問題,請按下面的方法檢查2.請求URL超時你的伺服器在國外,或者伺服器網速不給力,一般多試幾次就可以了。如果經常這樣,就需要考慮更換伺服器3.提交成功恭喜你,配置成功了。這是一種方法 詳細圖文教程和其他幾種方法你可以訪問這個鏈接希望可以幫到你