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

时间:2015-02-24 11:53:24

标签: php security

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

现在这就是我想到的事情

基本

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

注册

  • 使用reCaptcha进行注册

登录

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

登录后

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

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

感谢。

1 个答案:

答案 0 :(得分:11)

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

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

    如果你想成为偏执狂,你可以通过设置一个session fixation attacks会话变量来防御canary(这些天真的没有用)。在页面加载时,如果未定义$_SESSION['canary'](或与预期值不匹配),则销毁会话并将用户视为新访客。

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

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