如何通过键入URL来阻止后端脚本被访问?

时间:2016-03-27 07:00:43

标签: php .htaccess

我正在玩学习新东西,目前正在努力登录和退出我的网站,只有在我登录时才能访问不同的页面。我目前有一个登录表单会登录我。我有一个会话变量集,可以检查是否有人登录,如果没有重定向到登录页面。这是它的工作原理,以及我的问题。我有一个登录页面,一旦登录将指示您说Home.php。这一切都很好,除了,我可以从网址直接转到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并从All添加Deny,但是这会阻止任何后端脚本运行。我可以使用cgi-bin吗?如果是这样,我究竟如何访问它?在我的ftp上它不允许我在根目录www之外添加任何内容。有没有办法在已建立的主机内部指定一个新的根目录?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

许多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']来查看用户请求的网址,并根据需要包含文件,某种路由器功能。

结帐Slim框架以查看更强大的方法

修改

您可以使用的最简单的事情如下:

内部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语句中您可以添加所需的所有会话验证,在此之前您可以预处理请求。这样,您就可以完全控制用户可以访问的每个文件

答案 2 :(得分:0)

Home.php是一个混有html的php脚本,没有分离。你需要将你的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");
}
?>