You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用于XSS攻击校验的正则表达式无法允许开头单个字符,求助

解决你的XSS校验正则问题

看你的正则逻辑是想拦截含>的风险内容,同时对斜杠做了特殊处理,但确实漏掉了单个非/非>字符的场景——咱们一步步拆解问题,再给你调整方案:

原正则的问题根源

你的原正则:

/^(|\/|[^\/>][^>]+|\/[^>][^>]+)$/

它的四个匹配分支里,除了空字符串和单个/,剩下两个分支都要求至少两个字符:

  • [^/>][^>]+:第一个字符不能是/或>,但后面必须跟至少一个额外字符(总长度≥2)
  • \/[^>][^>]+:以/开头,后面必须跟至少两个字符(总长度≥3)

这就导致单个字符比如'a'完全不符合任何分支,自然被拦截了。

修改后的正则方案

我们只需要调整分支的长度限制,让单个非/非>字符能匹配上,同时保留原有的防护逻辑:

方案1(保留原分支结构,仅调整长度)

/^(|\/|[^\/>][^>]*|\/[^>]+)$/

每个分支的作用:

  • |:允许空字符串
  • \/:允许单个斜杠
  • [^\/>][^>]*:允许以非/非>开头的任意长度字符串(包括单个字符,比如'a')
  • \/[^>]+:允许以/开头且后面跟至少一个非>字符的字符串(比如'/user/profile')

方案2(简化版,逻辑完全一致)

如果想让正则更简洁,可以合并重复分支:

/^(\/?|[^\/>][^>]*)$/

这个版本的逻辑:

  • \/?:匹配空字符串或单个斜杠
  • [^\/>][^>]*:匹配单个或多个非/非>的字符(完美覆盖单个字符的场景)

验证效果

调整后的正则会正确通过这些合法输入:

  • 空字符串
  • 单个斜杠'/'
  • 单个字符'a'、'1'
  • 正常文本'hello world'
  • 斜杠开头的文本'/user/profile'

同时依然拦截包含>的风险内容:

  • <script>
  • a>
  • />

这样就解决了单个字符无法通过的问题,同时保留了原有的XSS防护能力。

内容的提问来源于stack exchange,提问作者Vinoth Babu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:25:33