PHP安全:保障內容安全
除了Web系統本身不要出現漏洞而被攻擊者利用外,還需要將內容數據安全地送達給用戶,并且用戶安全地接收內容數據。防止在傳輸過程中內容被篡改,防止用戶提交非法內容,確保接收的內容是系統可接收的。
1、不安全的HTTP傳輸
HTTP傳輸的數據都是未加密的,也就是明文,因此在傳輸過程中,隨時可能被截獲,客戶端與服務器之間沒有任何身份確認的過程,數據全部明文傳輸,所以很容易遭到攻擊,因此使用HTTP傳輸隱私信息非常不安全。
圖1是普通HTTP的傳輸,HTTP傳輸面臨以下風險。
(1)竊聽風險:攻擊者可以獲取所有通信內容。
(2)篡改風險:攻擊者可以修改所有通信內容。
(3)冒充風險:攻擊者以冒充他人身份參與通信。
圖1 HTTP被攔截
為了防止上述現象的發生,研發人員對傳輸的信息進行對稱加密。如圖2中所展示的,即使攻擊者截獲傳輸的信息,也無法破解。
圖2 對稱加密
使用對稱加密,雙方擁有相同的密鑰,信息得到安全傳輸,但此種方式有以下缺點。
(1)不同的客戶端、服務器數量龐大,所以雙方都需要維護大量的密鑰,維護成本很高。
(2)因每個客戶端、服務器的安全級別不同,所以密鑰極易泄露。
為了防止對稱加密中的密鑰泄露,如圖3所示,使用非對稱加密客戶端用公鑰對請求內容加密,服務器使用私鑰對內容解密,反之亦然。但這個過程也存在缺點,公鑰是公開的(也就是攻擊者也會有公鑰),所以服務端私鑰加密的信息,如果被惡意攻擊者截獲,攻擊者可以使用公鑰行解密,獲取其中的內容。
圖3 非對稱加密
為了兼顧性能和安全問題,人們將對稱加密、非對稱加密兩者結合起來,發揮兩者各自的優勢。圖4展示的是混合加密。
圖4 混合加密
客戶端使用公鑰加密對稱密鑰,服務器收到信息后,用私鑰解密,提取出對稱加密算法和對稱密鑰后,后續兩者之間信息的傳輸便可使用對稱加密的方式。
但是還存在以下問題。
(1)客戶端獲得的公鑰無法確定是真實的還是攻擊者偽造的。
(2)無法確認服務器是真實的而不是攻擊者的。
因此傳輸過程還是存在被劫持可能性,如圖5所示。
圖5 加密傳輸被劫持
2、HTTPS傳輸更安全
為了保證這些隱私數據能加密傳輸,Netscape(網景)公司設計了安全套接層(Secure Sockets Layer,SSL)協議用于對HTTP傳輸的數據進行加密,從而誕生了HTTPS。
HTTPS能夠加密信息,可防止數據信息在傳輸過程中被第三方竊取、修改,確保數據的完整性,所以很多銀行網站或電子郵箱等安全級別較高的服務采用了HTTPS。隨著安全意識的提高,目前主流網站陸續在使用HTTPS。
圖6展示了HTTPS的請求過程,客戶端在接收到服務端發來的SSL證書時,會對證書的真偽進行校驗。下面以瀏覽器為例進行說明。
圖6 HTTPS請求過程
(1)瀏覽器讀取證書中的證書所有者、有效期等信息并進行一一校驗。
(2)瀏覽器開始查找操作系統中已內置的受信任的證書發布機構CA,與服務器發來的證書中的頒發者CA比對,用于校驗證書是否為合法機構頒發。
(3)如果找不到,瀏覽器就會報錯,說明服務器發來的證書是不可信任的。
(4)如果找到,瀏覽器就會從操作系統中取出頒發者CA的公鑰,然后對服務器發來的證書里的簽名進行解密。
(5)瀏覽器使用相同的散列算法計算出服務器發來的證書的散列值,將這個計算的散列值與證書中簽名進行對比。
(6)如果對比結果一致,則證明服務器發來的證書合法,沒有被冒充。
(7)此時瀏覽器就可以讀取證書中的公鑰,用于后續加密。
通過發送SSL證書的形式,既解決了公鑰獲取問題,又解決了攻擊者冒充問題,所以相比HTTP,HTTPS傳輸更加安全。
(1)所有信息都是加密傳播的,攻擊者無法竊聽。
(2)具有校驗機制,一旦被篡改,通信雙方都會立刻發現。
(3)配備身份證書,防止身份被冒充。
相比HTTP,HTTPS增加了很多握手、加密解密等流程,雖然過程很復雜,但可以保證數據傳輸的安全。在這個互聯網膨脹的時代,其中隱藏著各種看不見的危機,為了保證數據的安全,維護網絡定,建議使用HTTPS。
3、防止盜鏈
盜鏈是指網站擁有者自己不對資源進行存儲,而是通過技術手段盜取其他網站服務商的內容資源直接在自己的網站上進行展示,騙取最終用戶的瀏覽和點擊。盜取的內容主要是圖片、視頻以及其他資源下載文件。網站盜鏈會大量消耗被盜鏈網站的帶寬和系統資源,從而增加服務器的負擔,損害企業的利益,同時給企業形象造成負面影響。
為了防止服務器資源被盜取,通常可以檢測訪問源的Referer來進行過濾,如在Nginx中配置Referer檢查,檢查Referer是否是在指定的域名來源中,如www.ptpress.com.cn、ptpress.com.cn,防止jpg|gif|png|swf|flv|wma|wmv|mp3|zip|rar這些靜態資源被第三方引用。如果沒有通過檢測,則直接返回“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服務器,可以直接在.htaccess中進行配置,設置方式如下。
- 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]
如果是一些動態資源,則可以使用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、敏感詞
每一個系統都應該保證接收和傳輸到用戶端的內容是合法健康的,所以需要建立有效的過濾或安全限制機制。其中,涉及“政治”“毒品”“色情”“武器”“暴力”“恐怖”“廣告”“業務違規”等內容的,一定要進行過濾并禁止傳輸或接收,以防止被攻擊者和不法分子用于廣告宣傳、言論攻擊等。
通常的做法是建立敏感詞詞庫,當用戶提交內容后,對內容進行分詞處理,將分詞后的數據與敏感詞庫中的數據一一對比。一旦命中,就禁止用戶提交。
圖7展示了系統在檢測到敏感詞,拒絕用戶提交數據的過程。
圖7 檢測到敏感詞
只有檢測后的內容不包括敏感詞,才允許對用戶的內容進行保存。圖8中展示了系統未檢測到敏感詞,用戶可順利提交數據的過程。
圖8 未檢測到敏感詞