【问题标题】:Validating an obfuscation token验证混淆令牌
【发布时间】:2020-10-10 18:29:04
【问题描述】:

我正在构建一种安全算法来摆脱混淆攻击。用户使用令牌进行验证,该令牌应满足以下条件:

  1. 用户名只能是小写字母,用户名长度至少为 5 位。
  2. 用户名后跟#。
  3. # 之后的前两个字符很重要。总是一个数字和一个字符。这部分至少包含一个数字、一个小写字母和一个大写字母。
  4. 中间可以有任意数量的数字或字母。
  5. 最后的数字和字符应该与 point-3 的数字和字符完全匹配。
  6. 应该以#结尾。
  7. 两个# 中间的字符至少应为 5 个字符。
  8. 完整的标记仅由两个#、小写和大写字母和数字组成。并且

我不知道正则表达式,但我的指南告诉我,这个任务很容易在验证时通过正则表达式完成。在网上找了很久,发现了一些相似的链接,并尝试将它们组合起来,得到了这个:

^[a-z]{5,}#[a-zA-Z0-9]{2}[A-Z][0-9A-Za-z]*[a-zA-Z0-9]{2}#$

但这仅匹配 1 个测试用例。我不知道如何实现两个哈希的中间部分。我试图用我的英语解释我的问题。请帮忙。

以下测试用例应该通过

userabcd#4a39A234a#

randomuser#4A39a234A#

abcduser#2Aa39232A#

abcdxyz#1q39A231q#

randzzs#1aB1a#

以下测试用例应该失败:

randuser#1aaa1a#

randuser#1112#

randuser#a1a1##

randuser#1aa#

u#4a39a234a#

userstre#1qqeqe123231q$

user#1239a23$a#

useabcd#4a39a234a#12

【问题讨论】:

    标签: regex language-agnostic penetration-testing websecurity


    【解决方案1】:

    你可以试试:

     ^[a-z]{5,}#(?=[^a-z\n]*[a-z])(?=[^A-Z\n]*[A-Z])(\d[a-zA-Z])[a-zA-Z\d]*\1#$    
    

    上述正则表达式的解释:

    • ^, $ - 分别代表行的开始和结束。

    • [a-z]{5,} - 匹配小写用户名 5 次或更多次。

    • # - 从字面上匹配 #

    • (?=[^a-z]*[a-z]) - 表示至少一个小写字母的正向预测。

    • (?=[^A-Z]*[A-Z]) - 表示断言至少有一个大写字母的正向预测。

    • (\d[a-zA-Z]) - 表示匹配前 2 个字符(即数字和字母)的捕获组。如果您想要其他方式,请使用[a-zA-Z]\d

    • [a-zA-Z\d]* - 匹配提到的字符集中的零个或多个字符。

    • \1 - 表示与捕获的组完全匹配的反向引用。

    你可以在here.找到上述正则表达式的demo

    注意:如果您想一次匹配一个字符串,即出于实际目的;从字符集中删除\n


    您可以使用此正则表达式作为替代。

    ^[a-z]{5,}#(?=.*?[a-z])(?=.*?[A-Z])(\d[a-zA-Z])[a-zA-Z\d]*\1#$
    

    推荐阅读:Principle of contrast

    【讨论】:

    • 不确定 OP 是否故意添加了 language-agnostic 标签,但此正则表达式与语言无关。并非所有正则表达式都支持前瞻或字符类快捷方式,例如 \d
    • 是的,也许。我什至不确定是否可以为此编写可移植的正则表达式。 ^[a-z]{5,}#(([0-9][A-Z])[0-9A-Z]*[a-z][0-9A-Za-z]*|([0-9][a-z])[0-9a-z]*[A-Z][0-9A-Za-z]*)(\2|\3)#$ 是一个工作的 POSIX ERE,但我没有用其他正则表达式测试它。
    猜你喜欢
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 2021-09-10
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 2016-10-04
    相关资源
    最近更新 更多