如何在没有后端数据库支持的情况下实现基于表单的身份验证?

6
我有一个以CGI程序运行的PHP脚本,HTTP Authenticate头部会被删除并输出。因此,我想实现一种基于表单的身份验证。另外,由于没有数据库,因此无法存储会话数据。
我非常愿意设置主用户名和密码。我只需要保护应用程序免受不知道这些凭据的入侵者攻击。
那么,你会如何实现呢?
使用Cookies吗?
我可以展示表单,如果验证通过,我可以发送回一个哈希值为IP地址和秘密代码的Cookie。然后,我可以防止页面渲染,除非该Cookie正确解密。但是我不知道如何在PHP中实现它。

尽可能重用现有的身份验证框架,因为它确实很复杂。例如,请查看 https://github.com/delight-im/PHP-Auth,它可以与 SQLite 一起使用作为最小化的后备数据存储。如果您真的不想使用数据库,请尝试 HTTP 基本身份验证或将用户数据存储在平面文件中。但我不认为您不能使用 SQLite 或其他东西。 - caw
4个回答

5

以下是几种方法。

  1. htaccess -- 让您的 Web 服务器处理需要保护的页面(虽然不完全是基于 CGI 表单的)。
  2. 使用 cookie 和某种哈希算法(md5 足够好),将密码存储在一个平面文件中,其中文件中的每一行都是用户名:密码哈希。请务必添加盐值以提高安全性,以防止彩虹表攻击。(如果您选择这种方法,请非常小心安全问题)
  3. 使用像 sqlite 数据库这样的东西来处理身份验证。Sqlite 小巧简单,即使您不想要大型数据库后端,它仍然可能满足您的需求。

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


1

如果您目前正在使用Authenticate,那么您可能已经拥有一个htpasswd文件。 如果您想继续使用该文件,但是切换到使用基于FORM的身份验证而不是通过Authenticate标头进行身份验证,您可以使用PHP脚本来使用相同的htpasswd文件,并使用会话来维护身份验证状态。

快速搜索php htpasswd会显示this page页面,其中包含用于检查htpasswd凭据的PHP函数。 您可以将其集成(假设您已将会话设置为自动启动)到类似以下代码的一些代码中:

// 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;

1

你真的需要一个表单吗?无论你做什么,你都受限于已知的用户名和密码。如果他们知道,他们就能得到你的神奇Cookie。你希望防止他们在不知道秘密的情况下查看页面,基本授权可以做到这一点,易于设置,并且不需要你大量的工作。

如果Web服务器为你处理访问控制,你真的需要看到Authorization头吗?

此外,如果你要将应用程序提供给已知列表的人(而不是公众),你可以基于其他因素(例如传入的IP地址、客户端证书等)提供基于Web服务器的访问,这些因素只是配置问题,而不是编程问题。如果你解释了你的安全约束,我们可能会提供更好的解决方案。

祝你好运,:)


-1

关于盐,将用户名添加到您的哈希盐中可以防止知道您的盐并且可以访问您的密码文件的人编写彩虹表并破解您用户的密码数量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接