【问题标题】:Coldfusion RegEx to check strength of passwordColdfusion RegEx 检查密码强度
【发布时间】:2012-06-16 00:30:26
【问题描述】:

我正在使用它来(尝试)验证 ColdFusion 7 中的“强”密码。

if ( REFind("^(?=.*[A-Z])(?=.*[!@##$&*])(?=.*[0-9])(?=.*[a-z]).{6}$", myPassword, 1) EQ 0 )

但是,它失败了。有人能指出我的错误吗?

认为我正在测试的标准是:

  • 1 上
  • 1 低
  • 1 个号码
  • 1 个特殊字符
  • 6 位数分钟

非 CF 人员的脚注:

  • 双重哈希是为了逃避CF哈希;
  • ColdFusion 使用 Jakarta ORO 2.0.6 作为其正则表达式引擎

【问题讨论】:

    标签: regex coldfusion passwords coldfusion-7


    【解决方案1】:

    它可能失败的一个原因是您的业务规则是“至少六个字符”,但您的正则表达式强制执行六个字符。

    另外:如果您说明它在哪些条件下失败,将会很有帮助。我的表面测试表明你很好,除了我上面提到的警告。如果您可以微调您的问题以指出我没有考虑的哪些非表面测试失败了,那将很有帮助。

    在现实世界中,我也希望您认为哪些标点符号是有效的。你的清单有点短。但这与您当前的问题无关。

    【讨论】:

    • Adam - 感谢您发现问题,但是您没有提供更正 - 使您的帖子更令人沮丧而不是有用 - 至于说明哪个“项目”失败 - 显然我不知道哪个失败了...否则我会包含该信息。
    • 抱歉,我认为鉴于您显然可以编写一个相当复杂的正则表达式,我认为考虑到问题似乎是什么,在这里进行“第二组眼睛”评估就足够了。我不想用勺子喂你来侮辱你的智慧。至于失败和失败的地方,我的意思是“aA1$aa 有效,但 aA1$aaa 无效”(等等)。我想这属于您在发布之前所做的那种故障排除分析?这就是我的意思:这类信息很有帮助。
    • 罗杰那个亚当,我可能知道你的意思 - 我只是心情不好 - 太糟糕了。
    【解决方案2】:

    试试这个。

    ^(?=.[AZ])(?=.[!@##\$&])(?=.[0-9]) (?=.*[az]).{6,}$

    在六个之后添加逗号,因为您希望允许超过 6 个字符,并且 $ 必须用 \$ 转义

    更新

    试试下面,^和$从上面删除

    (?=.[AZ])(?=.[!@##$&])(?=.[0-9])(? =.*[az]).{6,}

    【讨论】:

    • 为什么需要在这种情况下转义 $?
    • Pritesh - 这不起作用......虽然我希望它有 - 它很简洁。
    • $ 不需要逃避我的错误,感谢 Adam 指出。 jpmyob 尝试在下面删除 ^ 和 $。 (?=.*[AZ])(?=.*[!@##$&*])(?=.*[0-9])(?=.*[az]).{6,}
    【解决方案3】:

    好的,您尝试测试的标准集很糟糕。

    例如,Pa$5word 符合标准但不是一个错误的选择,而my name |z NOT Fr£d 更强大但失败了(没有数字;不同的符号)。

    理想情况下,您应该寻找现有的密码强度检查器(尽管我不知道是否有任何现有的/好的)。


    无论如何,对于您所问的问题的简单解决方案,准确说明正在检查的内容,只需执行以下操作:

    <cfif NOT 
        ( len(myPassword) GTE 6
        AND refind('[A-Z]',myPassword)
        AND refind('[a-z]',myPassword)
        AND refind('[0-9]',myPassword)
        AND refind('[!@##$&*]',myPassword)
         )>
    

    没有必要/没有好处将它全部粉碎到一个正则表达式中。

    【讨论】:

    • 然而,我要挑剔你一点......你提到 Pa$5word 是一个“糟糕”的选择,即使它符合标准 - 你认为标准很差首先。 Pa$5word 比字符串形式的 'password' 安全得多...
    • 木棍屋比稻草屋安全得多——但也不能阻止一只大刺狼……
    • 记住你为什么这样做——你想要“足够安全”或“不够安全”。您需要正确识别值落在线的哪一侧;相对大小不显着。
    • 不确定 CF 快捷代码有多远,但从 CF9 开始,您可以使用“\d”检查数字,使用“\W”检查非字母数字:对于数字:refind('[\d]', myPassword)对于非字母数字:refind('[\W]', myPassword)
    • 将检查分开的另一个原因是,您可能希望向用户提供她/他在系统回复中失败的标准,即,您可能希望将检查中断为单独的条件而不是单&lt;cfif ... and ... and ... and ...&gt;
    【解决方案4】:

    fwiw 以区分不同的字符故障:

    <cfscript> raRe=[["[a-z]","lowercase"],["[A-Z]","uppercase"],["[\W]","non-alphanumeric"],["[\d]","numeric"]];</cfscript>
    <cfoutput>
     <cfloop from=1 to=4 index="idxRe">
      #idxRe#: refind(raRe[idxRe][1], myPassword):<b>#refind(raRe[idxRe][1], myPassword)#</b> myPassword:<b>#myPassword#</b>; re:<b>#raRe[idxRe][1]#</b>; <br />
      <cfif refind(raRe[idxRe][1], myPassword) eq 0><b>Your password must include at least one #raRe[idxRe][2]# character</b><br /></cfif>
     </cfloop>
    </cfoutput>
    

    当然,如果 >=6 也是必需的:

    <cfif Len(myPassword) lte 6><b>Your password must be at least 6 characters long</b></cfif>
    

    【讨论】:

    • 如上所述,[\d][\W] 是不必要的冗长写法 \d\W。另外,我认为文字数组表示法在 CF7 中不起作用 - 它是在 CF8 中添加的,不是吗?
    • 噢噢噢。破获。谢谢@彼得。 CF7 实在是太傻了。您也发布了优雅的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 2014-10-26
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    相关资源
    最近更新 更多