如果我使用 ../../ 作为前缀,PHP 中的 URL 重定向是否安全?

信息安全 php 网址重定向 网址
2021-09-03 02:32:50

我正在开发一个 PHP Web 应用程序,并且正在实现重定向功能。

我知道重定向可以在客户端设置并且我../../用作重定向的前缀时可能很危险

这足以确保一个人只能重定向到内部页面吗?我试了一下$_POST['redirurl']含有一样的东西http://www.evil.com; http://www.evil.com,但不奏效。

这安全吗?

if(isset($_POST['redirurl'])){
    $redir='Location: ../../'.$_POST['redirurl'];
    header($redir);
}
2个回答

永远不应该允许重定向到可以在客户端操作的相对路径。正如您所说,这很危险,因为它可能允许访问您的 webroot 之外的文件。更好的方法是“标记”或命名目标页面并在代码中重定向到它们。

例如,当用户触发表单时,让它redirpage以特定值发布,例如dashboard将用户重定向到仪表板页面。然后在您的代码中,只需检查支持的页面名称:

switch ($_POST['redirpage']) {
    case 'dashboard':
       header('Location: http://www.example.com/dashboard/');
       break;
    case 'account':
       header('Location: http://www.example.com/account/');
       break;
    default:
        // This fallback will be triggered when an "unknown" target page is set
        header('Location: http://www.example.com/');
}

这样,就可以控制可以进行哪些重定向以及它们最终的位置。

正如 Oldskool 所指出的,这种策略还存在其他问题。但是您也可能容易受到标头注入的影响。

header() PHP 手册的更新日志

5.1.2:此功能现在可防止一次发送多个标头,以防止标头注入攻击。

因此,在 5.1.2 之前的 PHP 版本中,您可以发送包含换行符的内容来设置其他标头(或再次设置位置标头)。这是一个安全风险。即使您使用的是较新的 PHP 版本,如果有人出于某种您无法预见的原因在旧服务器上使用您的代码怎么办?通过调用rawurlencode()参数来缓解这个问题