1. 程式人生 > >8個常用的PHP安全函式

8個常用的PHP安全函式

安全是程式設計非常重要的一個方面。在任何一種程式語言中,都提供了許多的函式或者模組來確保程式的安全性。在現代網站應用中,經常要獲取來自世界各地使用者的輸入,但是,我們都知道“永遠不能相信那些使用者輸入的資料”。所以在各種的Web開發語言中,都會提供保證使用者輸入資料安全的函式。今天,我們就來看看,在著名的開源語言PHP中,有哪些有用的安全函式。

在PHP中,有些很有用的函式,防止你的網站遭受各種攻擊,例如SQL注入攻擊,XSS攻擊(Cross Site Scripting:跨站指令碼)等。一起看看PHP中常用的、可以確保專案安全的函式。注意,這並不是完整的列表,是我覺得在實際專案中很有的一些函式。
mysql_real_escape_string()

mysql_real_escape_string() 函式在PHP中防止SQL注入攻擊時非常有用。這個函式會對一些特殊字元,例如單引號’、雙引號”、反斜槓\等新增一個反斜槓,以確保在查詢這些資料之前使用者提供的輸入是乾淨的。

注意,僅在寫資料庫的時候才需要呼叫這個函式,在讀取資料庫的時候不需要呼叫 stripslashes() 來unescape資料,因為這些反斜槓是在資料庫執行SQL的時候新增的,當把資料寫入到資料庫的時候,反斜槓會被移除,所以寫入到資料庫的內容就是原始資料,並不會在前面多了反斜槓。

從 PHP5.5.0 開始已經不推薦使用 mysql_real_escape_string() 了,所有新的應用應該使用 MySQLi 和 PDO_MySQL 擴充套件提供的方法:mysqli_real_escape_string() 或者 PDO::quote() 函式庫執行資料庫操作,以防止SQL注入攻擊。
addslashes()

這個函式的原理跟 mysql_real_escape_string() 相似。但是如果 php.ini 檔案中的magic_quotes_gpc的值是on,就不要使用這個函式,因為PHP已經對GPC(GET_POST和 $_COOKIE)資料自動執行 addslashes()。再使用 addslashes(),會導致雙層轉義。在PHP程式中,可以使用 get_magic_quotes_gpc() 函式來確定它是否開啟。

注意,在 PHP5.3.0 之前,magic_quotes_gpc 是預設 on 的,所以不需要在這些變數上重複呼叫 addslashes()。不過 magic_quotes_gpc 在 PHP5.3 就已經被廢棄,從 PHP5.4 已經被移除了。如果使用 PHP5.4以後的版本,可以不用擔心這個問題,PHP 會自動轉移GPC和$_ENV資料。

stripslashes() 可以去除 addslashes() 函式新增的反斜槓。
htmlspecialchars()

htmlspecialchars() 函式對於過濾使用者輸入的資料非常有用。它會將一些特殊字元如&、”、’、<、>轉換為HTML實體。例如,使用者輸入< 時,就會被該函式轉化為HTML實體 <。(HTML實體對照表:http://www.w3school.com.cn/html/html_entities.asp),可以防止XSS和SQL注入攻擊。

注意,htmlspecialchars() 函式只是把認為有安全隱患的HTML字元進行轉換,如果想要把HTML所有可以轉義的字元都進行轉義,請使用htmlentities()。

htmlspecialchars_decode() 與 htmlspecialchars() 相反,可以將HTML實體轉回為原字元。
htmlentities()

htmlentities() 功能同 htmlspecialchars(),不同的是,它可以轉義所有的 HTML字元。

html_entity_decode() 為 htmlentities() 的decode函式。
strip_tags()

strip_tags() 函式可以去除字串中所有的HTML、JavaScript和PHP標籤,當然你也可以通過設定該函式的第二個引數,讓一些特定的標籤出現。
md5()

從安全的角度來說,在資料庫中直接儲存密碼的行為不值得推薦。md5() 函式可以為給定字串產生一個32個字元的md5雜湊,而且這個過程不可逆,也就是說,你不能從md5()的結果得到原始字串。

現在這個函式並不被認為是安全的,因為開源的資料庫可以反向檢查一個雜湊值的明文,你可以在這裡找到一個MD5雜湊資料庫列表。
sha1()

sha1() 函式與md5()類似,但是它使用了不同的演算法來產生40個字元的 SHA-1 雜湊(md5 產生的是32個字元的雜湊)。也不要把絕對安全寄託在這個函式上,否則會有意想不到的結果。
intval()

先別笑,我知道這個函式和安全沒什麼關係。intval()函式是將變數轉成整數型別,你可以用這個函式讓你的PHP程式碼更安全,特別是當你在解析id、年齡這樣的資料時。