使用extract($ _ POST)是不安全的?

时间:2012-08-10 18:36:06

标签: php security

使用extract($_POST)不安全吗?如果是,那我该怎么办呢?

5 个答案:

答案 0 :(得分:6)

是的。 register_globals就是一样的东西。这意味着如果有人注入名为“my_name”的值,则变量“my_name”将存在。如果它存在,如果您使用变量$my_name

,它可能会在您的脚本中带来一些垃圾或安全问题

答案 1 :(得分:5)

来自php文档:

  

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

建议的做法是直接使用$_POST[<varname>],以便您网站的用户无法设置应该是“安全”的变量

答案 2 :(得分:1)

是的,这是不安全的。任何人都可以覆盖您的本地变量(例如$password$access_level)。

我建议声明并分配自己的局部变量,如下所示:

$var1 = isset($_POST['field_1'])?$_POST['field_1']:null;
$var2 = isset($_POST['field_2'])?$_POST['field_2']:null;
$var3 = isset($_POST['field_3'])?$_POST['field_3']:null;

答案 3 :(得分:1)

正如其他人所说,使用extract($_POST)是不安全的。您询问了如何使extract($_POST)安全,特别是为了避免不断引用$_POST数组。

字面答案

您问过安全使用extract($_POST)。在定义任何局部变量之前,有点安全可用作脚本的第一行,带有EXTR_PREFIX_ALL和前缀。然而,在这两种情况下,您都在进行冒险赌博,您将永远不会在该变量范围内通过错误 错误地引入安全漏洞。全局范围非常难以验证。由于所有程序员都会犯错误并且不便之处,因此大多数程序员 强烈 鼓励不要extract()不受信任的内容,无论范围,前缀等是否有限。

正确答案

$_POST ed数据不受信任且不安全。你永远不知道它可能包含什么 - 或者它是否会被设置。将$_POST视为“受污染”的数据非常有用,在将数据分配给局部变量之前必须将其“清理”。因此,您应该能够通过在将输入分配给局部变量时验证输入来最小化“$_POST”的输入。使用验证过滤器的filter_input()filter_var()函数,PHP 5.2及更高版本可以更轻松。

另外,您应始终验证您的输入并清理您的输出。如果您改为清理输入,则可能会遇到在不同上下文中显示它们的问题(即,非HTML记录器,打印到终端)。如果您没有清理输出,则会遇到XSS,SQL注入等。

这种心态所鼓励的经验法则是将所有进入你系统的数据从你不控制的另一个数据视为“污染”,不值得信任 - 你可能无法控制运行网络浏览器的系统,除非开发一个LAN。此外,“纵深防御”鼓励将可信任的系统视为可妥协(它发生),这是程序员最普遍的最佳实践。

答案 4 :(得分:0)

总是更好地简单地从$_POST读取值并对它们执行某些操作,而不是仅仅将它们作为变量公开,并冒着压倒一些你的... ...