在没有支持数据库的情况下如何实现基于FORM的身份验证?
我有一个作为CGI程序运行的PHP脚本,并且吃掉了HTTPAuthenticate
标头并吐了出来。因此,我想实现某种基于FORM的身份验证。另外,没有数据库,因此无法存储会话数据。
我非常愿意拥有一个主用户名和密码。我只需要保护应用程序免受不知道这些凭据的入侵者的侵害。
那么我们将如何实现呢?
饼干?
我可以出示该表单,如果它可以验证,我可以发回一个cookie,该cookie是IP地址的哈希码。然后,除非事物解密正确,否则我可以阻止页面呈现。但是我不知道如何在PHP中实现它。
解决方案
回答
有几种方法可以做到这一点。
- htaccess-让网络服务器处理有问题的页面的安全(尽管不完全基于cgi表单)。
- 使用cookie和某种哈希算法(md5足够好)将密码存储在一个平面文件中,该文件中的每一行都是username:passwordhash。确保为哈希表加盐以提供比彩虹表更高的安全性。 (这种方法有点天真。如果走这条路,要非常小心安全性)
- 使用诸如sqlite数据库之类的东西来处理身份验证。 Sqlite非常紧凑和简单,即使我们不希望使用大型数据库后端,它仍然可以满足需求。
从理论上讲,即使没有数据库,也可以将会话数据存储在平面文件中。
回答
关于盐,在哈希盐中添加用户名将阻止知道盐并有权访问密码文件的用户编写彩虹表并破解用户密码。
回答
如果我们当前正在使用身份验证,则我们可能已经有一个htpasswd文件。如果我们想继续使用该文件,但转而使用基于FORM的身份验证而不是通过Authenticate标头,则可以使用PHP脚本使用相同的htpasswd文件,并使用会话来维护身份验证状态。
Google对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;
回答
我们真的需要表格吗?无论我们做什么,都会受到用户名和密码已知的限制。如果他们知道这一点,他们会得到让我们使用的魔术cookie。如果他们不知道秘密,就想防止他们看到这些页面,而基本授权可以做到这一点,易于设置,并且不需要我们做很多工作。
如果Web服务器为我们处理访问控制,我们是否真的需要查看Authorization标头?
此外,如果要向已知的人员列表(而不是公众)提供应用程序,则可以基于其他因素(例如,传入IP地址,客户端证书以及许多其他因素)提供基于Web服务器的访问一个配置问题,而不是编程问题。如果我们解释了安全性限制,我们也许可以提供更好的解决方案。
祝你好运, :)