我在php中使用preg_match_all来检查用户名和密码中的字符,然后再添加到数据库中,但我似乎无法按照我想要的方式工作。这就是我现在所拥有的:
preg_match_all(USERNAME_PATTERN,$username,$usernameMatches);
preg_match_all(PASSWORD_PATTERN,$password,$passwordMatches);
以下是模式,定义为常量:
/*Username and Password Patterns*/
define("USERNAME_PATTERN","[-*_a-z0-9A-Z.]");
define("PASSWORD_PATTERN","[_a-z0-9A-Z]");
我不知道它有什么问题。它假设检查用户名是否包含除a-z,A-Z,0-9,短划线,星号,下划线和句点之外的任何内容。密码与用户名相同。
以下是我用来检查的代码:
if ($usernameMatches == 0){
echo("Bad characters in username<br />");
}
密码相同。
答案 0 :(得分:3)
您的代码存在一些问题。
preg_match_all()
/
(或其他有效字符)。试试这个:
/*Username and Password Patterns*/
define("USERNAME_PATTERN","/^[-*_a-z0-9A-Z.]+$/");
define("PASSWORD_PATTERN","/^[_a-z0-9A-Z]+$/");
$usernameMatches = array();
$passwordMatches = array();
preg_match_all(USERNAME_PATTERN,$username,$usernameMatches);
preg_match_all(PASSWORD_PATTERN,$password,$passwordMatches);
if (empty($usernameMatches)){
echo("Bad characters in username<br />");
}
if (empty($passwordMatches)){
echo("Bad characters in password<br />");
}
BTW:只需使用preg_match()
代替preg_match_all()
即可简化您的代码。像这样的东西应该和你的代码一样:
/*Username and Password Patterns*/
define("USERNAME_PATTERN","/^[-*_a-z0-9A-Z.]+$/");
define("PASSWORD_PATTERN","/^[_a-z0-9A-Z]+$/");
if (!preg_match(USERNAME_PATTERN, $username)) {
echo("Bad characters in username<br />");
}
if (!preg_match(PASSWORD_PATTERN, $password)) {
echo("Bad characters in password<br />");
}
答案 1 :(得分:2)
使用此:
define("USERNAME_PATTERN","/^[-*_a-z0-9A-Z.]+$/");
define("PASSWORD_PATTERN","/^[_a-z0-9A-Z]+$/");
目前,您只允许使用单字符用户名和密码。您也忘记了通过/
(或其他字符)封装正则表达式。 (诚然,这是特定于PHP和其他一些语言的。)我还添加了^和$,以便匹配整个输入字符串。
顺便问一下,为什么还要检查密码呢?例如,只需要一定的最小长度(但完全没有检查安全性):
define("PASSWORD_PATTERN","/^.{6,}$/");
另外,我不明白你使用preg_match_all
的原因。 preg_match
应该也可以,并且可能更容易使用:
if (!preg_match(USERNAME_PATTERN, $username) {
echo("Bad characters in username<br />");
}
答案 2 :(得分:1)
不知道它有什么问题。它假设检查用户名是否包含除a-z,A-Z,0-9,短划线,星号,下划线和句点之外的任何内容。密码与用户名相同。
如果传递的用户名/密码有效,您应该检查。你需要这种模式。 /^[\-\*\w\d\.]{6,12}$/
,此处最小和最大长度分别为6和12。
define('PATTERN', '/^[\-\*\w\d\.]+$/');
if(preg_match(PATTERN, $username)){
// username is correct
} else {
// username is wrong.
}
密码相同。
答案 3 :(得分:1)
在回答之前我会说通过提出这个问题,我怀疑你是直接将密码保存为明文。这不是一个好的解决方案,因为它暴露了您的用户密码。围绕here讨论了如何以更安全的方式执行此操作的示例。
除非您正在处理某些遗留系统,否则在大多数情况下,无效字符(密码中)的问题不会成为问题。原因是您不会存储实际密码,而只会存储生成的哈希
回到你的问题。我喜欢的另一种选择是检查任何无效字符的前置。通过向字符列表添加^,您将匹配除列表之外的任何其他字符。
define("USERNAME_PATTERN","/[^*_a-z0-9A-Z.-]/");
if(preg_match(USERNAME_PATTERN, $username))
echo 'Bad characters in username';