我要写一个安全的登录脚本,请问它应该有什么样的组件。
目前我想到的是这些
基本
- 使用 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/