繁体   English   中英

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

[英]How would you implement FORM based authentication without a backing database?

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

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

那你将如何实现呢?

饼干?

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

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

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

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

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

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

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

祝好运, :)

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

快速谷歌搜索php htpasswd显示这个页面有一个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;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM