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

Kav*_*son 3 php security

我打算写一个安全的登录脚本,我想问一下它应该有什么样的组件.

现在,这是我想到的事情

基本

  • 使用PDO作为mysql数据库的连接器
  • 使用SHA512保护密码(如果涉及到盐/令牌?)
  • 会话和cookie管理,试图避免劫持会话ID(你能提供一些关于它的文章吗?)
  • XSS预防(你可以给我一篇文章吗?)
  • SQL注入预防卫生的输入
  • 通过https进行安全连接

注册

  • 在使用reCaptcha注册方面

登录

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

登录后

  • 会话计时器与销毁(12分钟松开会话)点击更新计时器[有没有人有这样的例子?我找不到任何]

我还应该考虑一下更重要的安全提示吗?

谢谢.

Sco*_*ski 12

这实际上是一个非常重要的问题,需要考虑许多问题.幸运的是,很多问题已经解决了.

  • 密码哈希:使用password_hash()password_verify()- 不要使用像MD5或SHA1这样的快速哈希,也不要使用自己的哈希策略,否则你会发现自己重新发明了PBKDF2 - password_hash()你可能希望它做的一切都没有强调实施细节.它们足够了; 好好学习这些工具.如果您使用的是PHP <5.5,请使用password_compat
  • 数据库API: PDO非常棒.确保充分利用预准备语句将SQL查询与用户提供的数据分开.否则,厄运.
  • 会话管理:使用内置的会议,在任何地方使用HTTPS没有混合内容,设置"httponly""secure"true.在权限升级时重新生成会话(例如,用户登录).

    如果你想成为偏执狂,你可以通过设置一个金丝雀会话变量来抵御会话固定攻击(这些日子实际上并不真实).在页面加载时,如果未定义(或与预期值不匹配),则销毁会话并将用户视为新的guest虚拟机.$_SESSION['canary']

  • 速率限制:在N次登录尝试后添加手动验证码(其中N大于1但仍然非常小).
  • 记住我: "似乎微不足道,真的不是"的完美例子.在这篇博客文章中涵盖.如果您不需要它,请不要实现它.
  • 帐户恢复:任何其他名称的后门.如果您可以忽略此功能,请不要实现它.大多数用户无法提供安全问题的可靠秘密答案.
  • 注册:你至少想要一个CAPTCHA.
  • XSS预防:这是任何安全Web应用程序的一部分,不是特定于您的登录表单.也就是说,如果您想要允许HTML ,HTMLPurifier非常可靠,如果您不想允许HTML,htmlentities($input, ENT_QUOTES | ENT_HTML5, 'UTF-8')则非常好.

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