安全一直是一個在編程語言中非常值得去關注的方面。在任何一種成熟的編程語言中都有合適的辦法來保證程序的安全性,在現代的 WEB 開發中,我們常常需 要去處理用戶的輸入。(那麼這時候,問題就來了)有一句編程格言是: 千萬不要相信用戶輸入的安全性。所以呢,今天就介紹一些在PHP 中最常用的為你的 代碼提供安全保護的方法。
在 PHP 中有許多方便的函數可以幫助你免於類似於 SQL注入,XSS攻擊。現在讓我們來看一下這些能夠給你的項目增加安全性的函數吧。但是,請注意,這裡只是一些常用的函數的列表,也許他們並不全面,但是我相信他們都是對你的項目是非常有幫助的。
mysql_real_escape_string( string sqlQuery ) :
轉義 SQL 語句中使用的字元串中的特殊字元,並考慮到連接的當前字符集。一個非常有用的函數,可以有效地避免 SQL 注入。
以下字元會被轉換:
\x00,\n,\r,\,』,」,\x1a
在執行sql語句之前,對要將執行的sql query 使用該函數處理,會將一些危 險扼殺在搖籃中。
但是現在一般在較為成熟的項目中,一般比較推薦使用類似 PDO 這樣的資料庫持久層來處理所有的資料庫操作。他們代表著更為先進的資料庫操作處理技術,在安全性,數據讀寫的速度上逗比那些古老的 mysql_* api 強大了不少。
addslashes() :
在將一些數據插入到資料庫中時,這個函數會非常有用,它可以在單引號前加上反斜杠,使得數據在插入時不會出現錯誤。但是它的使用與php.ini 中的一項設置有關係 — magic_quotes_gpc
1. 對於PHP magic_quotes_gpc=on的情況, 我們可以不對輸入和輸出資料庫的字元串數據作addslashes()和stripslashes()的操作,數據也會正常顯示。
如果此時你對輸入的數據作了addslashes()處理,那麼在輸出的時候就必須使用stripslashes()去掉多餘的反斜杠。
2. 對於PHP magic_quotes_gpc=off 的情況
必須使用addslashes()對輸入數據進行處理,但並不需要使用stripslashes()格式化輸出,因為addslashes()並未將反斜杠一起寫入資料庫,只是幫助mysql完成了sql語句的執行。
【stripslashes() :刪除由 addslashes() 函數添加的反斜杠。】
htmlentities() :
一個非常有用的用來處理輸出的函數。它用來將一些可能導致XXS攻擊的字元轉化為html實體,這些字元在瀏覽器顯示的時候是正常的,但是當你查看它的源代碼時,實際上這些特殊字元必不會是他顯示的那樣,例如
輸出:
John & 『Adams』
源碼:
John & 'Adams';
輸出:
<>
源碼:
<>gt;
編碼這些符號,有效地避免了XSS 攻擊。
htmlspecialchars():
和上面的函數是一樣的,但是它更常用一些,因為 htmlentities() 是將所有的有在html 標準中定義了的字元轉換成他們對應的html實體,這樣會是你的輸出缺乏易讀性(html 實體列表 http://www.w3school.com.cn/tags/html_ref_entities.html)。所以呢,使用 htmlspecialchars() 只是將一些 預定義的字元(就是會導致出現問題的)轉換為html實體。例如:
& (和號) 成為 &
」 (雙引號) 成為 」
『 (單引號) 成為 『
< (小於) 成為 <
> (大於) 成為 >
所以,在一些項目中,我還是常常使用 htmlspecialchars() 來處理html 的輸出的。他在安全這一方面做得更具體一些。
strip_tags(): 一般在輸出時使用,將HTML、XML 以及 PHP 的標籤剝去。
函數原型: strip_tags(string,allow)
String 代表輸入的字元串,allow 代表 不刪除的標籤,你可以通過 allow 來自定義過需要濾掉的標籤
md5() :
一個將字元串轉換為一個32位的哈希值的函數(不能逆向解密),任何一個字元串都能通過這個函數獲得一個唯一的32位字元串。但是,現在使用這個函數時, 需要注意有一些資料庫記錄了大量的md5 值,通過暴力枚舉的方式來破解你的密碼,所以在使用的時候,你可以先將你的原字元串加一層密,然後再使用 md5()哈希,會獲得更好的效果。
sha1() :
和md5() 和相似的一個函數,但是他使用不同的演算法生成一個 40個字元的字元串。可以在項目中考慮使用
intval() :
也許你認為這個函數不是一個 security function。但是它在某些情況下可以很好地保護你的code。對從用戶收集到的一些數據例如 ID,password,username處理,也許可以消除一些安全隱患,畢竟這裡是重災區。