3 回答

TA貢獻1836條經(jīng)驗 獲得超3個贊
我發(fā)現(xiàn)這只是一種不好的做法,因為它會導致許多變數(shù),將來的維護者(或您自己在幾周內(nèi))都不知道它們的來源??紤]這種情況:
extract($someArray); // could be $_POST or anything/* snip a dozen or more lines */echo $someVariable;
哪里$someVariable
來的?誰能告訴?
我沒有看到這個問題,從他們開始在陣列中訪問的變量,所以你真的需要展示一個良好的情況下,對使用extract()
我認為這是值得的。如果您真的很擔心要輸入一些額外的字符,請執(zhí)行以下操作:
$a = $someLongNameOfTheVariableArrayIDidntWantToType;$a['myVariable'];
我認為這里有關(guān)安全性的評論有些夸張。該函數(shù)可以使用第二個參數(shù),該參數(shù)實際上可以使您對新創(chuàng)建的變量有相當好的控制,包括不覆蓋任何現(xiàn)有變量(EXTR_SKIP
),僅覆蓋現(xiàn)有變量(因此您可以創(chuàng)建白名單)(EXTR_IF_EXISTS
)或為變量添加前綴(EXTR_PREFIX_ALL
)。

TA貢獻1784條經(jīng)驗 獲得超7個贊
快過來 人們指責工具而不是用戶。
這就像在反對,unlink()
因為您可以使用它刪除文件。extract()
是一項與其他功能相同的功能,請明智且負責地使用它。但是,不要聲稱它本身是不好的,那只是無知。

TA貢獻1893條經(jīng)驗 獲得超10個贊
風險是:不信任用戶的數(shù)據(jù),將其提取到當前符號表中意味著您的變量可能會被用戶提供的內(nèi)容覆蓋。
<?php $systemCall = 'ls -lh'; $i = 0; extract($_GET); system($systemCall); do { print_r($data[$i]; $i++; } while ($i != 3);?>
(一個荒謬的例子)
但是現(xiàn)在有一個惡意用戶猜測或知道了代碼調(diào)用:
yourscript.php?i=10&systemCall=rm%20-rf
代替
yourscript.php?data[]=a&data[]=b&data[]=c
現(xiàn)在,$ systemCall和$ i被覆蓋,導致腳本首先刪除數(shù)據(jù),然后掛起。
添加回答
舉報