Ruby字符串替换如何规避捕获组解析风险?求安全方案
Ruby String.sub 替换时的安全风险规避方案
一、使用块形式替代字符串参数
直接用sub/gsub的块形式传递替换内容,块返回的字符串会被原样使用,不会解析其中的捕获组转义序列(比如\0、\1),从根源避免风险:
original_str = "test pattern" match_pat = "pattern" user_input = "\0" # 不可信的API输入 safe_result = original_str.sub(match_pat) { user_input } # 结果为 "test \0",而非被解析后的 "test pattern"
二、转义替换文本中的特殊字符
如果必须使用字符串作为替换参数,需要转义文本中的反斜杠,让捕获组转义符失去特殊作用:
user_input = "\0" safe_txt = user_input.gsub('\\', '\\\\') # 把单个反斜杠转成双反斜杠 original_str.sub(match_pat, safe_txt) # 替换后同样得到 "test \0"
补充说明
Ruby中sub/gsub的替换字符串支持捕获组转义是设计预期的特性,当替换文本来自不可信来源(比如API输入)时,恶意输入可能通过\0、\1等转义符拼接匹配到的内容,引发信息泄露或注入风险,上述两种方法可以有效规避。
内容的提问来源于stack exchange,提问作者elbrunovsky
相关产品推荐
相关产品推荐

