使用 $_SERVER['REQUEST_URI'] 检查 URL 字符串的风险


Risk of checking string of URL with $_SERVER['REQUEST_URI']

在网上浏览我的网站的不同解决方案时,我总是仔细检查安全风险,尤其是当涉及到服务器全局时。

虽然我理解在不清理的情况下使用输入数据的风险,但我不确定是否将服务器全局变量用于简单的 PHP 函数。

我正在使用一个函数来检查我的 URL 中是否有特定的字符串:

if (strpos($_SERVER['REQUEST_URI'], 'foo') !== false) :
// do something
endif;

我必须担心任何XSS或注入的乐趣吗?

No.你可以保持放松。

如果您尝试将变量作为代码进行评估,则很少会出现一些问题,但事实并非如此。

全局变量的主要安全问题存在于一年前流行的指令register_globals(从 PHP 5.4.0 开始删除):当此选项处于活动状态时,所有 GET 和 POST 变量都转换为全局变量(即 $_GET['user'] $user 提供)。

因此,调用像 http://example.com/index.php?destroyall=1 这样的 url ,如果index.php是:

if( $_GET['areYouSure']==1 )
{
    $destroyall = 1;
}
if( $destroyall )
{
    deleteAllMyFilesNow();
}
即使

areYouSure为 False,也会执行deleteAllMyFilesNow(),因为$_GET[destroyall]直接设置 $destroyall 的值。

要了解该register_global的受欢迎程度,请考虑PHP站点报告:

也许 PHP 中最具争议的变化是 PHP 指令的默认值register_globals从 ON 变为 OFF