验证混淆令牌

Validating an obfuscation token

提问人: 提问时间:6/21/2020 最后编辑:oguz ismail 更新时间:6/21/2020 访问量:170

问:

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

  1. 用户名仅为小写字母,用户名长度至少为 5 位。
  2. username 后跟 #。
  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

与正则表达式 语言无关的渗透 测试 WebSecurity

评论


答:

1赞 user7571182 6/21/2020 #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 - 表示与捕获的组完全匹配的反向引用。

您可以在此处找到上述正则表达式的演示

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


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

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

推荐阅读:对比原理

评论

0赞 oguz ismail 6/21/2020
不确定 OP 是否故意添加了与语言无关的标签,但此正则表达式与语言无关。并非所有正则表达式风格都支持前瞻或字符类快捷方式,例如 .\d
0赞 oguz ismail 6/21/2020
是的,也许吧。我什至不确定是否可以为此编写一个可移植的正则表达式。 是一个有效的 POSIX ERE,但我没有用其他正则表达式风格测试它。^[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)#$