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
有时可以提供帮助。