9

拿这个代码:

<?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'])

为什么要为我声明变量?

4

6 回答 6

27

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

为什么要为我声明变量?

你没有。这是一个可怕的安全风险。它使环境、GET、POST、Cookie 和服务器变量成为全局变量(PHP 手册)。这些是 PHP 中的少数保留变量

于 2008-09-19T13:38:08.460 回答
4

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

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

于 2008-09-19T13:41:13.553 回答
2

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

于 2008-09-19T13:41:43.380 回答
2

如果您无权访问php.iniini_set('register_globals', false)则 php 脚本中的 a 将不起作用(已声明变量) An .htacces具有:

php_flag register_globals Off

有时可以提供帮助。

于 2008-09-19T18:34:36.360 回答
1

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

error_reporting  =  E_ALL 

您的代码片段现在应该生成一个通知。

于 2008-09-19T13:42:29.447 回答
1

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

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

于 2008-09-19T18:25:21.950 回答