加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 安全漏洞?

发布时间:2020-12-13 17:16:45 所属栏目:PHP教程 来源:网络整理
导读:使用此代码会产生什么影响? ?phpif(file_exists("pages/" . $_GET["page"] . ".php")){ include("pages/" . $_GET["page"] . ".php"); } else{ include("pages/home.php"); }? 我已经做到了这样你就不能在没有“.php”扩展名的情况下加载任何东西,所以我认
使用此代码会产生什么影响?

<?php
if(file_exists("pages/" . $_GET["page"] . ".php")){
    include("pages/" . $_GET["page"] . ".php");
    } else{
        include("pages/home.php");
        }
?>

我已经做到了这样你就不能在没有“.php”扩展名的情况下加载任何东西,所以我认为使用起来非常安全.如果您使用:

website.com/index.php?page=../index

在url中它将创建一个无限循环.据我所知,您无法加载外部URL.

例:

website.com/index.php?page=anothersite.com/virus

但我不确定,有什么建议吗?或者这可以使用吗?

解决方法

正如 zerkms已经指出的那样,取决于PHP版本,file_exists和include可能是 not be safe when handling NULL bytes.仅 since PHP version 5.4.3,filesystem functions are said to be NULL byte safe.

因此,您应该在使用之前验证该值,例如,使用允许值的白名单:

$allowedPages = array(/* … */);
if (in_array($_GET["page"],$allowedPages)) {
    // allowed
}

您还可以将此白名单展开到文档根目录下的任何现有文件:

if (strpos($_GET["page"],"") !== false) {
    // NULL byte detected
}
$path = realpath("pages/" . $_GET["page"] . ".php");
$base = realpath($_SERVER['DOCUMENT_ROOT']) . "/";
if ($path !== false && substr($path,strlen($base)) === $base) {
    // allowed
}

但是,这仍然可以用于绕过其他访问控制措施,例如基于位置的HTTP授权.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读