C# 实现仅允许HTTPS的URL校验正则表达式问题求助
问题根源定位
你当前使用的正则之所以会放行HTTP协议链接、无法实现仅匹配HTTPS的要求,核心原因有两个:
- 原正则中的
((https)://)?结构末尾带有?匹配符,代表整个括号内的协议段可以出现0次或者1次,从校验逻辑设计上就没有强制要求链接必须以HTTPS协议开头 - 因为没有对协议段做排他校验,当输入内容是
http://xxx结构时,协议部分的内容会被后续的通用字符组直接匹配,最终通过校验 - 另外原正则的域名匹配段
([\w+?\.\w+])+本身也存在逻辑漏洞,把+、?当成了允许的合法字符纳入匹配范围,并没有真正实现精准的域名结构校验。
修正方案
要实现仅允许HTTPS协议、拦截所有带特殊字符的非法链接的校验要求,需要调整两个核心规则:
- 移除HTTPS协议段的可选标记,强制要求链接必须以
https://为开头 - 收紧后续字符的匹配范围,仅保留URL结构必需的合法字符,过滤所有要求拦截的特殊字符
最终可直接使用的修正正则为:^https://[a-zA-Z0-9\-_.:/]+$
该正则的匹配逻辑为:
- 开头直接锚定匹配
https://,从源头拦截HTTP协议、无协议前缀的所有链接 - 后续字符组仅允许匹配字母、数字、短横、下划线、点、冒号、斜杠,范围已经剔除了所有非URL结构必需的特殊字符,完全满足特殊字符过滤的要求
边界效果验证
校验规则的实际拦截与放行效果如下:
- 可正常通过的合法场景:
https://example.comhttps://sub.test.cn:9000/path?name=demo
- 会被拦截的非法场景:
http://example.com(HTTP协议,不符合HTTPS限定要求)example.com/path(无HTTPS协议前缀,不符合规则)https://example!@#.com(带非法特殊字符,符合拦截要求)
内容的提问来源于stack exchange,提问作者Zia Zee
相关产品推荐
相关产品推荐

