如何通过键入url来防止后端脚本被访问


How do I prevent a backend script from being accessed by typing in the url?

我正在学习新事物,目前正在研究一种登录和退出我的网站的方法,并且只有在登录时才能访问不同的页面。我目前有一个登录表单,可以让我登录。我有一个会话变量集,如果有人登录,可以检查它,如果没有重定向到登录页面,可以检查。以下是它的工作原理,以及我的问题。我有一个登录页面,一旦登录,就会指示你说Home.php。这一切都很好,除了,我可以从url直接转到Home.php。mysite.com/home.php即使用户未登录也允许访问。

为了解决这个问题,我尝试了两件事。我已经在Home.php上尝试过了:

<?php 
session_start();
if(isset($_SESSION["Authenticate"])){
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
</head>
<body>
    <?php include "structure/header.php" ?>
      <div class="cmsPanel">
       <a href="php/cms/logoutProcess.php">Logout</a>
        <div id="AddEditor">
          <form method="POST" action="php/cms/newEditor.php">
            <input class="loginFields" type="text"  name="name" placeholder="First Name">
            <input class="loginFields" type="email" name="email" placeholder="Email">
            <input type="submit" value="Create New Editor">
          </form>
        </div>
        <div id="manageEditors">
          <div>
          </div>
        </div>
      </div>
            <?php include "structure/footer.php" ?>
</body>
</html>
}
else{
    header("Location: login.php");
}
?>

这不起作用。我最终会得到一个错误500和一个空白页。因此,为了想出一个解决方案,我想我可以做这样的事情:

<?php
session_start();
if(isset($_SESSION["Authenticate"])){
    include_once('php/cms/EditorPanel.php');
}
else{
    header("Location: login.php");
}
?>

这是有效的,只是你可以访问mysite.com/php/cms/Editorpanel.php并绕过登录。这也让我意识到,有人也可以直接访问mysite.com/php/cms/newEditor.php和我服务器上的任何其他后端脚本。就我个人而言,我希望能够在home.php上使用第一次尝试,但我也需要了解如何防止任何人访问我服务器上的其他后端脚本。

我想我可以在cms文件夹中使用htaccess,并将Deny from All添加到其中,但这会阻止任何后端脚本运行。我可以使用cgi-bin吗?如果是,我该如何访问它?在我的ftp上,它不允许我在根目录外添加任何内容。有没有办法在主机建立的根目录内指定一个新的根目录?

Home.php是一个php脚本与html混合,没有分隔。您需要将html与php分离。在开始html之前关闭php标记。这应该有助于你的第一期。至于你的第二个问题,保护你的资产@Pablo Flores,答案应该为你指明正确的方向。

    <?php 
session_start();
if(isset($_SESSION["Authenticate"])){
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
</head>
<body>
    <?php include "structure/header.php" ?>
      <div class="cmsPanel">
       <a href="php/cms/logoutProcess.php">Logout</a>
        <div id="AddEditor">
          <form method="POST" action="php/cms/newEditor.php">
            <input class="loginFields" type="text"  name="name" placeholder="First Name">
            <input class="loginFields" type="email" name="email" placeholder="Email">
            <input type="submit" value="Create New Editor">
          </form>
        </div>
        <div id="manageEditors">
          <div>
          </div>
        </div>
      </div>
            <?php include "structure/footer.php" ?>
</body>
</html>
<?php
}
else{
    header("Location: login.php");
}
?>

当用户注销时,您必须清除会话,并且在每个页面上都必须检查会话是否为空,也许您已经这样做了,但要仔细检查代码。

许多web框架使用的解决方案是使用某种调度器。

因此,您可以在站点的根目录中有一个.htaccess文件,如下所示:

RewriteEngine on
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward it to index.php to dispatch request
RewriteRule . index.php

在放置源代码的目录中,可以添加一个拒绝所有请求的htaccess

deny from all

在index.php中,您只需要解析$_SERVER['REQUEST_URI']即可查看用户请求的url,并根据需要包括文件,这是某种路由器功能。

检查Slim框架以查看更健壮的Adropach

编辑

你可以使用的最简单的东西是:

内部index.php

var_dump($_SERVER['REQUEST_URI']);//For debugging purposes, so you could check the url
if(strstr($_SERVER['REQUEST_URI'],"private.php")){//if the url requested the file private.php inside the private directory
 require_once './private/private.php'; //include the file
} 

正如您所看到的,用户不能直接访问任何源代码,在if语句中,您可以添加所需的所有会话验证,在此之前,您可以预处理请求。通过这种方式,您可以完全控制用户可以访问的每个文件