如何使用extract安全地创建PHP变量

Lui*_*ado 12 php extract

在我之前的帖子中,我问如何从数组创建变量(使用foreach创建的PHP变量)我得到了几个答案,我正在测试extract()但是出于安全原因我看过几个反对它.

现在我的问题是如何以安全的方式从$ _POST中使用提取,该$ _POST具有使用jquery序列化生成的数组.

安全,我的意思是,如果用户输入错误的数据,安全的方式可以毫无问题地处理.

PHP站点在extract命令中有一个小警告,说明如下:

不要对不受信任的数据使用extract(),例如用户输入(即$ _GET,$ _FILES等).如果您这样做,例如,如果您想要运行暂时依赖于register_globals的旧代码,请确保使用其中一个非重写的extract_type值,例如EXTR_SKIP,并注意您应该以与variables_order中定义的顺序相同的顺序提取php.ini.

它警告使用但不提供至少如何以安全的方式解决提取的用户的示例.

Mar*_*c B 10

最好的选择是根本不使用extract().从用于编写安全代码的PHP相当于湿卫生纸的日子来看,这是一个糟糕的设计决定.

这可能是痛苦的,但写出一长串序列要好得多:

$var1 = $_POST['var1'];
$var2 = $_POST['var2'];
etc...
Run Code Online (Sandbox Code Playgroud)

或者只是$_POST['var1']在代码中的任何地方使用和公司.

一旦您开始使用数据提取,您就可以为恶意用户提供进入代码的潜在方式,无论您投入多少时间/精力.你没有在银行金库门上钻一个洞,因为每次开门都要打开门太烦人了.一旦有洞,它就会被利用.

  • 谢谢你的历史.不知道那个. (2认同)

Jae*_*Lee 7

不要使用extract(),只需在POST/GET上使用foreach()来创建自己的数组/对象.一旦你的代码开始变大,extract()将成为调试的噩梦.


Ali*_*xel 6

只要您使用其他变量中不存在的前缀,这就足够安全了:

extract($_POST, EXTR_PREFIX_ALL, 'unique_prefix');
Run Code Online (Sandbox Code Playgroud)

提取可能有危险的原因与使用register_globals相同.