在没有数据库或用户名的情况下使用 php 密码保护文件夹/页面的最佳方法是啥

Posted

技术标签:

【中文标题】在没有数据库或用户名的情况下使用 php 密码保护文件夹/页面的最佳方法是啥【英文标题】:What is the best way to password protect folder/page using php without a db or username在没有数据库或用户名的情况下使用 php 密码保护文件夹/页面的最佳方法是什么 【发布时间】:2010-09-22 03:56:32 【问题描述】:

使用没有数据库或用户名但使用 php 来密码保护文件夹的最佳方法是什么?基本上我有一个页面将列出组织的联系人,并且需要密码保护该文件夹,而无需为每个用户提供帐户。只有一个密码会经常更改并分发给群组。我知道这不是很安全,但我更想知道如何做到这一点。以最好的方式。

如果用户正确输入密码后能记住一段时间就好了。


我正在按照 David Heggie 的建议进行操作,但不使用 cookie。它看起来确实不安全,但最好有一个糟糕的密码保护然后根本没有。

这是针对内部网站的,人们会花时间记住他们的登录名和密码,并且永远不会通过注册过程......除非真的很容易,否则他们不会使用系统一点也不。

我想看看这个问题的其他解决方案。

用户群由不太懂技术的人组成,还有其他方法可以做到这一点。

【问题讨论】:

【参考方案1】:

假设您使用的是 Apache:

http://httpd.apache.org/docs/1.3/howto/htaccess.html#auth

【讨论】:

我想用 php 来做这个。是的,我知道如何使用 .htaccess 此链接不再可用,这是“仅链接”答案的问题【参考方案2】:

好吧,既然您知道一开始是不安全的,您可以将密码存储在您网络服务器上某处的文本文件中。当有人访问该页面时,您可以显示一个要求输入密码的表单。如果密码与文本文件中的内容匹配,则重新加载页面并显示信息。使用文本文件将允许您更改密码,而无需在您想要更改密码时修改他们正在访问的页面。除非您使用 SSL,否则您仍将到处发送纯文本。如果您需要一些代码,请告诉我。

【讨论】:

如果文本文件不在公共目录中,这与 http 基本身份验证和大多数各种 php 实现(没有 SSL 层)一样安全,所以我不会投反对票。 ..?【参考方案3】:

我怀疑这是否会算作 最好的 这样做,但它会起作用。而且由于安全性对您来说似乎不是一个大问题,因此这种方式非常不安全的事实可能也不会打扰您。

有一个 login.php 页面,该页面接受密码,如果登录详细信息正确,则设置一个 cookie。然后每个 php 文件可以检查 cookie 的存在,以确定用户是否“登录”,并相应地显示信息。

login.php
...
if(isset($_POST['password']) && $_POST['password'] == 'my_top_secret_word') 
    setcookie('loggedin', 'true', time() + 1200, '/url/');
 else 
    setcookie('loggedin', 'false', time() - 1200, '/url/');
    // display a login form here

etc

然后每个“受保护”页面都会检查此 cookie:

if(isset($_COOKIE['loggedin'])) 
    if($_COOKIE['loggedin'] == 'true') 
        $showHidden = true;
     else 
        $showHidden = false;
    
 else 
    $showHidden = false;

我相信你明白(非常不安全)的想法......

【讨论】:

【参考方案4】:

编辑:SHA1 不再被认为是安全的。存储的密码哈希也应该是salted。现在有更好的解决方案来解决这个问题。


你可以使用这样的东西:

//access.php

<?php
//put sha1() encrypted password here - example is 'hello'
$password = 'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d';

session_start();
if (!isset($_SESSION['loggedIn'])) 
    $_SESSION['loggedIn'] = false;


if (isset($_POST['password'])) 
    if (sha1($_POST['password']) == $password) 
        $_SESSION['loggedIn'] = true;
     else 
        die ('Incorrect password');
    
 

if (!$_SESSION['loggedIn']): ?>

<html><head><title>Login</title></head>
  <body>
    <p>You need to login</p>
    <form method="post">
      Password: <input type="password" name="password"> <br />
      <input type="submit" name="submit" value="Login">
    </form>
  </body>
</html>

<?php
exit();
endif;
?>

然后在您要保护的每个文件上,放在顶部:

<?php
require('access.php');
?>
secret text

这不是一个很好的解决方案,但它可能会做你想做的事

编辑

您可以添加一个 logout.php 页面,例如:

<?php
    session_start();
    $_SESSION['loggedIn'] = false;
?>
You have logged out   

【讨论】:

+1 用于使用散列算法进行预计算和存储。不过,SHA2 或至少 SHA1 会更安全。 我不知道 OP 对安全性的关心程度。 谢谢!正是我需要的!它也确实返回了一些不影响任何东西的错误,所以我只是通过将&lt;?php error_reporting(0); ?&gt; 放在相应页面的顶部(在&lt;?php require('access.php'); ?&gt; 之前)来关闭 PHP 错误。再次感谢! 我试过用这个,但每次我得到“不正确的密码”。我错过了什么吗? 警告 : 此脚本无法保护同一目录中的图像和其他文件【参考方案5】:

如果你想避免 cookie、会话并且不想玩 .htaccess 文件,你也可以使用 PHP 单独进行 http 身份验证:

http://www.php.net/manual/en/features.http-auth.php

您可以将密码硬编码到文件中并根据需要进行更改,或者从不在 web_accessible 目录中的文件中包含密码。

缺点是您无法格式化“登录”屏幕 - 这将是一个标准的 http 身份验证对话框

【讨论】:

以上是关于在没有数据库或用户名的情况下使用 php 密码保护文件夹/页面的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有密码的情况下记录wordpress用户

php电子表格密码保护

javascript:在没有php的情况下将数据存储在文件或数据库中?

在不知道现有密码 PHP 的情况下更改 oracle db 用户密码

php 用户在有或没有 AJAX 的情况下注销

SSH是否允许用户在没有密码和密钥的情况下登录?