【问题标题】:PHP regex for validating password [closed]用于验证密码的 PHP 正则表达式 [关闭]
【发布时间】:2013-07-10 04:12:54
【问题描述】:

我对 PHP 完全陌生。我需要帮助编写验证密码的正则表达式。密码长度必须至少为 8 个字符,以字母开头,以数字结尾,并且不区分大小写。第一个和最后一个之间的字符可以是数字、下划线或符号。

任何帮助将不胜感激。

【问题讨论】:

  • 看看this问题。
  • 中间字符可以接受哪些符号?
  • 为什么要强制将字母作为第一个字符?并将我可以使用的字符集限制为字母、数字、下划线和符号?我不能使用 UTF-8 字符吗?
  • 为什么要限制长度?为什么这很重要?您正在后端对密码进行哈希处理,对吗? 对吗?
  • 不区分大小写对于密码安全来说是个坏主意——它大大减少了破解密码所需的工作量。 (无论如何,它可能与正则表达式无关,因为您需要正则表达式以任何方式接受大写或小写字符)

标签: php regex


【解决方案1】:

/^[A-Za-z][0-9[:punct:]]{6,}[0-9]$/ 应该可以工作

这是说:

  • 第一个字符必须是字母
  • 中间字符必须是数字或符号(包括下划线)
  • 必须至少有 6 个中间字符
  • 最后一个字符必须是数字

【讨论】:

    【解决方案2】:

    看看manual中的preg_match() PHP函数。

    快速示例:

    <?php
    // Check if the string is at least 8 chars long
    if (strlen($password) < 8)
    {
       // Password is too short
    }
    
    
    // Make the password "case insensitive"
    $password = strtolower($password);
    
    
    // Create the validation regex
    $regex = '/^[a-z][\w!@#$%]+\d$/i';
    
    // Validate the password
    if (preg_match($regex, $password))
    {
       // Password is valid
    }
    else
    {
       // ... not valid
    }
    

    Regex Explanation:  
       ^           => begin of string
       [a-z]       => first character must be a letter
       [\w!@#$%]+  => chars in between can be digit, underscore, or symbol
       \d          => must end with a digit
       $           => end of string
       /i          => case insesitive
    

    【讨论】:

    • 请不要使用 strtolower() 位——它会使您的密码更不安全。
    • @Spudley 没错,只是包含它,因为 user2573918 要求它。但这确实是一个安全问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 2014-10-14
    • 2023-03-12
    相关资源
    最近更新 更多