首页 > 解决方案 > 使用正则表达式在 js 中隐藏 %2Escriptwsww%2E%3Cscript

问题描述

我正在尝试从 JSON 中替换脚本标签。我目前正在使用以下正则表达式:

/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi

它仅在以下情况下有效:

<script>
<script>adfe</script>
<script>sce
<script>ccrcr<script></script>
<script><dwdwd>
<script></script>

我需要它应该在以下情况下工作:

%3Cscript%3Ealert('hug')%3C%2Fscript%3E

这是示例代码:

var myObj = { "name":"John", "age":31, "city":"New York","search":"?<script>alert(document.domain)</script>","query":"body<script>alert('fvvr')</script>","path":"/movies?Header:1%3Cscript%3Ealert(document.domain)%3C%2Fscript%3E"};

var myJSON = JSON.stringify(myObj).replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '');

alert(myJSON);

你能帮帮我吗?

标签: javascriptregex

解决方案


实际上,你想匹配这样一个序列:

  • <或(十六进制%3C代码<)。
  • (可选)/%2F(十六进制代码/)作为结束标签。
  • script单词。
  • >或(十六进制%3E代码>)。

并将其替换为空字符串。

所以直观的正则表达式是:

(?:<|%3C)(?:\/|%2F)?script(?:>|%3E)

请注意,第 1、2 和 4 部分由非捕获组包围,以设置各个备选方案的“边界”。

使用示例(带全局选项):

var result = source.replace(/(?:<|%3C)(?:\/|%2F)?script(?:>|%3E)/g, "");

推荐阅读