【问题标题】: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。它看起来确实不安全,但最好有一个糟糕的密码保护然后根本没有。

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

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

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

【问题讨论】:

    标签: php passwords password-protection


    【解决方案1】:

    【讨论】:

    • 我想用 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 身份验证对话框

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-12
        • 2012-07-03
        • 2011-10-13
        • 2020-10-20
        • 2016-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多