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

标签 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.';
        }
    }

?>

不必担心漏洞问题,它不会保护任何有值(value)的东西。

在每个.php页面中,我添加:
<?php
    session_start();

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

?>

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

问题在于这不能保护文件。

我的意思是如果直接去:

东西/其他/file.zip

无论您是否登录,它都会下载它。

我希望这个问题很清楚,如果不能,请提出!

最佳答案

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

要阻止用户进入文件夹(例如,阻止任何人查看http://www.yoursite.com/myFolder/),您可能需要访问Web主机的某些功能。某些主机允许您用密码保护文件或文件夹。您也可以创建.htaccess文件/文件夹

htaccess文件是一个简单的ASCII文件,例如您可以通过文本编辑器(如NotePad或SimpleText)创建的文件。许多人似乎对文件的命名约定有些困惑,所以让我将其排除在外。

.htaccess是文件扩展名。它不是file.htaccess或somepage.htaccess,而是简单地命名为.htaccess

创建文件

为了创建文件,打开一个文本编辑器并将一个空白页另存为.htaccess(或键入一个字符,因为某些编辑器不允许您保存一个空白页)。您的编辑器可能会将其默认文件扩展名附加到名称后(例如:对于记事本,它将调用文件.htaccess.txt)。您需要删除.txt(或其他)文件扩展名才能自己访问-是的,我知道这不是一个字,但这听起来很热衷,不是吗?您可以通过右键单击文件,然后删除所有未显示.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文件夹,然后需要进入可下载文件,然后可以将其链接到文件memberOnlyFile.zip,这是我们之前要查找的文件。

所以完整的链接现在变成
<a href="../../downloadableFiles/downloadable/membersOnlyFile.zip">download file</a>

这样,用户无法通过简单地在地址栏上键入文件来访问文件,但是如果您像上述一样自己引用文件,则可以下载文件。

希望这可以帮助

PK

关于php - 禁止在简单的PHP登录系统中访问文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3843967/

相关文章:

javascript - 当查询有变量时,PHP/Javascript + MySQL 数据不会被检索

php - 如何使 PHP 中的用户 session 过期?

php - ini_set() 总是返回 false

c# - 使用密码中的随机数字进行身份验证

php - 如何在php中显示pdf

php - 使用 PHP 和 MySQL 的页面浏览量计数器?

php - 需要帮助来比较 PHP 和 DB 的值(value),$_POST 不起作用..?

session - 跟踪模式 SSL 与 COOKIE 相比有何优势?

php - 通过同一页面上的短信通知用户其密码已更改(使用 PHP 或 AJAX?)

java - 在 Java 中,如何在不生成 String 对象的情况下从 HttpServletRequest header 中提取密码?