PHP 登录表单安全


PHP login form safety

自从我对这种安全事物不熟悉以来,我已经用谷歌搜索了这个,但我仍然有一些疑问。


情况

我正在为一家公司开发一个网站(当然主要是PHP(,我需要保护所有页面。我已经制作了一个登录表单,我正在使用数据库中的 md5 加密密码。我想这样做:

  1. 登录表单。如果用户使用正确的用户名进行身份验证,并且密码,创建$_SESSION["logged"] = 1;
  2. 现在您已登录。在网站的每个页面中,我检查是否设置了 $_SESSION["logged"] 并且值为 1。如果是,我显示页面的内容。

这样,如果您尝试在没有登录的情况下在网站中打开一个随机页面,我可以显示一个错误页面(因为当我检查$_SESSION["logged"]时,我看到它未设置/它没有值 1(。


问题

我在客户端中没有存储任何东西,我正在服务器端做所有事情,我想知道这种方法是否足够安全。我看到人们使用了我认为的这种方法,但我也读到他们将加密会话中的数据。真的需要吗?

我也想知道:当用户(登录后(关闭网站和浏览器时,会话会自动销毁还是我必须处理调用session_destroy();的关闭操作?

正如我已经说过的,我在这方面的经验不多,但我想在服务器端做所有事情会更好。我不想使用饼干。

MD5绝对不适合"加密密码"。您的流程将不安全,您的客户将容易受到攻击。查找password_hash作为绝对最低限度。

我在客户端中没有存储任何东西,

也许您不熟悉会话的工作原理。客户端计算机上将有一个 Cookie。您可以通过使用优于默认的会话名称/密钥生成器(如 whirlpool(来提高此 Cookie 的安全性。

使用TLS层(例如Lets Encrypt(的安全性至关重要,这是一个免费的社区支持的TLS层并且相当安全(实际上它似乎非常安全,但我不敢相信免费的东西这么好,所以我坚持保留一点判断!

还需要告诉PHP您正在使用TLS 这非常重要,您需要编辑php.ini文件以告诉PHP仅对会话使用HTTP和加密cookie,例如使用session_set_cookie_params

从您的问题来看,您真的非常非常喜欢使用预准备语句并完全限定您的数据库交互以避免SQL注入和数据库泄露。

Session_destroy相对没价值,别在意了。你想要使用的是定期运行session_regenerate_id通常每隔几个页面加载(比如 5 个(。

进一步阅读:PHP Sessions and Security。

结语

正如我已经说过的,我在这方面的经验不多

然后,您将错过一些事情,犯错误,并且您的客户网站面临滥用或妥协风险的机会就会增加。

最重要的思想

  • 信誉良好的证书颁发机构获取 TLS 证书。请让服务器管理员帮助您正确安装和设置网域的证书。

编辑:

这是一个很好的阅读链接。

无论你做什么,在我看来都是正确的。回答您的问题:

  • 管理会话的服务器端方法是安全的。您可以将会话保持未加密状态,因为您只在其中存储登录用户的状态。
  • 当用户关闭网站时,您的服务器上不会收到任何事件。要关闭会话,您应该:
    • 注销操作时调用 session_destroy((;
    • 设置较短的会话超时,以便在指定的非活动时间后自动销毁会话
  • 会话的情况下,在服务器端执行所有操作会更好

关于使用MD5的提示:

  • 使用 MD5 加密密码是不安全的,因为它不是一个强大的加密算法。请改用 mcrypt 或其他 PHP 方法。

好吧,我建议您在会话中保存您的用户ID。为什么?您可能需要获取有关用户的信息,然后使用此会话可以获取与用户相关的所有信息。如果有的话,您应该在注销页面中使用session_destroy()。如您所见,当您关闭使用会话创建的网站并再次打开它时,您需要再次登录。所以你不需要使用session_destroy(实际上不能(。我真的不知道为什么要加密会话信息,很抱歉。我听说可以参加会议,但我对此了解不多,对不起:/会话值会被黑客入侵吗?在这里,您可能会找到一些信息。

首先:现在是 2016 年,不要使用 MD5 进行密码加密,因为它不安全。

最好至少使用SHA1,最好是SHA256或更高的密码。如果你想让它更安全,SHA 256将是一个好的开始。

请考虑使用 TLS 证书...让我们加密是免费的,对于大多数网站来说已经足够了。

发布您的代码,也许有人能够帮助您朝着正确的方向前进。

祝你好运!