javascript - 使用正则表达式在 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);
你能帮帮我吗?
解决方案
实际上,你想匹配这样一个序列:
<
或(十六进制%3C
代码<
)。- (可选)
/
或%2F
(十六进制代码/
)作为结束标签。 script
单词。>
或(十六进制%3E
代码>
)。
并将其替换为空字符串。
所以直观的正则表达式是:
(?:<|%3C)(?:\/|%2F)?script(?:>|%3E)
请注意,第 1、2 和 4 部分由非捕获组包围,以设置各个备选方案的“边界”。
使用示例(带全局选项):
var result = source.replace(/(?:<|%3C)(?:\/|%2F)?script(?:>|%3E)/g, "");
推荐阅读
- java - 如何实施集成最佳实践?
- wordpress - 根据帖子链接获取帖子ID
- javascript - 比较 js 日期...是星期几?
- css - 通过 windows 命令行将 SCSS 文件批量编译成 CSS
- java - 在 Java 流的性能方面哪个更好:组合过滤器或组合环境?
- c - 在 c 程序中更改子进程的内容。
- google-cloud-platform - Google pubsub 88% 的请求以 503 的形式返回
- android - 来自 ItemTouchHelper onSwiped() 的 StartIntent
- r - 在 Rstudio 之外的 rmarkdown 笔记本(html 笔记本)中使用 plotly
- jenkins - Jenkins 无法使用“Windows 上的 Ubuntu 上的 Bash”-jenkins 工作挂起