PHP中eval函式的危害與正確禁用方法
php的eval函式並不是系統元件函式,因此我們在php.ini中使用disable_functions是無法禁止它的。
但是eval()對於php安全來說具有很大的殺傷力,因此一般不用的情況下為了防止類似如下的一句話木馬入侵,需要禁止!
<?php eval($_POST[cmd]);?>
eval()使用範例:
<?php
$string ='杯子';
$name ='咖啡';
$str ='這個 $string 中裝有 $name.<br>';
echo $str;
eval("$str = "$str";");
echo $str;
?>
本例的傳回值為:
這個 $string
中裝有 $name. 這個 杯子 中裝有 咖啡. 或更高階點的是:
<?php
$str="hello world";//比如這個是元算結果
$code="print('n$strn');";//這個是儲存在資料庫內的php程式碼
echo($code);//列印組合後的命令,str字串被替代了,形成一個完整的php命令,但並是不會執行
eval($code);//執行了這條命令
?>
對於上面的咖啡的例子,在eval裡面,首先字串被替換了,其次替換完後形成一個完整的賦值命令被執行了.
這類小馬砸門的情況是需要禁止掉的! 然而網上很多說使用 disable_functions
禁止掉eval的方法都是錯誤的! 其實 eval
是無法用php.ini中的 disable_functions
禁止掉的 :
because eval()is a language construct andnot a function
eval是zend的,因此不是PHP_FUNCTION 函式;
那麼php怎麼禁止eval呢?
如果想禁掉eval可以用php的擴充套件 Suhosin: 安裝Suhosin後在php.ini中load進來Suhosin.so,再加上 suhosin.executor.disable_eval = on
即可!
總結,php的eval函式在php中是無法禁用的,因此我們也只有使用外掛了!