代码之家  ›  专栏  ›  技术社区  ›  Frank Krueger

如果没有支持数据库,您将如何实现基于FORM的身份验证?

  •  6
  • Frank Krueger  · 技术社区  · 17 年前

    我有一个作为CGI程序运行的PHP脚本和HTTP Authenticate 头被吃掉后吐了出来。因此,我想实现某种基于FORM的身份验证。作为额外的约束,没有数据库,因此无法存储会话数据。

    我非常愿意拥有一个主用户名和密码。我只需要保护应用程序免受不知道这些凭据的入侵者的攻击。

    那么,你将如何实现这一点呢?

    饼干?

    我可以出示表格,如果它有效,我可以发回一个cookie,这是IP地址的哈希密码。然后,除非正确解密,否则我可以阻止页面呈现。但我不知道如何在PHP中实现它。

    4 回复  |  直到 17 年前
        1
  •  5
  •   Justin Standard    17 年前

    有几种方法可以做到这一点。

    1. htaccess --让你的web服务器来处理有问题的页面的安全问题(虽然不是完全基于cgi表单)。
    2. 使用Cookie和某种哈希算法(md5就足够了)将密码存储在一个平面文件中,其中文件中的每一行都是username:passwordhash。确保 salt 与彩虹表相比,您的哈希值具有额外的安全性。(这种方法有点幼稚 非常 如果你走这条路,要小心安全)
    3. 使用类似a的东西 sqlite 数据库仅用于处理身份验证。Sqlite足够紧凑和简单,即使你不想要一个大的数据库后端,它仍然可以满足你的需求。

    理论上,即使没有数据库,您也可以将会话数据存储在平面文件中。

        2
  •  1
  •   John Douthat    17 年前

    你真的需要表格吗?无论你做什么,你都会受到已知用户名和密码的限制。如果他们知道这一点,他们就会得到你的魔法饼干。如果他们不知道这个秘密,你想阻止他们看到这些页面,而基本授权可以做到这一点,很容易设置,也不需要你做很多工作。

    如果web服务器负责您的访问控制,您真的需要看到Authorization标头吗?

    此外,如果您将应用程序提供给已知的人员列表(而不是公众),您可以根据其他因素提供基于web服务器的访问,例如传入的IP地址、客户端证书以及许多其他配置而非编程问题。如果您解释了您的安全限制,我们可能会提供更好的解决方案。

    祝你好运:)

        3
  •  1
  •   brian d foy    17 年前

    如果您当前正在使用Authenticate,那么您可能已经拥有 这里必须使用全路径名 文件。如果你想继续使用该文件,但切换到使用基于FORM的身份验证,而不是通过Authenticate标头,你可以使用PHP脚本使用相同的htpasswd文件,并使用会话来维护身份验证状态。

    在谷歌上快速搜索php-htpasswd即可发现 this page 使用PHP函数根据htpasswd检查凭据。您可以将其与以下代码集成(假设会话设置为自动启动):

    // At the top of your 'private' page(s):
    if($_SESSION['authenticated'] !== TRUE) {
        header('Location: /login.php');
        die();
    }
    
    // the target of the POST form from login.php
    if(http_authenticate($_POST['username'], $_POST['password']))
        $_SESSION['authenticated'] = TRUE;
    
        4
  •  -1
  •   fulmicoton    17 年前

    …关于盐,在哈希盐中添加用户名将防止知道你的盐并有权访问你的密码文件的人编写彩虹表并破解你的用户密码。