PHP:GET数据自动声明为变量

时间:2020-03-06 14:25:56  来源:igfitidea点击:

采取以下代码:

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

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

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

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

为什么要为我声明变量?

解决方案

检查php.ini中的register_globals设置。它可能已打开,我们希望将其关闭。

Why would I want the variable to be declared for me?

你不知道这是一个可怕的安全风险。它使Environment,GET,POST,Cookie和Server变量成为全局变量(PHP手册)。这些是PHP中的少数保留变量。

看起来php.ini中的register_globals是元凶。我们应该关闭此功能。启用它也是巨大的安全风险。

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

如果我了解问题,请将register_globals设置为off。
参见http://us2.php.net/manual/zh/language.variables.predefined.php

我们可以通过将PHP.INI中的PHP日志级别设置为来测试是否正确声明了所有变量。

error_reporting  =  E_ALL

代码段现在应该生成一个NOTICE。

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

如果我们注意到它已打开,请与管理员联系以将其关闭。

如果我们无权访问php.ini,则php脚本中的ini_set('register_globals',false)将不起作用(变量已声明)
.htaccess具有:

php_flag register_globals Off

有时可以提供帮助。