【问题标题】:PHP: GET-data automatically being declared as variablesPHP:GET-data 自动被声明为变量
【发布时间】:2008-09-19 13:34:53
【问题描述】:

获取此代码:

<?php
if (isset($_POST['action']) && !empty($_POST['action'])) {
    $action = $_POST['action'];
}

if ($action) {
    echo $action;
}
else { 
    echo 'No variable';
}
?>

然后使用 ?action=test 访问文件 有什么方法可以防止 $action 被 GET 自动声明?当然除了添加

&& !isset($_GET['action'])

为什么要为我声明变量?

【问题讨论】:

    标签: php url get


    【解决方案1】:

    检查您的 php.ini 中的 register_globals 设置。它可能已开启,您想要关闭它。

    为什么要为我声明变量?

    You don't. 这是一个可怕的安全风险。它使环境、GET、POST、Cookie 和服务器变量成为全局变量(PHP manual)。这些是 PHP 中的少数reserved variables

    【讨论】:

    • 感谢您的回答,这确实是我一直在寻找的。但是我的例子是 register_globals 唯一影响的吗?
    • 我在上面的答案中发布了更多内容——它会影响环境、获取、发布、cookie 和服务器。
    【解决方案2】:

    看起来你的 php.ini 中的 register_globals 是罪魁祸首。你应该把它关掉。戴上它也是一个巨大的安全风险。

    如果您在共享主机上并且无法修改 php.ini,您可以使用 ini_set() 关闭 register_globals。

    【讨论】:

      【解决方案3】:

      如果我理解您的问题,请将 register_globals 设置为关闭。 见http://us2.php.net/manual/en/language.variables.predefined.php

      【讨论】:

        【解决方案4】:

        如果您无权访问 php.ini,则 php 脚本中的 ini_set('register_globals', false) 将不起作用(变量已声明) 一个 .htaccess 包含:

        php_flag register_globals Off
        

        有时会有所帮助。

        【讨论】:

          【解决方案5】:

          您可以通过将PHP.INI中的PHP日志级别更改为来测试所有变量是否正确声明

          error_reporting  =  E_ALL 
          

          您的代码 sn-p 现在应该生成一个 NOTICE。

          【讨论】:

            【解决方案6】:

            在 php 历史的某个时刻,他们做出了有争议的决定,即默认关闭 register_globals,因为这是一个巨大的安全隐患。它使任何人都有可能在您的代码中注入变量,从而产生不可想象的后果!这个“特性”甚至在 php6 中被删除了

            如果您发现它处于开启状态,请联系您的管理员将其关闭。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-10-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多