PHP Token(令牌)設(shè)計(jì)_PHP教程
推薦:如何用php過(guò)濾危險(xiǎn)html代碼用PHP過(guò)濾html里可能被利用來(lái)引入外部危險(xiǎn)內(nèi)容的代碼。有些時(shí)候,需要讓用戶(hù)提交html內(nèi)容,以便豐富用戶(hù)發(fā)布的信息,當(dāng)然,有些可能造成顯示頁(yè)面布局混亂的代碼也在過(guò)濾范圍內(nèi)。 #用戶(hù)發(fā)布的html,過(guò)濾危險(xiǎn)代碼 function uh(str) { farr = array( /\s+/, //
PHP Token(令牌)設(shè)計(jì)
設(shè)計(jì)目標(biāo):
- 避免重復(fù)提交數(shù)據(jù).
- 檢查來(lái)路,是否是外部提交
- 匹配要執(zhí)行的動(dòng)作(如果有多個(gè)邏輯在同一個(gè)頁(yè)面實(shí)現(xiàn),比如新增,刪除,修改放到一個(gè)PHP文件里操作)
這里所說(shuō)的token是在頁(yè)面顯示的時(shí)候,寫(xiě)到FORM的一個(gè)隱藏表單項(xiàng)(type=hidden).
token不可明文,如果是明文,那就太危險(xiǎn)了,所以要采用一定的加密方式.密文要可逆.俺算法很白癡,所以采用了網(wǎng)上一個(gè)現(xiàn)成的方法.
如何達(dá)到目的:
- 怎樣避免重復(fù)提交?
在SESSION里要存一個(gè)數(shù)組,這個(gè)數(shù)組存放以經(jīng)成功提交的token.在后臺(tái)處理時(shí),先判斷這個(gè)token是否在這個(gè)數(shù)組里,如果存在,說(shuō)明是重復(fù)提交. - 如何檢查來(lái)路?
可選項(xiàng),這個(gè)token在生成的時(shí)候,加入了當(dāng)前的session_id.如果別人copy你的html(token一迸copy),在提交時(shí),理論上token里包含的session_id不等于當(dāng)前session_id,就可以判斷這次提交是外部提交. - 如何匹配要執(zhí)行的動(dòng)作?
在token的時(shí)候,要把這個(gè)token的動(dòng)作名稱(chēng)寫(xiě)進(jìn)這個(gè)token里,這樣,在處理的時(shí)候,把這個(gè)動(dòng)作解出來(lái)進(jìn)行比較就行了.
我以前寫(xiě)的GToken不能達(dá)到上面所說(shuō)的第二條,今天修改了一下,把功能2加上了.個(gè)人感覺(jué)還行.
請(qǐng)大家看代碼,感覺(jué)哪里有不合理的地方,還請(qǐng)賜教!謝謝.
加密我是找的網(wǎng)上的一個(gè)方法,稍作了一下修改.
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;
}
}
?>
分享:php實(shí)現(xiàn)頁(yè)面GZIP壓縮輸出餅干是這樣壓縮的——PHP使用zlib擴(kuò)展實(shí)現(xiàn)頁(yè)面GZIP壓縮輸出 GZIP(GNU-ZIP)是一種壓縮技術(shù)。經(jīng)過(guò)GZIP壓縮后頁(yè)面大小可以變?yōu)樵瓉?lái)的30%甚至更
- PHPNOW安裝Memcached擴(kuò)展方法詳解
- php記錄頁(yè)面代碼執(zhí)行時(shí)間
- PHP中獎(jiǎng)概率的抽獎(jiǎng)算法程序代碼
- apache設(shè)置靜態(tài)文件緩存方法介紹
- php對(duì)圖像的各種處理函數(shù)代碼小結(jié)
- PHP 關(guān)于訪(fǎng)問(wèn)控制的和運(yùn)算符優(yōu)先級(jí)介紹
- 關(guān)于PHP語(yǔ)言構(gòu)造器介紹
- php/js獲取客戶(hù)端mac地址的實(shí)現(xiàn)代碼
- php5.5新數(shù)組函數(shù)array_column使用
- PHP preg_match的匹配多國(guó)語(yǔ)言的技巧
- php 中序列化和json使用介紹
- php采集文章中的圖片獲取替換到本地
PHP教程Rss訂閱編程教程搜索
PHP教程推薦
- php環(huán)境搭建:PHPnow綠色PHP環(huán)境包
- PHP使用PDO連接Access的方法
- php.ini中文版說(shuō)明
- PHP的print函數(shù)
- 網(wǎng)站模板:web上存漏洞及原理分析、防范方法
- 給wordpress 增加干擾碼防采集
- 淺談PHP中的一些常識(shí):類(lèi)篇
- PHP實(shí)用:用PHP來(lái)實(shí)現(xiàn)圖片的簡(jiǎn)單上傳
- mongo Table類(lèi)文件 獲取MongoCursor(游標(biāo))的實(shí)現(xiàn)方法分析
- 小結(jié):PHP動(dòng)態(tài)網(wǎng)頁(yè)程序兩個(gè)有用的小技巧
- 相關(guān)鏈接:
- 教程說(shuō)明:
PHP教程-PHP Token(令牌)設(shè)計(jì)
。