最近,我在一些最差的PHP实践中阅读了此线程。在第二个答案中,有一个关于的使用的简短讨论extract(),我只是想知道所有有关的内容。我个人使用它来切分给定的数组,例如$_GET或$_POST稍后在其中清理变量,因为它们已为我方便地命名。这是不好的做法吗?这有什么风险?您对的使用extract()有何看法?
3 回答
米脂
TA贡献1836条经验 获得超3个赞
我发现这只是一种不好的做法,因为它会导致许多变数,将来的维护者(或您自己在几周内)都不知道它们的来源。考虑这种情况:
extract($someArray); // could be $_POST or anything/* snip a dozen or more lines */echo $someVariable;
哪里$someVariable
来的?谁能告诉?
我没有看到这个问题,从他们开始在阵列中访问的变量,所以你真的需要展示一个良好的情况下,对使用extract()
我认为这是值得的。如果您真的很担心要输入一些额外的字符,请执行以下操作:
$a = $someLongNameOfTheVariableArrayIDidntWantToType;$a['myVariable'];
我认为这里有关安全性的评论有些夸张。该函数可以使用第二个参数,该参数实际上可以使您对新创建的变量有相当好的控制,包括不覆盖任何现有变量(EXTR_SKIP
),仅覆盖现有变量(因此您可以创建白名单)(EXTR_IF_EXISTS
)或为变量添加前缀(EXTR_PREFIX_ALL
)。
噜噜哒
TA贡献1784条经验 获得超7个赞
快过来 人们指责工具而不是用户。
这就像在反对,unlink()
因为您可以使用它删除文件。extract()
是一项与其他功能相同的功能,请明智且负责地使用它。但是,不要声称它本身是不好的,那只是无知。
白猪掌柜的
TA贡献1893条经验 获得超10个赞
风险是:不信任用户的数据,将其提取到当前符号表中意味着您的变量可能会被用户提供的内容覆盖。
<?php $systemCall = 'ls -lh'; $i = 0; extract($_GET); system($systemCall); do { print_r($data[$i]; $i++; } while ($i != 3);?>
(一个荒谬的例子)
但是现在有一个恶意用户猜测或知道了代码调用:
yourscript.php?i=10&systemCall=rm%20-rf
代替
yourscript.php?data[]=a&data[]=b&data[]=c
现在,$ systemCall和$ i被覆盖,导致脚本首先删除数据,然后挂起。
添加回答
举报
0/150
提交
取消