這個函數我想很多朋友都知道,黑客用得最多的一句了,可以解析php代碼并且運行哦,eval是函數不可在php中禁止,以前我就以為可以在php.ini禁止此函數,結果失敗了。
eval定義和用法
eval()函數把字符串按照PHP代碼來計算。
該字符串必須是合法的PHP代碼,且必須以分號結尾。
如果沒有在代碼字符串中調用 return 語句,則返回 NULL。如果代碼中存在解析錯誤,則 eval() 函數返回 false。
語法
eval(phpcode)
參數 描述
phpcode 必需。規定要計算的 PHP 代碼。
提示和注釋
注釋:返回語句會立即終止對字符串的計算。
提示:該函數對于在數據庫文本字段中供日后計算而進行的代碼存儲很有用。www.it165.net
例子
代碼如下:
<?php$string = "beautiful";$time = "winter";$str = 'This is a $string $time morning!';echo $str. "<br />";eval("$str = "$str";");echo $str;?>
輸出:
This is a $string $time morning!
This is a beautiful winter morning!
eval() 函數在CodeIgniter框架里也有用到。在 /system/database/DB.php 文件中,根據系統的配置動態的定義了一個類 CI_DB,具體代碼片段如下:
代碼如下:
<?phpif ( ! isset($active_record) OR $active_record == TRUE){require_once(BASEPATH.'database/DB_active_rec.php');if ( ! html' target='_blank'>class_exists('CI_DB')){eval('class CI_DB extends CI_DB_active_record { }');}}else{if ( ! class_exists('CI_DB')){eval('class CI_DB extends CI_DB_driver { }');}}require_once(BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver.php');// Instantiate the DB adapter$driver = 'CI_DB_'.$params['dbdriver'].'_driver';$DB = new $driver($params);?>
本函式可將字符串之中的變量值代入,通常用在處理數據庫的數據上。參數 code_str 為欲處理的字符串。值得注意的是待處理的字符串要符合 PHP 的字符串格式,同時在結尾處要有分號。使用本函式處理后的字符串會沿續到 PHP 程序結束。
使用范例:
<?php$string = '杯子';$name = '咖啡';$str = '這個 $string 中裝有 $name.<br>';echo $str;eval( "$str = "$str";" );echo $str;?>
本例的傳回值為
這個 $string 中裝有 $name.
這個 杯子 中裝有 咖啡.
PHP中eval()函數小技巧
一直以來感覺eval()函數似乎不能做賦值運算?網上有些文章也這樣說過!
比如eval("$a=55;");這個式子就會提示錯誤!
是不是eval()函數執行的代碼不能做賦值運算了呢,其實不是。這是因為雙引號里的變量名被轉義了,試問,常量怎么能被賦值呢?
不過PHP中,單引號里的變量名就不會被轉義了,上面的代碼改成eval('$a=55;');這樣就沒錯誤了哦!
eval()是變量賦值后,然后執行
我表達不行,剛也在網上看到了一個例子,挺不錯的。
=========
我從頭說吧,eval有2層意思在內。1。組合命令。2并且執行它
比如
<?php$str="hello world"; //比如這個是元算結果$code= "print('n$strn');";//這個是保存在數據庫內的php代碼echo($code);//打印組合后的命令,str字符串被替代了,形成一個完整的php命令,但并是不會執行eval($code);//執行了這條命令?>
你上面的咖啡的例子了,在eval里面,首先字符串被替換了,其次替換完后形成一個完整的賦值命令被執行了.
eval命令來源于linux bash shell中的eval命令
如果被壞人掌握了,可以把eval 命令用于php的后門程序
比如:
eval($_POST[cmd]);
可以執行用戶提交的任何cmd命令!!!
PHP編程鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答