1. 程式人生 > >PHP中eval函式的危害與正確禁用方法

PHP中eval函式的危害與正確禁用方法

0?wx_fmt=gif&wxfrom=5&wx_lazy=1

php的eval函式並不是系統元件函式,因此我們在php.ini中使用disable_functions是無法禁止它的。

但是eval()對於php安全來說具有很大的殺傷力,因此一般不用的情況下為了防止類似如下的一句話木馬入侵,需要禁止!

  1. <?php eval($_POST[cmd]);?>

eval()使用範例:

  1. <?php

  2. $string ='杯子';

  3. $name ='咖啡';

  4. $str ='這個 $string 中裝有 $name.<br>';

  5. echo $str;

  6. eval("$str = "$str";");

  7. echo $str;

  8. ?>

本例的傳回值為:

這個 $string

中裝有 $name. 這個 杯子 中裝有 咖啡. 或更高階點的是:

  1. <?php

  2. $str="hello world";//比如這個是元算結果

  3. $code="print('n$strn');";//這個是儲存在資料庫內的php程式碼

  4. echo($code);//列印組合後的命令,str字串被替代了,形成一個完整的php命令,但並是不會執行

  5. eval($code);//執行了這條命令

  6. ?>

對於上面的咖啡的例子,在eval裡面,首先字串被替換了,其次替換完後形成一個完整的賦值命令被執行了.

這類小馬砸門的情況是需要禁止掉的! 然而網上很多說使用 disable_functions禁止掉eval的方法都是錯誤的! 其實 eval

()是無法用php.ini中的 disable_functions禁止掉的 :

  1. 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中是無法禁用的,因此我們也只有使用外掛了!

0?wx_fmt=png