在php中使用preg_match验证密码

gan*_*jan 1 php regex mysql passwords preg-match

我需要验证密码.我目前使用: preg_match("/^[a-z0-9_-]*$/i", $pass).

我想补充一下这个长度.我的mysql表设置如下:userpassword varchar (40) NOT NULL,.所以在6到40个字符之间.我想允许所有没有危险的字符放入我的数据库中.

Tom*_*lak 8

对密码施加任意复杂性规则对用户来说是非常不利的,并且不会显着提高安全性.不要这样做.

这就是为什么认为上述陈述是正确的:

  • 如果我想使用您的网站"123456"作为我的密码,这是我的问题.让我滚动吧.
  • 您可以施加最小长度(例如6个字符),但不是最大长度.如果我想引用整个约翰梅纳德作为我的密码,让我滚动它.
  • 您对"安全"密码的想法可能不是其他人的想法.
  • 人们可能会使用不会自动遵守规则集的密码生成器.不要因为没有包含足够/或太多"特殊字符"的其他原因而不接受他们的密码而烦扰他们.
  • 必须使用适当的哈希算法和随机哈希盐哈希客户的密码,每个用户都有不同的哈希值.仅在数据库中存储哈希值和哈希值,绝不存储明文密码.
  • 一旦进行了哈希处理,即使是蹩脚的密码也可以相当安全地防止盗窃/破解.实施针对暴力攻击的安全措施(基于时间的锁定,基于IP的锁定,使用电子邮件握手进行密码锁定以检索锁定的帐户).

所以你的密码验证过程是这样的

  • 新用户?使用用户名和随机盐创建用户记录(永远不要更改该用户的salt值)
  • 还是用户?从DB中获取salt,重新哈希他的密码,将结果与DB中的哈希进行比较.
  • 切勿将用户密码存储在物理位置,并使用HTTPS进行传输.
  • 如果您不想执行上述操作,请考虑在您的网站上使用OAuth.也许并不容易,但您不必担心密码安全性,并且您的用户只需要记住一个密码.

为了论证,这个正则表达式将按照你的要求行事.如果你仍然迫不及待地去做.

preg_match("/^[a-z0-9_-]{6,40}$/i", $pass)
Run Code Online (Sandbox Code Playgroud)

  • +1另请参阅[强大的Web密码是否可以完成任何事情?(PDF)](http://www.usenix.org/event/hotsec07/tech/full_papers/florencio/florencio.pdf) (2认同)
  • @Tomalak:这是一篇关于会话安全的好文章:http://jaspan.com/improved_persistent_login_cookie_best_practice (2认同)