禁止在简单的PHP登录系统中访问文件

时间:2010-10-02 01:22:20

标签: php session passwords protection password-protection

我写了这个非常简单的PHP登录系统:

<?php
    session_start();
    $error = '';

    if (isset($_POST['username']) && isset($_POST['password']))
    {
        if ($_POST['username'] == 'user' && $_POST['password'] == 'pass')
        {
            $_SESSION['client'] = 'ok';
            Header ("location: /kit/kit/index.php");
        }
        else
        {
            $error = 'Usuario o contrase&ntilde;a incorrectos.';
        }
    }

?>

不要担心漏洞问题,不保护任何有价值的东西。

在每个.php页面中我添加:

<?php
    session_start();

    if (!isset($_SESSION['client']) || $_SESSION['client'] != 'ok')
    {
        Header ("location: /kit/index.php");
        die();
    }

?>

这样可以很好地保护.php会话。

问题是这不能保护文件。

我的意思是如果直接去:

东西/其他/ file.zip

它会下载它,无论你是否已经进入。

我希望问题很清楚,如果没有,请问!

5 个答案:

答案 0 :(得分:2)

要阻止用户查看目录,您只需在该文件夹中创建索引页即可。例如:index.htm,index.html,default.htm,default.html。

要阻止用户输入文件夹(例如阻止任何人查看http://www.yoursite.com/myFolder/),您可能需要访问网络托管服务商的某些功能。某些主机允许您使用密码保护文件或文件夹。您还可以创建.htaccess文件/文件夹

htaccess文件是一个简单的ASCII文件,例如您可以通过NotePad或SimpleText等文本编辑器创建。许多人似乎对文件的命名约定有些混淆,所以让我把它弄清楚。

.htaccess是文件扩展名。它不是file.htaccess或somepage.htaccess,它只是命名为.htaccess

创建文件

要创建文件,请打开文本编辑器并将空白页保存为.htaccess(或键入一个字符,因为某些编辑器不允许您保存空白页)。您的编辑器可能会将其默认文件扩展名附加到名称中(例如:对于记事本,它将调用文件.htaccess.txt)。你需要删除.txt(或其他)文件扩展名才能让自己获得htaccessing - 是的,我知道这不是一个单词,但它听起来很敏锐,不是吗?您可以通过右键单击文件并通过删除任何不说.htaccess的内容来重命名它。你也可以通过telnet或你的ftp程序重命名它,你应该熟悉其中一个,以免需要解释。

htaccess文件必须以ASCII模式上传,而不是BINARY。这使得文件可以被服务器使用,但是防止浏览器读取文件,这会严重损害您的安全性。 (例如,如果您有受密码保护的目录,如果浏览器可以读取htaccess文件,那么他们可以获取身份验证文件的位置,然后对列表进行反向工程以完全访问您以前受保护的任何部分。是防止这种情况的不同方法,一种是将所有身份验证文件放在根目录之上,以便它们不是www可访问的,另一种是通过htaccess系列命令阻止浏览器访问,更多内容后)

JUST INCASE阻止用户下载文件

将所有可下载的内容存储在您的文档根目录中。这意味着在public_html文件之前。

编辑:更新了以下部分,以显示文件夹结构的图形表示

您如何访问它们?

work
    downloadableFiles
        downloadables
        -    memberOnlyFile.zip
        -    welcomePackage.zip
        -    memberhshipVideoVideo.mov    
        photos
        -    photo1.jpeg
        -    photo2.jpeg
    publi    c_html
    -   index.htm
        About
        -    about.html             
        -    about.gif
        LogIn
        -    login.htm
        -    loginScreen.htm
        -    loginFancyButton.gif

现在,通过您的网站可以看到public_html文件夹中的任何内容。

您的public_html文件夹之外的任何内容都无法通过您的网站直接向全世界显示,只需在浏览器的地址栏中键入文件名即可。所以这是一件好事,因为我们要保存所有我们不希望在public_html文件夹之外提供访问权限的文件。

现在说如果您希望某个用户能够下载文件,比如可能是已登录的用户,您仍然可以通过指向该文件的链接来下载该文件。

如果我们在登录页面,要访问loginScreen网页,您只需记下这样的超链接:

<a href="loginScreen.htm">login screen</a>

因为该页面位于同一文件夹中。现在,如果你想让用户能够从public_html文件夹之外的可下载文件夹中下载一个文件,因为它不在那个文件夹中,你就可以自己引用它:

如果我们在登录文件夹中,当我们查看loginScreen.htm页面时,我们将如何访问该文件夹,您将返回一个文件夹,因此我们最终会进入public_html文件夹。然后我们回到另一个文件夹,所以我们在工作文件夹中。

所以到目前为止看起来像这样。

../../这意味着两个文件夹。

然后访问memberonlypath.zip然后我们需要进入downloadableFiles文件夹,然后我们需要进入可下载文件,然后我们可以将它链接到文件membersOnlyFile.zip,这是我们以前查找过的文件。

所以完整链接现在变为

<a href="../../downloadableFiles/downloadable/membersOnlyFile.zip">download file</a>

这样,用户只需在地址栏上输入该文件即可访问该文件,但如果您自己引用该文件,则可以下载该文件。

希望这有帮助

<强> PK

答案 1 :(得分:0)

您需要.htaccess拒绝访问该文件夹。

答案 2 :(得分:0)

将您不想下载的所有文件存储在DocumentRoot之外。

答案 3 :(得分:0)

只需拥有一个像php下载脚本:this one即可获取public_html文件夹下的文件。

答案 4 :(得分:0)

“静态”文件由Web服务器提供,而不是PHP,因此身份验证的处理方式不同。有两种简单的方法:

  • 处理网络服务器中的所有身份验证,例如使用HTTP基本/摘要认证。 Apache 2.2有一个helpful introduction
  • 使用PHP提供文件,例如使用foo.php / path / to / file如果你启用了“pathinfo”(根据你在服务器配置中设置AcceptPathInfo = ON的PHP docs)或者foo.php?path = path / to / file,这太可怕了,但是很好。

有一个更加企业化的解决方案:

  • 为您的下载服务器编写一个身份验证模块,该模块可以识别来自其​​他站点的身份验证Cookie。许多大型网站都这样做(adcdownload.apple.com浮现在脑海中),部分原因是他们可以将下载保留在CDN上,但仍然具有某种访问控制。

有一个懒惰的解决方法:

  • 将所有内容都放在“不可取”的目录名称中(例如一些随机的base64字符)。确保您无法列出父目录(最简单的方法是创建一个空的“index.html”文件)。