如何在JavaScript中用正则表达式检测输入是否含HTML/script标签防范XSS攻击
问题分析
你的代码没有达到预期效果,核心有两处问题:
- 正则未锚定字符串首尾:
RegExp("[^<>]*")没有添加^(字符串开头标识)和$(字符串结尾标识),正则的test()方法只要在输入内容中找到任意一段符合规则的子串就会返回true。比如用户输入<script>时,正则会匹配到中间的script字符段,直接返回true,完全不会识别到前后的尖括号。 - 正则逻辑和需求不匹配:你需要的是「只要输入包含
<或>就判定为非法」,现有正则的逻辑是「匹配0个或多个非尖括号字符」,没有覆盖存在尖括号的场景。
修正方案
如果要实现「禁止输入包含HTML标签尖括号的内容」的效果,调整正则如下即可:
// 锚定首尾,要求整个输入从开头到结尾都不能出现<或> var preventScriptsRegEx = /^[^<>]*$/; function getValue() { return document.getElementById("myinput").value; } function test() { // 输入包含尖括号时会返回false,对应非法输入 const isLegal = preventScriptsRegEx.test(getValue()); if (!isLegal) { alert("不能输入包含HTML标签的内容"); // 后续拦截逻辑 } }
如果更习惯反向判断,也可以直接检测是否存在尖括号,存在就拦截:
// 匹配任意<或> var hasTagRegEx = /[<>]/; function test() { const inputVal = getValue(); if (hasTagRegEx.test(inputVal)) { alert("不能输入包含HTML标签的内容"); } }
重要提醒:前端正则校验只能拦截普通用户的误输入,无法彻底防范XSS攻击,所有用户输入在后端存储、前端页面渲染时必须做对应的转义处理,不可仅依赖前端校验做安全防控。
内容的提问来源于stack exchange,提问作者carihep
相关产品推荐
相关产品推荐

