PHP 是一種被廣泛應(yīng)用的開源服務(wù)器端腳本語言,它可以和HTML進(jìn)行良好的交互,已成為創(chuàng)建動態(tài)網(wǎng)站的首選之一。但是,PHP 也因為它簡單易學(xué)且靈活多變的特點,常常成為黑客攻擊的攻擊目標(biāo),其中最常被利用的就是 eval 和 exec 函數(shù)。本文將詳細(xì)闡述這兩個函數(shù)的用法、優(yōu)缺點以及如何避免其被利用。
首先,讓我們來看看 eval 函數(shù)。eval 函數(shù)是 PHP 中最常被誤解的函數(shù)之一,因為它的靈活性也是它被攻擊者濫用的原因。eval 函數(shù)允許 PHP 執(zhí)行一個字符串,這個字符串是一個有效的 PHP 代碼。很多人認(rèn)為 eval 函數(shù)是一個非常好的工具,因為它允許在運行時動態(tài)地構(gòu)建和執(zhí)行代碼,但是,也正因為它的靈活性,攻擊者可以輕松地注入惡意代碼并執(zhí)行。以下是一些 eval 函數(shù)被攻擊者利用的例子:
上面的示例可以正常工作,但是,如果不小心把一個來自用戶輸入的字符串傳遞給 eval 函數(shù),我們就會遇到問題。例如下面這段代碼:
當(dāng)一個攻擊者通過 URL 輸入以下代碼進(jìn)行攻擊時:
?code=
他就可以通過執(zhí)行系統(tǒng)命令來獲取操作系統(tǒng)的敏感信息。
現(xiàn)在讓我們來看看 exec 函數(shù)。相比 eval 函數(shù),exec 函數(shù)更安全一點。exec 函數(shù)執(zhí)行一個系統(tǒng)命令,并將命令的輸出存儲在一個數(shù)組中,同時返回最后一行輸出。雖然 exec 函數(shù)相對 eval 函數(shù)更為安全,但也要小心使用,以免遭到攻擊,以下是一個 exec 函數(shù)的示例:
但是,如果代碼無法正常工作,攻擊者就會開始利用漏洞。如果調(diào)用 exec 函數(shù)沒有系統(tǒng)命令的路徑,那么攻擊者就可以使用自己的二進(jìn)制文件來代替系統(tǒng)命令,從而進(jìn)一步攻擊服務(wù)器。因此,你應(yīng)該始終指定系統(tǒng)命令的路徑,例如:
最后,我建議以下幾點來避免 eval 和 exec 函數(shù)被利用:
- 永遠(yuǎn)不要使用 eval 函數(shù)。如果不得不使用,請確保它僅運行受信任的代碼,例如在編寫插件時。
- 如果使用 exec 函數(shù),請始終將系統(tǒng)命令指定為全路徑。
- 在 PHP 中使用 escapeshellarg 函數(shù)可以確保從外部輸入的參數(shù)被正確轉(zhuǎn)義。
總之,雖然 eval 和 exec 函數(shù)在某些情況下是有用的,但其能夠執(zhí)行任意代碼的特性使其成為一個非常危險的工具。因此,必須非常小心使用這兩個函數(shù)。絕不能在受到來自未受信任的用戶的輸入時使用這些函數(shù)。