使用daniel-lucraft的答案作为我的b (因为他似乎是唯一回答问题的人),我决定以稳健的方式解决这个问题。下面你会找到这个解决方案的代码。
# encoding: utf-8
class String
INTERPOLATE_DELIMETER_LIST = [ '"', "'", "\x02", "\x03", "\x7F", '|', '+', '-' ]
def interpolate(data = {})
binding = Kernel.binding
data.each do |k, v|
binding.local_variable_set(k, v)
end
delemeter = nil
INTERPOLATE_DELIMETER_LIST.each do |k|
next if self.include? k
delemeter = k
break
end
raise ArgumentError, "String contains all the reserved characters" unless delemeter
e = s = delemeter
string = "%Q#{s}" + self + "#{e}"
binding.eval string
end
end
output =
begin
File.read("data.txt").interpolate(foo: 3)
rescue NameError => error
puts error
rescue ArgumentError => error
puts error
end
p output
为输入
he #{foo} he
你得到的输出
"he 3 he"
输入
"he #{bad} he\n"
将引发NameError异常。并输入
"\"'\u0002\u0003\u007F|+-"
会引发和ArgumentError异常抱怨输入包含所有可用的分隔符字符。
或者使用类似液体的东西会更安全。这与erb的概念没有恶意用户破坏应用程序的能力相同。 – 2010-05-06 03:02:03
使用eval可能会带来巨大的安全风险,除非您信任文件内容,否则不推荐使用。 – thesmart 2014-02-10 22:32:45