PHP安全:保障內(nèi)容安全
除了Web系統(tǒng)本身不要出現(xiàn)漏洞而被攻擊者利用外,還需要將內(nèi)容數(shù)據(jù)安全地送達(dá)給用戶,并且用戶安全地接收內(nèi)容數(shù)據(jù)。防止在傳輸過程中內(nèi)容被篡改,防止用戶提交非法內(nèi)容,確保接收的內(nèi)容是系統(tǒng)可接收的。
1、不安全的HTTP傳輸
HTTP傳輸?shù)臄?shù)據(jù)都是未加密的,也就是明文,因此在傳輸過程中,隨時(shí)可能被截獲,客戶端與服務(wù)器之間沒有任何身份確認(rèn)的過程,數(shù)據(jù)全部明文傳輸,所以很容易遭到攻擊,因此使用HTTP傳輸隱私信息非常不安全。
圖1是普通HTTP的傳輸,HTTP傳輸面臨以下風(fēng)險(xiǎn)。
(1)竊聽風(fēng)險(xiǎn):攻擊者可以獲取所有通信內(nèi)容。
(2)篡改風(fēng)險(xiǎn):攻擊者可以修改所有通信內(nèi)容。
(3)冒充風(fēng)險(xiǎn):攻擊者以冒充他人身份參與通信。
圖1 HTTP被攔截
為了防止上述現(xiàn)象的發(fā)生,研發(fā)人員對(duì)傳輸?shù)男畔⑦M(jìn)行對(duì)稱加密。如圖2中所展示的,即使攻擊者截獲傳輸?shù)男畔?,也無法破解。
圖2 對(duì)稱加密
使用對(duì)稱加密,雙方擁有相同的密鑰,信息得到安全傳輸,但此種方式有以下缺點(diǎn)。
(1)不同的客戶端、服務(wù)器數(shù)量龐大,所以雙方都需要維護(hù)大量的密鑰,維護(hù)成本很高。
(2)因每個(gè)客戶端、服務(wù)器的安全級(jí)別不同,所以密鑰極易泄露。
為了防止對(duì)稱加密中的密鑰泄露,如圖3所示,使用非對(duì)稱加密客戶端用公鑰對(duì)請(qǐng)求內(nèi)容加密,服務(wù)器使用私鑰對(duì)內(nèi)容解密,反之亦然。但這個(gè)過程也存在缺點(diǎn),公鑰是公開的(也就是攻擊者也會(huì)有公鑰),所以服務(wù)端私鑰加密的信息,如果被惡意攻擊者截獲,攻擊者可以使用公鑰行解密,獲取其中的內(nèi)容。
圖3 非對(duì)稱加密
為了兼顧性能和安全問題,人們將對(duì)稱加密、非對(duì)稱加密兩者結(jié)合起來,發(fā)揮兩者各自的優(yōu)勢(shì)。圖4展示的是混合加密。
圖4 混合加密
客戶端使用公鑰加密對(duì)稱密鑰,服務(wù)器收到信息后,用私鑰解密,提取出對(duì)稱加密算法和對(duì)稱密鑰后,后續(xù)兩者之間信息的傳輸便可使用對(duì)稱加密的方式。
但是還存在以下問題。
(1)客戶端獲得的公鑰無法確定是真實(shí)的還是攻擊者偽造的。
(2)無法確認(rèn)服務(wù)器是真實(shí)的而不是攻擊者的。
因此傳輸過程還是存在被劫持可能性,如圖5所示。
圖5 加密傳輸被劫持
2、HTTPS傳輸更安全
為了保證這些隱私數(shù)據(jù)能加密傳輸,Netscape(網(wǎng)景)公司設(shè)計(jì)了安全套接層(Secure Sockets Layer,SSL)協(xié)議用于對(duì)HTTP傳輸?shù)臄?shù)據(jù)進(jìn)行加密,從而誕生了HTTPS。
HTTPS能夠加密信息,可防止數(shù)據(jù)信息在傳輸過程中被第三方竊取、修改,確保數(shù)據(jù)的完整性,所以很多銀行網(wǎng)站或電子郵箱等安全級(jí)別較高的服務(wù)采用了HTTPS。隨著安全意識(shí)的提高,目前主流網(wǎng)站陸續(xù)在使用HTTPS。
圖6展示了HTTPS的請(qǐng)求過程,客戶端在接收到服務(wù)端發(fā)來的SSL證書時(shí),會(huì)對(duì)證書的真?zhèn)芜M(jìn)行校驗(yàn)。下面以瀏覽器為例進(jìn)行說明。
圖6 HTTPS請(qǐng)求過程
(1)瀏覽器讀取證書中的證書所有者、有效期等信息并進(jìn)行一一校驗(yàn)。
(2)瀏覽器開始查找操作系統(tǒng)中已內(nèi)置的受信任的證書發(fā)布機(jī)構(gòu)CA,與服務(wù)器發(fā)來的證書中的頒發(fā)者CA比對(duì),用于校驗(yàn)證書是否為合法機(jī)構(gòu)頒發(fā)。
(3)如果找不到,瀏覽器就會(huì)報(bào)錯(cuò),說明服務(wù)器發(fā)來的證書是不可信任的。
(4)如果找到,瀏覽器就會(huì)從操作系統(tǒng)中取出頒發(fā)者CA的公鑰,然后對(duì)服務(wù)器發(fā)來的證書里的簽名進(jìn)行解密。
(5)瀏覽器使用相同的散列算法計(jì)算出服務(wù)器發(fā)來的證書的散列值,將這個(gè)計(jì)算的散列值與證書中簽名進(jìn)行對(duì)比。
(6)如果對(duì)比結(jié)果一致,則證明服務(wù)器發(fā)來的證書合法,沒有被冒充。
(7)此時(shí)瀏覽器就可以讀取證書中的公鑰,用于后續(xù)加密。
通過發(fā)送SSL證書的形式,既解決了公鑰獲取問題,又解決了攻擊者冒充問題,所以相比HTTP,HTTPS傳輸更加安全。
(1)所有信息都是加密傳播的,攻擊者無法竊聽。
(2)具有校驗(yàn)機(jī)制,一旦被篡改,通信雙方都會(huì)立刻發(fā)現(xiàn)。
(3)配備身份證書,防止身份被冒充。
相比HTTP,HTTPS增加了很多握手、加密解密等流程,雖然過程很復(fù)雜,但可以保證數(shù)據(jù)傳輸?shù)陌踩?。在這個(gè)互聯(lián)網(wǎng)膨脹的時(shí)代,其中隱藏著各種看不見的危機(jī),為了保證數(shù)據(jù)的安全,維護(hù)網(wǎng)絡(luò)定,建議使用HTTPS。
3、防止盜鏈
盜鏈?zhǔn)侵妇W(wǎng)站擁有者自己不對(duì)資源進(jìn)行存儲(chǔ),而是通過技術(shù)手段盜取其他網(wǎng)站服務(wù)商的內(nèi)容資源直接在自己的網(wǎng)站上進(jìn)行展示,騙取最終用戶的瀏覽和點(diǎn)擊。盜取的內(nèi)容主要是圖片、視頻以及其他資源下載文件。網(wǎng)站盜鏈會(huì)大量消耗被盜鏈網(wǎng)站的帶寬和系統(tǒng)資源,從而增加服務(wù)器的負(fù)擔(dān),損害企業(yè)的利益,同時(shí)給企業(yè)形象造成負(fù)面影響。
為了防止服務(wù)器資源被盜取,通??梢詸z測訪問源的Referer來進(jìn)行過濾,如在Nginx中配置Referer檢查,檢查Referer是否是在指定的域名來源中,如www.ptpress.com.cn、ptpress.com.cn,防止jpg|gif|png|swf|flv|wma|wmv|mp3|zip|rar這些靜態(tài)資源被第三方引用。如果沒有通過檢測,則直接返回“404資源無法找到”。
- location ~*^.+\.(jpg|gif|png|swf|flv|wma|wmv|mp3|zip|rar)$ {
- valid_referers none blocked www.ptpress.com.cn ptpress.com.cn;
- if($invalid_referer) {
- return 404;
- break;
- }
- access_log off;
- }
如果是使用Apache作為Web服務(wù)器,可以直接在.htaccess中進(jìn)行配置,設(shè)置方式如下。
- RewriteEngine on
- RewriteCond %{HTTP_REFERER} !^$ [NC]
- RewriteCond %{HTTP_REFERER} !ptpress.com.cn [NC]
- RewriteCond %{HTTP_REFERER} !www.ptpress.com.cn [NC]
- RewriteRule .*\.(jpg|gif|png|swf|flv|wma|wmv|mp3|zip|rar)$ http://www.ptpress.com.cn/ [R,NC,L]
如果是一些動(dòng)態(tài)資源,則可以使用PHP檢查Referer白名單的方式以防止盜鏈。
- <?php
- $whiteList=array("www.ptpress.com.cn","ptpress.com.cn");
- $referer=$_SERVER['HTTP_REFERER'];
- $parseResult=parse_url($referer); // 解析URL
- $host=$parseResult['host']; // 獲取referer中的域名
- if(!in_array($host,$whiteList)); {
- die('防止非法盜鏈');
- }
4、敏感詞
每一個(gè)系統(tǒng)都應(yīng)該保證接收和傳輸?shù)接脩舳说膬?nèi)容是合法健康的,所以需要建立有效的過濾或安全限制機(jī)制。其中,涉及“政治”“毒品”“色情”“武器”“暴力”“恐怖”“廣告”“業(yè)務(wù)違規(guī)”等內(nèi)容的,一定要進(jìn)行過濾并禁止傳輸或接收,以防止被攻擊者和不法分子用于廣告宣傳、言論攻擊等。
通常的做法是建立敏感詞詞庫,當(dāng)用戶提交內(nèi)容后,對(duì)內(nèi)容進(jìn)行分詞處理,將分詞后的數(shù)據(jù)與敏感詞庫中的數(shù)據(jù)一一對(duì)比。一旦命中,就禁止用戶提交。
圖7展示了系統(tǒng)在檢測到敏感詞,拒絕用戶提交數(shù)據(jù)的過程。
圖7 檢測到敏感詞
只有檢測后的內(nèi)容不包括敏感詞,才允許對(duì)用戶的內(nèi)容進(jìn)行保存。圖8中展示了系統(tǒng)未檢測到敏感詞,用戶可順利提交數(shù)據(jù)的過程。
圖8 未檢測到敏感詞