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

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

那么你将如何实施呢?

饼干?

我可以提交表单,如果它通过验证,我可以发回一个 cookie,它是 IP 地址的哈希值和密码。然后,除非正确解密,否则我可以阻止页面呈现。但我不知道如何在 PHP 中实现它。

有帮助吗?

解决方案

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

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

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

其他提示

如果您当前正在使用身份验证,那么您可能已经拥有 密码 文件。如果您想继续使用该文件,但切换到使用基于 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;

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

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

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

祝你好运, :)

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top