一个简单的 PHP 登录系统.它真的需要SSL证书吗?


A simple login system with PHP. Does it really need an SSL certificate?

我计划提供我的网站设计,如果有人对易于管理的博客感兴趣(或者只是不想自己为新帖子制作新的HTML文件(,这个简单的登录/博客系统是我将提供的作为补充。

它的主要目的是通过提供密码(用户名无法更改(仅允许一个用户登录,并允许他/她编辑一些帐户设置(显示名称,头像,生物(或通过将新内容写入窗口来创建新页面/帖子。这应该是一个非常简单的系统,没有注册表格 - 我想为所有选择购买我的设计的客户提供一个框架。

由于登录系统非常简单,我敢说几乎不需要身份验证 - 只需要密码输入(+用户输入的任何其他形式,例如,新帖子的内容(。所以基本上,它应该具有以下功能:trim()htmlspecialchars()mysql_string_escape(),使用正则表达式和用户会话检查有效字符(顺便问一下,在只有一个用户的网站上甚至需要用户会话吗?在这么简单的网站上还需要什么?我正在考虑自签名SSL证书,但是,它会导致安全警告。在这种情况下甚至需要它吗?

这个系统将在我工作的每个HTML/CSS设计项目中重复使用,所以现在需要决定,因为我将为那些只想运行他们的个人网站/博客而不学习所有wordpress内容的人提供这个框架和网站。

我知道网站应该加密,但由于这里唯一需要加密的是密码,我应该使用什么?

请不要滚动自己的登录系统:

http://cubicspot.blogspot.com/2012/05/dear-web-developers-stop-making-login.html

您还可以获取由浏览器根证书颁发机构签名的免费 SSL 证书:

http://cubicspot.blogspot.com/2011/02/truly-free-ssl-certificates-are-here.html

除非您希望客户的登录密码以明文形式通过网络,否则是的,您需要SSL证书。 您可以使用自签名证书(如您所提到的(,如果您不想购买适当的证书,请指示您的客户在实际登录之前验证证书中的信息。 打开https会话后,为什么不将其保持打开状态,并且用户在相对安全的情况下进行工作?

如果它应该只有一个用户可以登录,那么您可以将所有管理内容放在一个单独的文件夹中,并使用密码保护该文件夹.htaccess

在您的.htaccess文件中使用此

AuthUserFile /full/path/to/.htpasswd
AuthName "Please Log In"
AuthType Basic

.htpasswd是存储用户密码的文件。

有关更多信息,请参阅以下内容:http://www.addedbytes.com/lab/password-protect-a-directory-with-htaccess/

您需要的安全级别与其说与机制的复杂性有关,不如说与您保护的东西的价值有关。

如果您将其作为服务提供,您可能不希望使用弱身份验证系统,该系统允许您的客户创建的网站被黑客接管。如果你在传输过程中不加密用户密码,你就让黑客的生活变得非常非常容易 - 他们所要做的就是在星巴克设置,破解WIFI,看着你的客户登录,并接管他们的网站。因此,请使用SSL证书;自签名可保护您的数据,但会导致安全警告 - 在适当的证书上大肆宣传。

通常,用户不信任自签名证书是正确的,因为这是(相当不复杂的(黑客可能会攻击您的一种方式。例如,如果要窃取 StackOverflow.com 用户的凭据,则可以注册域 stack0verfl0w.com,并为登录页面颁发自签名证书。用户会看到该证书,它将与(虚假(域匹配,如果他们习惯于接受自签名证书,他们会继续在黑客的网站上输入他们的详细信息。

所以,是的,您可以使用自签名证书,它将加密网络流量,但训练用户忽略浏览器的安全警告不是一个好主意。"自签名"的定义是它们没有在任何地方注册。

其次,请不要以纯文本形式存储密码。执行此操作的常见方法是使用单向哈希存储密码(PHP 内置了这个(;即使黑客可以窃取您的数据库,哈希函数也是单向的;没有(简单的(方法来检索明文密码。当用户登录时,您可以使用相同的算法对其密码进行哈希处理,如果数据库中的哈希匹配,则允许他们进入。

第三,考虑使用现成的框架进行身份验证。 http://hybridauth.sourceforge.net/index.html 似乎符合您的要求。通常,最好使用现成的解决方案来处理此类事情,因为您的用户有期望,并且通过自定义代码满足这些期望是昂贵的,而且容易出错......

许可有点黑暗,但一般来说,开源框架可以根据非常宽松的要求重新分发(通常,你只需要告诉人们你正在包含一个开源组件(。