拒绝用户浏览我的网站目录/文件的请求

时间:2019-03-22 06:50:46

标签: php html

我的问题似乎很基本,但是我不知道如何在Google中进行搜索。我希望我的网站内容只能通过全局get变量访问。就是这样。

<?php
        include("../backend/connection.php");
            if(isset($_GET['page'])){
                if ($_GET['page'] === "register"){
                    include ("pages/register.php");
                }
                elseif($_GET['page'] === "login"){
                    include ("pages/login.php");
                }
                elseif($_GET['page'] === "home"){
                    include ("pages/home.php");
                }
                
            }
?>

因此,用户可以通过“ www.mywebsite.com?page=register”访问注册页面。但是他也可以使用“ www.mywebsite.com/pages/register.php”访问该页面。这是个问题。连接文件仅包含在我的索引文件中。 register.php文件包含需要数据库连接的代码,并且由于该数据库连接仅包含在索引文件中,因此用户将获得错误。通过该错误,他将获得有关我的网站目录的信息,并且他可能会尝试继续挖掘直到找到一个漏洞为止。

我认为以下代码可以解决问题。

<?php
        include("../backend/connection.php");
            if(isset($_GET['page'])){
                if ($_GET['page'] === "register"){
                    include ("pages/register.php");
                }
                elseif($_GET['page'] === "login"){
                    include ("pages/login.php");
                }
                elseif($_GET['page'] === "home"){
                    include ("pages/home.php");
                }
            }elseif(!isset($_GET['page'])){
            header("www.mywebsite.com?page=home");
            }
?>

我认为该代码是一种快速解决方案,但是我知道有一种更好的方法可以做到这一点,我需要一些建议。

2 个答案:

答案 0 :(得分:2)

将文件夹pages移动到文档根目录之外,并用以下命令加载它们:

include ("../pages/register.php");

就像处理../backend/connection.php一样。

这样,没有人可以通过Web服务器从外部直接访问它们,但是仍然可以在您的PHP代码中访问它们。您也不需要检查是否在所有页面上都定义了一些常量。

多数现代框架也是这样做的。他们在Web根目录中只有一个index.php文件,外面的所有其他代码(包括视图)

答案 1 :(得分:1)

您可以定义常量,例如

define('APP_LOADED', true);

在随附的脚本中检查是否已定义常量,如果未定义则退出

if (!defined('APP_LOADED')){
   exit();
}