我需要验证密码。 我目前使用: preg_match("/^[a-z0-9_-]*$/i", $pass)
。
我想补充的长度这一点。 我的MySQL表设置这样的: userpassword
varchar (40) NOT NULL,
所以字符6和40之间。 而且我想,让那些没有危险把我的数据库中的所有字符。
我需要验证密码。 我目前使用: preg_match("/^[a-z0-9_-]*$/i", $pass)
。
我想补充的长度这一点。 我的MySQL表设置这样的: userpassword
varchar (40) NOT NULL,
所以字符6和40之间。 而且我想,让那些没有危险把我的数据库中的所有字符。
对密码施加任意复杂的规则是非常用户敌对且基本不会提高安全性。 不这样做。
这也是为什么我觉得上面的说法是正确的:
所以,你的密码验证的过程是这样的
对于参数的缘故,这个正则表达式会做什么你问。 如果你还是不顾一切地去做。
preg_match("/^[a-z0-9_-]{6,40}$/i", $pass)
你应该确保他们的安全,不是他们太不安全验证您的密码。
public function password_is_secure($password) {
// quick obvious test
if (is_numeric($password)) {
// FAIL: 'Your password cannot be all numbers.'
} elseif (strlen(count_chars($password, 3)) < 4) {
// FAIL: 'Your password needs to have a variety of different characters.'
}
// levenshtein distance test (test similarity to common passwords)
$name = $_POST['name'];
$email = $_POST['email'];
$badPasswords = array($name, $email, 'password', 'password1', 'password123', '1234abcd', 'abcd1234', '12345678', '1234567890');
foreach($badPasswords as $bad) {
if (levenshtein($password, $bad) < 6) {
// FAIL: 'Your password is too similar to your name or email address or other common passwords.'
}
}
return true;
}
插件进行更适当的“干将” $name
和$email
和设置您希望如何处理传递错误信息,以及上面的方法将做你一个公道。 你可以在“调”是通过改变允许Levenschtein距离(目前是6)。
我还建议延长列表$badPasswords
包括一堆的最常用的密码 。
而对于一些神,盐的爱和散列你的密码,你将它们存储在数据库之前。
我想给你以下建议:
你不应该在你的数据库中存储密码 。 使用OpenID的通过很容易LightOpenID和理由如下:
PS:对于它的乐趣。 别人问我stackoverflow.com如果他的loginsystem是什么好/安全的(它没有),所以我写了一个安全登录系统 。 如果您使用SSL(如果我没有错过任何漏洞,但我不相信我做了)。
我想补充的长度这一点。 我的MySQL表设置这样的:userPassword的VARCHAR(40)NOT NULL ,. 所以字符6和40之间。 而且我想,让那些没有危险把我的数据库中的所有字符。
我不喜欢正则表达式,因为它们过于复杂(我只用作为最后的努力)。 我会建议你只使用一个最新版本的PHP(> 5.2.0),它具有保护到位,使其安全免受XSS 。
过滤器扩展功能默认情况下为PHP 5.2.0启用。 这一次使用的实验PECL扩展之前,然而,PECL版本不再推荐或更新。
接着验证长度是如使用简单的strlen功能。
你应该散列密码,如果你的数据库被盗取,如果你不攻击者可以读出所有的密码。
更新:检查托默勒格一职
sha1($_POST['pass']); // will encrypt the password to a 40 character long string.
echo(sha1('monkey')); // will become: ab87d24bdc7452e55738deb5f868e1f16dea5ace
echo(sha1('Monkey')); // completely different: 4bd0ec65b8f729d265faeba6fa933846d7c2d687
// Just by making the letter upper-case!
如果你想登录用户加密的登录表单通,并将其与数据库中。
$pass = 'monkey';
if(sha1($pass)=='ab87d24bdc7452e55738deb5f868e1f16dea5ace'){
echo('Correct pass!');
}
如果你想验证密码的长度,你可以使用这段代码:
if($upass=='' || $upass=='Password'){
$errupass = 'Please fill in a password.';
$valid = false;
}elseif(strlen($upass)<6){
$errupass = 'Password must be atleast 6 characters.';
$valid = false;
}
我不应该阻止人们,因为他们增加密码的强度用奇怪的字符。
好吧,首先,你会不会把以纯文本的密码进入你的数据库,你会被加密散列首先它开始。 因此,你真的不关心哪些字符或不危险把你的数据库,你会得到一个固定长度的字母数字字符串。
散列之前,您的正则表达式将是这样的:
/^([a-zA-Z0-9]{6,40})$/
...把任何你想要的字符,可以让在字符类括号您的密码。
其次,你真的不关心你放什么字符到你的数据库,你会使用在你的插入查询占位符,对不对?