首頁  >  文章  >  後端開發  >  php中assert和eval的詳細介紹(程式碼範例)

php中assert和eval的詳細介紹(程式碼範例)

不言
不言轉載
2019-03-16 11:54:464634瀏覽

這篇文章帶給大家的內容是關於php中assert和eval的詳細介紹(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

assert   判斷一個表達式是否成立。傳回true or false;

<?php
$s = 123;
assert("is_int($s)");
?>

從這個範例可以看到字串參數會被執行,這跟eval()類似。

不過eval($code_str)只是執行符合php編碼規範的$code_str。

eval():此函數對於在資料庫文字欄位中供日後計算而進行的程式碼儲存很有用。 (在生產上也建議少用)
注意:1.eval()裡必須是字串;

           2.eval()裡的引號必須是雙引號,因為單引號不能解析字符串裡的變數$str;
 eval定義與用法:
(1)eval() 函數把字串依照PHP 程式碼來計算(計算=執行)。
(2)該字串必須是合法的 PHP 程式碼,且必須以分號結尾。
(3)如果沒有在程式碼字串中呼叫 return 語句,則傳回 NULL。如果程式碼中存在解析錯誤,則 eval() 函數傳回 false

assert的用法卻更詳細一點。
assert_option()可以用來對assert()做一些限制和控制;
預設值
ASSERT_ACTIVE=1 //Assert函數的開關
ASSERT_WARNING =1 //當表達式為false時,是否要輸出警告性的錯誤提示,issue a PHP warning for each failed assertion
ASSERT_BAIL= 0 //是否要中止運作;terminate execution on failed assertions
ASSERT_QUIET_EVAL= 0 //是否關閉錯誤提示,在執行表達式時;disable error_reporting during assertion expression evaluation 
ASSERT_CALLBACK= (NULL) // 是否啟動回呼函數user function to call on failed assertions

##php的官方文檔裡頭是建議將assert用來進行debug,我們可以發現還有一個開關ASSERT_ACTIVE可以用來控制是否開啟debug。

現在問題就產生了,如果程式設計師在開發的時候在程式碼中留下了很多assert(),然後在程式發布的時候關閉執行,設定assert_options(ASSERT_ACTIVE,0);這樣做是否可行?有沒有安全問題?

既然assert主要作用是debug,就不要在程式發布的時候還留著它。在程式中用assert對表達進行判斷是不明智的,原因上文說了, 一個是在生產環境中assert可能被disabled,所以assert不能被完全信任;二是assert()可以被繼續執行;而如果在生產環境讓ASSERT_ACTIVE=1,那麼這個表達式字串可以被執行本身就存在安全隱患。

assert引起的程式碼注射例如

<?php
function fo(){
  $fp = fopen("c:/test.php",&#39;w&#39;);
  fwrite($fp,"123");
  fclose($fp);
  return true;
}
assert("fo()");
?>

注意:assert把整個字串參數當php程式碼執行,eval把合法的php程式碼執行。

以上是php中assert和eval的詳細介紹(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除