濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > PHP基于timestamp和nonce實(shí)現(xiàn)的防止重放攻擊方案分析

PHP基于timestamp和nonce實(shí)現(xiàn)的防止重放攻擊方案分析

熱門標(biāo)簽:外呼系統(tǒng)撥打暫時(shí)無(wú)法接通 高德地圖標(biāo)注家 哪里辦理400電話 江西手機(jī)自動(dòng)外呼防封系統(tǒng)是什么 廣州防封卡外呼系統(tǒng)多少錢一個(gè)月 長(zhǎng)春人工外呼系統(tǒng)服務(wù)商 廣東地市地圖標(biāo)注 仁和怎么申請(qǐng)400開頭的電話 怎么向銷售公司推銷外呼系統(tǒng)

本文實(shí)例講述了PHP基于timestamp和nonce實(shí)現(xiàn)的防止重放攻擊方案。分享給大家供大家參考,具體如下:

以前總是通過timestamp來(lái)防止重放攻擊,但是這樣并不能保證每次請(qǐng)求都是一次性的。今天看到了一篇文章介紹的通過nonce(Number used once)來(lái)保證一次有效,感覺兩者結(jié)合一下,就能達(dá)到一個(gè)非常好的效果了。

重放攻擊是計(jì)算機(jī)世界黑客常用的攻擊方式之一,所謂重放攻擊就是攻擊者發(fā)送一個(gè)目的主機(jī)已接收過的包,來(lái)達(dá)到欺騙系統(tǒng)的目的,主要用于身份認(rèn)證過程。

首先要明確一個(gè)事情,重放攻擊是二次請(qǐng)求,黑客通過抓包獲取到了請(qǐng)求的HTTP報(bào)文,然后黑客自己編寫了一個(gè)類似的HTTP請(qǐng)求,發(fā)送給服務(wù)器。也就是說(shuō)服務(wù)器處理了兩個(gè)請(qǐng)求,先處理了正常的HTTP請(qǐng)求,然后又處理了黑客發(fā)送的篡改過的HTTP請(qǐng)求。

基于timestamp的方案

每次HTTP請(qǐng)求,都需要加上timestamp參數(shù),然后把timestamp和其他參數(shù)一起進(jìn)行數(shù)字簽名。因?yàn)橐淮握5腍TTP請(qǐng)求,從發(fā)出到達(dá)服務(wù)器一般都不會(huì)超過60s,所以服務(wù)器收到HTTP請(qǐng)求之后,首先判斷時(shí)間戳參數(shù)與當(dāng)前時(shí)間相比較,是否超過了60s,如果超過了則認(rèn)為是非法的請(qǐng)求。

假如黑客通過抓包得到了我們的請(qǐng)求url:
http://koastal.site/index/Info?uid=ZX07stime=1480862753sign=80b886d71449cb33355d017893720666

其中

$sign=md5($uid.$token.$stime);
// 服務(wù)器通過uid從數(shù)據(jù)庫(kù)中可讀出token

一般情況下,黑客從抓包重放請(qǐng)求耗時(shí)遠(yuǎn)遠(yuǎn)超過了60s,所以此時(shí)請(qǐng)求中的stime參數(shù)已經(jīng)失效了。
如果黑客修改stime參數(shù)為當(dāng)前的時(shí)間戳,則sign參數(shù)對(duì)應(yīng)的數(shù)字簽名就會(huì)失效,因?yàn)楹诳筒恢纓oken值,沒有辦法生成新的數(shù)字簽名。

但這種方式的漏洞也是顯而易見的,如果在60s之內(nèi)進(jìn)行重放攻擊,那就沒辦法了,所以這種方式不能保證請(qǐng)求僅一次有效。

基于nonce的方案

nonce的意思是僅一次有效的隨機(jī)字符串,要求每次請(qǐng)求時(shí),該參數(shù)要保證不同,所以該參數(shù)一般與時(shí)間戳有關(guān),我們這里為了方便起見,直接使用時(shí)間戳的16進(jìn)制,實(shí)際使用時(shí)可以加上客戶端的ip地址,mac地址等信息做個(gè)哈希之后,作為nonce參數(shù)。
我們將每次請(qǐng)求的nonce參數(shù)存儲(chǔ)到一個(gè)“集合”中,可以json格式存儲(chǔ)到數(shù)據(jù)庫(kù)或緩存中。
每次處理HTTP請(qǐng)求時(shí),首先判斷該請(qǐng)求的nonce參數(shù)是否在該“集合”中,如果存在則認(rèn)為是非法請(qǐng)求。

假如黑客通過抓包得到了我們的請(qǐng)求url:
http://koastal.site/index/Info?uid=ZX07nonce=58442c21sign=80b886d71449cb33355d017893720666

其中

$sign=md5($uid.$token.$nonce);
// 服務(wù)器通過uid從數(shù)據(jù)庫(kù)中可讀出token

nonce參數(shù)在首次請(qǐng)求時(shí),已經(jīng)被存儲(chǔ)到了服務(wù)器上的“集合”中,再次發(fā)送請(qǐng)求會(huì)被識(shí)別并拒絕。
nonce參數(shù)作為數(shù)字簽名的一部分,是無(wú)法篡改的,因?yàn)楹诳筒磺宄oken,所以不能生成新的sign。

這種方式也有很大的問題,那就是存儲(chǔ)nonce參數(shù)的“集合”會(huì)越來(lái)越大,驗(yàn)證nonce是否存在“集合”中的耗時(shí)會(huì)越來(lái)越長(zhǎng)。我們不能讓nonce“集合”無(wú)限大,所以需要定期清理該“集合”,但是一旦該“集合”被清理,我們就無(wú)法驗(yàn)證被清理了的nonce參數(shù)了。也就是說(shuō),假設(shè)該“集合”平均1天清理一次的話,我們抓取到的該url,雖然當(dāng)時(shí)無(wú)法進(jìn)行重放攻擊,但是我們還是可以每隔一天進(jìn)行一次重放攻擊的。而且存儲(chǔ)24小時(shí)內(nèi),所有請(qǐng)求的“nonce”參數(shù),也是一筆不小的開銷。

基于timestamp和nonce的方案

那我們?nèi)绻瑫r(shí)使用timestamp和nonce參數(shù)呢?
nonce的一次性可以解決timestamp參數(shù)60s的問題,timestamp可以解決nonce參數(shù)“集合”越來(lái)越大的問題。

我們?cè)趖imestamp方案的基礎(chǔ)上,加上nonce參數(shù),因?yàn)閠imstamp參數(shù)對(duì)于超過60s的請(qǐng)求,都認(rèn)為非法請(qǐng)求,所以我們只需要存儲(chǔ)60s的nonce參數(shù)的“集合”即可。

假如黑客通過抓包得到了我們的請(qǐng)求url:
http://koastal.site/index/Info?uid=ZX07stime=1480862753nonce=58442c21sign=80b886d71449cb33355d017893720666

其中

$sign=md5($uid.$token.$stime.$nonce);
// 服務(wù)器通過uid從數(shù)據(jù)庫(kù)中可讀出token

如果在60s內(nèi),重放該HTTP請(qǐng)求,因?yàn)閚once參數(shù)已經(jīng)在首次請(qǐng)求的時(shí)候被記錄在服務(wù)器的nonce參數(shù)“集合”中,所以會(huì)被判斷為非法請(qǐng)求。超過60s之后,stime參數(shù)就會(huì)失效,此時(shí)因?yàn)楹诳筒磺宄oken的值,所以無(wú)法重新生成簽名。

綜上,我們認(rèn)為一次正常的HTTP請(qǐng)求發(fā)送不會(huì)超過60s,在60s之內(nèi)的重放攻擊可以由nonce參數(shù)保證,超過60s的重放攻擊可以由stime參數(shù)保證。

因?yàn)閚once參數(shù)只會(huì)在60s之內(nèi)起作用,所以只需要保存60s之內(nèi)的nonce參數(shù)即可。

我們并不一定要每個(gè)60s去清理該nonce參數(shù)的集合,只需要在新的nonce到來(lái)時(shí),判斷nonce集合最后一次修改時(shí)間,超過60s的話,就清空該集合,存放新的nonce參數(shù)集合。其實(shí)nonce參數(shù)集合可以存放的時(shí)間更久一些,但是最少是60s。
隨機(jī)數(shù)集合可以根據(jù)業(yè)務(wù)場(chǎng)景采用定期清理或根據(jù)大小自動(dòng)清理的方案,例如該接口每秒的請(qǐng)求數(shù)最高為1000,則60s內(nèi)的請(qǐng)求數(shù)量最多為1500*60=90000,則我們?cè)诿看握?qǐng)求后檢查集合大小是否超過90000,若超高該數(shù)量則清空。

驗(yàn)證流程

//判斷stime參數(shù)是否有效
if( $now - $stime > 60){
  die("請(qǐng)求超時(shí)");
}
//判斷nonce參數(shù)是否在“集合”已存在
if( in_array($nonce,$nonceArray) ){
  die("請(qǐng)求僅一次有效");
}
//驗(yàn)證數(shù)字簽名
if ( $sign != md5($uid.$token.$stime.$nonce) ){
  die("數(shù)字簽名驗(yàn)證失敗");
}
/*
if( $now - $nonceArray->lastModifyTime > 60 ){
  $nonceArray = null;
}
$nonceArray.push($nonce);
*/
//處理隨機(jī)數(shù)
$key = 'nonce'+$uid;
if($redis->sismember($key,$nonce) === true){
  die('拒絕重放攻擊請(qǐng)求');
}
if($redis->scard($key) > 90000){
  $redis->del($key);
}
$redis->sadd($key,$nonce);
//重放攻擊檢查完成

參考文章:

http://www.360doc.com/content/14/0116/16/834950_345740386.shtml

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php程序設(shè)計(jì)安全教程》、《php安全過濾技巧總結(jié)》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《PHP基本語(yǔ)法入門教程》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見數(shù)據(jù)庫(kù)操作技巧匯總》

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

您可能感興趣的文章:
  • JWT + ASP.NET MVC時(shí)間戳防止重放攻擊詳解
  • .NET添加時(shí)間戳防止重放攻擊
  • PHP中防止SQL注入攻擊和XSS攻擊的兩個(gè)簡(jiǎn)單方法
  • php防止CC攻擊代碼 php防止網(wǎng)頁(yè)頻繁刷新
  • php防止sql注入示例分析和幾種常見攻擊正則表達(dá)式
  • php實(shí)現(xiàn)cc攻擊防御和防止快速刷新頁(yè)面示例
  • php防止網(wǎng)站被攻擊的應(yīng)急代碼
  • PHP中通過語(yǔ)義URL防止網(wǎng)站被攻擊的方法分享
  • PHP實(shí)現(xiàn)的防止跨站和xss攻擊代碼【來(lái)自阿里云】
  • 淺析PHP程序防止ddos,dns,集群服務(wù)器攻擊的解決辦法
  • PHP防止注入攻擊實(shí)例分析
  • PHP如何防止XSS攻擊與XSS攻擊原理的講解

標(biāo)簽:湘西 文山 黔東 海北 惠州 梅河口 濮陽(yáng) 廈門

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP基于timestamp和nonce實(shí)現(xiàn)的防止重放攻擊方案分析》,本文關(guān)鍵詞  PHP,基于,timestamp,和,nonce,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PHP基于timestamp和nonce實(shí)現(xiàn)的防止重放攻擊方案分析》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于PHP基于timestamp和nonce實(shí)現(xiàn)的防止重放攻擊方案分析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    麟游县| 抚宁县| 汉沽区| 红桥区| 九台市| 邹城市| 奉新县| 乐清市| 嘉荫县| 邳州市| 共和县| 桃江县| 土默特右旗| 固阳县| 奎屯市| 隆回县| 三都| 修武县| 娄烦县| 梁山县| 清镇市| 台北市| 古田县| 荥经县| 安图县| 嘉善县| 南靖县| 涡阳县| 黑龙江省| 万载县| 商河县| 永平县| 米脂县| 黑水县| 抚州市| 黔南| 萨迦县| 晋城| 肥东县| 两当县| 察哈|