php - 安全登录脚本应该包含哪些内容?

标签 php security

我要写一个安全的登录脚本,请问它应该有什么样的组件。

目前我想到的是这些

基本

  • 使用 PDO 作为 mysql 数据库的连接器
  • 使用 SHA512 保护密码(是否应该涉及盐/ token ?)
  • Session 和 cookie 管理,尽量避免 session id 的劫持(你能给我一些关于它的文章吗?)
  • XSS 预防(你能给我推荐一篇文章吗?)
  • 输入的 SQL 注入(inject)预防卫生
  • 通过 https 的安全连接

注册

  • 在使用 reCaptcha 注册方面

登录

  • 计算登录尝试次数并在 5 次失败尝试后阻止,以防止暴力攻击。

登录后

  • 具有破坏功能的 session 计时器(12 分钟结束 session ),单击以更新计时器 [有人有这方面的示例吗?我找不到任何 ]

是否还有其他我应该考虑的主要安全提示?

谢谢。

最佳答案

这实际上是一个不平凡的问题,有很多问题需要考虑。幸运的是,已经为您解决了很多问题。

  • 密码哈希:使用 password_hash()password_verify() -- 不要使用像 MD5 或 SHA1 这样的快速哈希,而且不要推出自己的哈希策略,否则您会发现自己草率地 reshape PBKDF2——password_hash() 可以完成您可能希望它做的所有事情,而不必强调实现细节。它们是足够的;学好这些工具。如果您使用的是 PHP < 5.5,请使用 password_compat
  • 数据库 API:PDO 很棒。确保充分利用准备好的语句将 SQL 查询与用户提供的数据分开。否则,厄运
  • session 管理:使用内置 session ,在任何地方都使用 HTTPS,不要混合内容,设置 "httponly""secure"true。在权限升级时重新生成 session (例如,用户登录)。

    如果想偏执,可以防御session fixation attacks (这些天实际上不被认为是实用的)通过设置 canary session 变量。页面加载时,如果 $_SESSION['canary'] 未定义(或与预期值不匹配),则销毁 session 并将用户视为新访客。

    <
  • 速率限制:在 N 次登录尝试后添加手动验证码(其中 N 大于 1 但仍然很小)。
  • 记住我:“看似微不足道,实则不然”的完美示例。 Covered in this blog post .如果您不需要它,请不要实现它。
  • Account Recovery: A back-door by any other name .如果您可以忽略此功能,则根本不要实现它。大多数用户无法对安全问题提供可靠的 secret 答案。
  • 注册:您至少需要一个验证码。
  • XSS 预防:这是任何安全网络应用程序的一部分,并非特定于您的登录表单。也就是说,HTMLPurifier如果你想允许 HTML,它是非常可靠的;如果你不想允许 HTML,htmlentities($input, ENT_QUOTES | ENT_HTML5, 'UTF-8') 非常可靠。

我希望通过 Paragon Initiative Enterprises blog 上的一系列非常详尽的博客文章来回答这个问题。 .

关于php - 安全登录脚本应该包含哪些内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28695117/

相关文章:

javascript - php 执行 phantom js 可以工作,但 casperjs 不工作 权限被拒绝

security - 用户登录后如何使用 JSF 2 限制对某些页面的访问?

php - 发送未加密的密码是一种好习惯吗?

php - 保护PHP密码的哈希和盐值

java - 如何在 WAS Liberty 8.5.5.9 中使用 securityUtility --encoding=custom?

php - 如何在 xampp 1.8.x 中启用 php_mssql.dll 扩展

phpmyadmin 显示代码而不是网页

php - mysql 推送通知到node.js

php - 如何使用mysql数据库根据条件更新多行?

c++ - ConvertStringSecurityDescriptorToSecurityDescriptor() 阻止我的程序正常结束