如何在没有后备数据库的情况下实现基于FORM的身份验证

时间:2008-08-20 03:27:08

标签: php http authentication cookies cgi

我有一个PHP脚本作为CGI程序运行,HTTP Authenticate标头被吃掉并吐出。所以我想实现某种基于FORM的身份验证。作为附加约束,没有数据库,因此不能存储会话数据。

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

那你将如何实现呢?

缓存?

我可以提供表单,如果它有效,我可以发回一个cookie,它是IP地址的密码来密码。然后我可以阻止页面呈现,除非事物正确解密。但我不知道如何在PHP中实现它。

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

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

快速Google搜索php htpasswd会显示带有PHP函数的this page,以检查针对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;

答案 2 :(得分:1)

你真的需要一张表格吗?无论你做什么,你都会受到已知用户名和密码的限制。如果他们知道这一点,他们会得到你的神奇饼干。如果他们不知道秘密,您希望阻止他们查看页面,并且基本授权可以做到这一点,易于设置,并且您不需要做很多工作。

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

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

祝你好运,:))

答案 3 :(得分:-1)

...关于salt,在你的哈希盐中添加用户名会阻止有人知道你的盐并且有权访问你的密码文件来写一个彩虹表并破解用户密码的数量。