检查字符串是否包含正则表达式&没有js
Check if string contains a regex & no js
我有一个字符串,我需要确保它只包含一个正则表达式,不包含javascript,因为我正在用这个字符串创建一个新脚本,所以javascript片段会有安全风险。
确切场景:
- mozilla插件中的JS通过HTTPrequest将配置加载为json(json包含{"something":"^(?:http|https)://(?:.*)"}
- JS创建了一个pac文件(代理配置脚本),该文件使用配置中的"something"regex
你知道如何在不破坏正则表达式的情况下转义字符串吗?
您可以使用正则表达式来拆分JavaScript正则表达式。
然后,您应该将正则表达式转换为一个在词汇上更简单的JavaScript子集,以避免/
含义的所有非上下文无关的怪异之处,以及输入正则表达式中的任何不规则之处。
var REGEXP_PARTS = "(?:"
// A regular character
+ "[^/'r'n'u2028'u2029''['''']"
// An escaped character, charset reference or backreference
+ "|''''[^'r'n'u2028'u2029]"
// A character set
+ "|''[(?!''])(?:[^'']'''']|''''[^'r'n'u2028'u2029])+'']"
+ ")";
var REGEXP_REGEXP = new RegExp(
// A regex starts with a slash
"^[/]"
// It cannot be lexically ambiguous with a line or block comemnt
+ "(?![*/])"
// Capture the body in group 1
+ "(" + REGEXP_PARTS + "+)"
// The body is terminated by a slash
+ "[/]"
// Capture the flags in group 2
+ "([gmi]{0,3})$");
var match = myString.match(REGEXP_REGEXP);
if (match) {
var ctorExpression =
"(new RegExp("
// JSON.stringify escapes special chars in the body, so will
// preserve token boundaries.
+ JSON.stringify(match[1])
+ "," + JSON.stringify(match[2])
+ "))";
alert(ctorExpression);
}
这将导致在JavaScript的一个众所周知的子集中的表达式。
上面的复杂正则表达式不在TCB中。为了保持安全性,唯一需要正确工作的部分是ctorExpression
,包括使用JSON.stringify
。
似乎大多数标准JavaScript功能都可用(源代码),所以您只需执行以下操作:
try {
RegExp(json.something+'');
pacFile += 'RegExp(' + JSON.stringify(json.something+'') + ')';
} catch(e) {/*handle invalid regexp*/}
不用担心,因为RegExp("console.log('test')")
只会生成有效的/console.log('test')/
正则表达式,而不会执行任何内容。
相关文章:
- 什么是&&在没有if的行中的变量之间
- Javascript,如果条件在没有&&逻辑运算符当&&它不起作用
- 如果没有添加PHP&Javascript
- 如果(condition&condition)没有'不起作用,
- 如何解决youtube播放器没有显示全宽的问题&身高
- 有没有更好的方法来处理窗口属性&React/Redux中的子组件
- 使用JS&HTML作品,JS&CSS没有'不总是
- 为什么javascript替换方法(没有regex)在angularjs表达式中不起作用来删除 
- node.js+MySQL;JSON结果-回调问题&没有响应客户端
- Facebook分享没有选择完整的网址&自定义url的元名称
- 为什么IE7&IE8表示;hasLayout',当它没有't
- Ember.js&Q单位:“;类型错误:对象#<对象>没有方法'getHandler'
- 融合表层没有标记&信息窗口
- 为什么谷歌地图显示灰色,而没有初始化缩放&当使用jQuery按钮更改缩放时,居中,地图上的居中效果非常好
- JavaScript未在IE7&8个,没有错误
- Node.js-样式没有't应用于页面&谷歌Chrome表示:未捕获语法错误:意外的令牌<
- getElementsByClassName&IE8:对象没有'不支持此属性或方法
- Jinja2没有在javascript/html中呈现引号或amp;安全过滤器未解决
- 将复选框的默认值绑定到角度模型,其中true和amp;false表示为'是'&'没有'
- 使用jQuery&PHP没有表单