八大安全函數解析
在現(xian)代(dai)互聯網(wang)中(zhong),我們(men)經(jing)常(chang)要(yao) 從世界(jie)各地的(de)(de)用(yong)戶(hu)中(zhong)獲得(de)輸入(ru)數(shu)(shu)據(ju)(ju)。但是,我們(men)都(dou)知道“永(yong)遠(yuan)不能(neng)相(xiang)信那些(xie)(xie)用(yong)戶(hu)輸入(ru)的(de)(de)數(shu)(shu)據(ju)(ju)”。所(suo)以在各種的(de)(de)Web開發語言(yan)中(zhong),都(dou)會(hui)提供保(bao)證用(yong)戶(hu)輸入(ru)數(shu)(shu)據(ju)(ju)安(an)全的(de)(de)函(han)(han)數(shu)(shu)。在PHP中(zhong),有些(xie)(xie)非常(chang)有用(yong)并且(qie)方(fang)便的(de)(de)函(han)(han)數(shu)(shu),它們(men)可(ke)以幫助你的(de)(de)網(wang)站防止(zhi)出現(xian)像SQL注入(ru)攻擊,XSS攻擊等問題。當然在PHP代(dai)碼編寫中(zhong)IDE(如:PhpStorm 、Zend Studio )會(hui)有函(han)(han)數(shu)(shu)的(de)(de)高亮顯示,來(lai)確(que)保(bao)開發人員的(de)(de)使用(yong),也有人使用(yong)代(dai)碼混淆工具來(lai)保(bao)護這些(xie)(xie)函(han)(han)數(shu)(shu)或(huo)代(dai)碼(如:Zend Guard),這些(xie)(xie)手段都(dou)是用(yong)來(lai)確(que)保(bao)PHP函(han)(han)數(shu)(shu)的(de)(de)使用(yong)和安(an)全的(de)(de)。今天我們(men)主(zhu)要(yao)是來(lai)看看這些(xie)(xie)函(han)(han)數(shu)(shu)到底是怎么定義與工作的(de)(de)。
1. mysql_real_escape_string()
這個(ge)函數(shu)對(dui)于在PHP中防止SQL注(zhu)入攻擊很有幫助,它對(dui)特殊的字(zi)符(fu),像單引號和雙(shuang)引號,加(jia)上了“反(fan)斜杠”,確保用戶的輸入在用它去(qu)查詢(xun)以(yi)前(qian)已經是安全的了。但你要注(zhu)意你是在連接著數(shu)據庫的情況下(xia)使用這個(ge)函數(shu)。
但現在(zai)mysql_real_escape_string()這個(ge)函數基(ji)本(ben)不用了,所有新的應(ying)用開(kai)發都應(ying)該使用像(xiang)PDO這樣(yang)的庫(ku)對數據庫(ku)進行操作,也就是說,我們可以使用現成的語(yu)句防止SQL注入攻擊。
2. addslashes()
這個函(han)數(shu)和上(shang)面的(de)mysql_real_escape_string()很(hen)相似。但要(yao)注(zhu)意當設(she)置文件php.ini中的(de)magic_quotes_gpc 的(de)值(zhi)為(wei)“on”時,不要(yao)使(shi)用(yong)這個函(han)數(shu)。默(mo)認情況下, magic_quotes_gpc 為(wei) on,對所有的(de) GET、POST 和 COOKIE 數(shu)據 自動運行 addslashes()。不要(yao)對已(yi)經被(bei) magic_quotes_gpc 轉(zhuan)義過的(de)字(zi)符(fu)串使(shi)用(yong) addslashes(),因(yin)為(wei)這樣(yang)會(hui)導致 雙(shuang)層轉(zhuan)義。你可(ke)以(yi)通過PHP中get_magic_quotes_gpc()函(han)數(shu)檢查(cha)這個變量的(de)值(zhi)。
3. htmlentities()
這個函數對過濾用戶輸入數據非常有用,它可以把字符轉換為 HTML 實體。比如,當用戶輸入字符“<”時,就會被該函數轉化為HTML實體<,因此防止了XSS和SQL注入攻擊。
4. htmlspecialchars()
HTML中的一些字(zi)符(fu)有(you)著(zhu)特殊的含義(yi),如(ru)果要體(ti)(ti)現這(zhe)樣的含義(yi),就要被(bei)轉(zhuan)換(huan)為(wei)HTML實體(ti)(ti),這(zhe)個函數會返回轉(zhuan)換(huan)后的字(zi)符(fu)串,比(bi)如(ru),‘&’amp會轉(zhuan)為(wei)‘&’。
5. strip_tags()
這個函(han)數(shu)可以去除字符串中(zhong)所有的HTML,JavaScript和PHP標(biao)簽,當然你也可以通(tong)過設置該函(han)數(shu)的第二個參數(shu),讓一(yi)些特定的標(biao)簽出現。
6. md5()
一(yi)些開發者存儲(chu)的(de)密碼非常(chang)簡單,這從安全的(de)角度上(shang)看是不好的(de),md5()函數可(ke)以產生給定(ding)字符串(chuan)(chuan)的(de)32個(ge)字符的(de)md5散列(lie),而且這個(ge)過程不可(ke)逆(ni),即你不能從md5()的(de)結果得(de)到(dao)原始字符串(chuan)(chuan)。
7. sha1()
這(zhe)個(ge)函(han)數和上(shang)面(mian)的(de)(de)(de)md5()相似,但是它使用(yong)了不同的(de)(de)(de)算法,產生(sheng)的(de)(de)(de)是40個(ge)字(zi)(zi)符(fu)的(de)(de)(de)SHA-1散列(md5產生(sheng)的(de)(de)(de)是32個(ge)字(zi)(zi)符(fu)的(de)(de)(de)散列)。
8. intval()
不要(yao)笑,我知(zhi)道(dao)這不是一個和安(an)全(quan)相關的函數,它是在將變量(liang)轉成整數類(lei)型。但是,你(ni)可以(yi)用(yong)這個函數讓你(ni)的PHP代碼更安(an)全(quan),特別是當(dang)你(ni)在解析id,年齡這樣的數據時。