亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么時候php中的EVE是邪惡的?

什么時候php中的EVE是邪惡的?

PHP
慕絲7291255 2019-06-01 15:50:23
什么時候php中的EVE是邪惡的?在我開發php的這么多年來,我一直聽說使用eval()是邪惡的??紤]到下面的代碼,使用第二個(更優雅的)選項不是很有意義嗎?如果沒有,為什么?// $type is the result of an SQL statement// e.g. SHOW COLUMNS FROM a_table LIKE 'a_column';// hence you can be pretty sure about the consistency// of your string$type = "enum('a','b','c')";// possibility one$type_1 = preg_replace('#^enum\s*\(\s*\'|\'\s*\)\s*$#', '', $type);$result = preg_split('#\'\s*,\s*\'#', $type_1);// possibility twoeval('$result = '.preg_replace('#^enum#','array', $type).';');
查看完整描述

4 回答

?
慕碼人8056858

TA貢獻1803條經驗 獲得超6個贊

我會謹慎地稱val()為純粹的邪惡。動態評估是一個強大的工具,有時也可以成為生命的拯救者。有了val(),就可以解決PHP的缺點(見下文)。

val()的主要問題是:

  • 潛在的不安全輸入。

    傳遞不受信任的參數是失敗的一種方法。確保參數(或參數的一部分)完全可信通常不是一項簡單的任務。
  • 詭計。

    使用val()使代碼更聰明,因此更難以理解。引用布賴恩·克尼漢的話

    調試的難度是編寫代碼的第一步的兩倍。因此,如果您盡可能聰明地編寫代碼,那么根據定義,您就沒有足夠的智能來調試它。"

實際使用val()的主要問題只有一個:

  • 沒有經驗的開發人員誰使用它沒有足夠的考慮。

根據經驗,我傾向于這樣做:

  1. 有時val()是唯一/正確的解決方案。
  2. 在大多數情況下,人們應該嘗試其他的東西。
  3. 如果不確定,去2。
  4. 否則,

    非常小心。


查看完整回答
反對 回復 2019-06-01
?
智慧大石

TA貢獻1946條經驗 獲得超3個贊

當用戶輸入被包含在計算的字符串中時,Eval是邪惡的。當您不使用來自用戶的內容時,您應該是安全的。

盡管如此,在使用val之前至少要考慮兩次,它看起來非常簡單,但是使用錯誤處理(請參閱VBAssassins的注釋)、可調試性等等。在心里,這已經不是那么簡單了。

因此,作為一個經驗法則:忘記它。當伊娃是答案時,你很可能問錯了問題!-)


查看完整回答
反對 回復 2019-06-01
?
牧羊人nacy

TA貢獻1862條經驗 獲得超7個贊

Eval()在任何時候都是同樣邪惡的。

“什么時候才不邪惡?”在我看來,這是一個錯誤的問題,因為它似乎意味著在某些情況下,使用val()的缺點神奇地消失了。

使用val()通常是個壞主意,因為它降低了代碼的可讀性,降低了您在運行時之前預測代碼路徑(以及可能的安全含義)的能力,從而降低了調試代碼的能力。使用val()還可以防止操作碼緩存(如集成到PHP 5.5和更高版本的Zend Opcache)或JIT編譯器(如HHVM中的JIT編譯器)對評估的代碼及其周圍的代碼進行優化。

此外,沒有任何情況下絕對有必要使用val()-PHP是一種功能齊全的編程語言,沒有它。

在某些情況下,您是否真的將這些看作是邪惡的,或者您是否可以親自證明使用val()是由您來決定的。對一些人來說,罪惡太大了,根本無法證明它是正當的,而對另一些人來說,val()是一條便捷的捷徑。

但是,如果您認為val()是邪惡的,那么它在任何時候都是邪惡的。它并不會神奇地失去它的邪惡取決于背景。


查看完整回答
反對 回復 2019-06-01
?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

在這種情況下,只要用戶永遠不可能在表中創建任意列,val就可能是足夠安全的。

不過,它已經不太優雅了。這基本上是一個文本解析問題,濫用PHP的解析器似乎有點麻煩。如果您想濫用語言特性,為什么不濫用JSON解析器呢?至少對于JSON解析器,根本不可能注入代碼。

$json = str_replace(array(
    'enum', '(', ')', "'"), array)
    '',     '[', ']', "'"), $type);$result = json_decode($json);

正則表達式可能是最明顯的方式。可以使用單個正則表達式從此字符串提取所有值:

$extract_regex = '/
    (?<=,|enum\()   # Match strings that follow either a comma, or the string "enum("...
    \'      # ...then the opening quote mark...
    (.*?)       # ...and capture anything...
    \'      # ...up to the closing quote mark...
    /x';preg_match_all($extract_regex, $type, $matches);$result = $matches[1];


查看完整回答
反對 回復 2019-06-01
  • 4 回答
  • 0 關注
  • 514 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號