6

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

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

那么你将如何实现呢?

饼干?

我可以出示表格,如果验证通过,我可以发回一个 cookie,该 cookie 是 IP 地址的散列来密码。然后我可以阻止页面呈现,除非事情正确解密。但我不知道如何在 PHP 中实现它。

4

4 回答 4

5

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

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

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

于 2008-08-20T04:37:35.243 回答
1

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

对 php htpasswd 的快速 Google 搜索显示该页面带有一个 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;
于 2008-08-28T08:54:09.037 回答
1

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

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

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

祝你好运, :)

于 2008-09-20T21:44:16.957 回答
-1

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

于 2008-08-20T04:44:37.987 回答