在PHP編程中,stristr是一個(gè)非常常用的函數(shù),用于在字符串中查找指定的文本,可以不區(qū)分大小寫(xiě)。但是,在某些情況下,stristr函數(shù)也可能被黑客用于攻擊,進(jìn)行一些不匹配的字符串匹配攻擊。本文將講解stristr函數(shù)如何被繞過(guò),并提供避免被攻擊的方法。
stristr函數(shù)可以檢索字符串中的指定文本,并返回以該文本結(jié)尾的所有文本。因此,在不嚴(yán)格要求字符串的精確匹配的情況下,它是一個(gè)非常便利的函數(shù)。下面是一個(gè)例子,用于查找一個(gè)字符串中是否包括某個(gè)文本:
$fruit = "apple,pear,orange"; if(stristr($fruit,"pear")){ echo "找到了!"; }else{ echo "沒(méi)有找到。"; }
使用上面的代碼,當(dāng)字符串$fruit中包含單詞"pear"時(shí),它將會(huì)輸出“找到了!”;否則,將輸出“沒(méi)有找到。”。
然而,stristr函數(shù)也有一些漏洞,它可能被一些惡意用戶用于攻擊。比如,當(dāng)它用于對(duì)系統(tǒng)文件進(jìn)行保護(hù)時(shí),就可能引發(fā)安全性問(wèn)題。
舉個(gè)例子,如果我們想防止用戶訪問(wèn)某個(gè)文件夾中的所有文件,可以使用如下代碼:
if(stristr($_REQUEST['folder'],'/../../')){ die("非法訪問(wèn)!"); }
雖然這樣的代碼看起來(lái)十分安全,但是,問(wèn)題在于每個(gè)訪問(wèn)該頁(yè)面的用戶都可以通過(guò)在URL中添加"/../../"來(lái)實(shí)現(xiàn)直接訪問(wèn)受限文件夾中的文件。因?yàn)椋?dāng)用戶訪問(wèn)頁(yè)面時(shí),其請(qǐng)求數(shù)據(jù)會(huì)被解釋成字符串,而如果這個(gè)字符串中包含"/../../",stristr函數(shù)將會(huì)返回該文本并被if語(yǔ)句視為“存在”,這樣便可以讓不受限制的請(qǐng)求通過(guò)訪問(wèn)了。
為了避免這樣的攻擊,我們應(yīng)該避免使用stristr函數(shù)。相反,我們可以使用路徑檢查函數(shù),如realpath(),以確定文件是否在網(wǎng)站的根目錄中。
$folder = $_REQUEST['folder']; $absPath = realpath($folder); if(strpos($absPath,$_SERVER['DOCUMENT_ROOT']) === 0){ // 存在于根目錄中 }else{ // 不在根目錄中無(wú)法訪問(wèn) }
使用realpath函數(shù),我們可以獲得絕對(duì)路徑,并使用strpos函數(shù)檢查絕對(duì)路徑是否包含DOCUMENT_ROOT,如果DOCUMENT_ROOT是該字符串的開(kāi)始,就說(shuō)明該文件存在于網(wǎng)站根目錄中。
總之,雖然stristr函數(shù)非常方便,但如果在關(guān)鍵位置中使用,就可能被攻擊者用于繞過(guò)系統(tǒng)的安全檢查。因此,我們應(yīng)該選擇更安全的替代方案,以確保網(wǎng)站和系統(tǒng)的安全。