这是编写这样的代码的便捷方式:
str = "John"
p "Welcome, #{str}"
# => "Welcome, John"
在真正的Rails应用程序中,有可能故意编写str
来终止当前表达式并启动恶意代码。在我们确实需要将字符串与已评估的函数值混合的情况下,如何避免使用#{}
?例如:"Hello, #{foo(param)}"
。
答案 0 :(得分:6)
"#{str}"
是安全的:格式本身不能是用户提供的。另一方面,插入的值(str
的评估)不是(eval)结果。
因此,要使此代码不安全,实际上相当困难:
fmt = "doBadStuff()"
eval('"Welcome #{' + fmt + '}"')
当然,结果字符串(来自初始问题)必须正确使用(例如database placeholders或正确引用HTML)以避免标准注入漏洞; 但想象中的漏洞不存在。
答案 1 :(得分:0)
"foo#{bar}baz"
唯一要做的就是在to_s
上应用bar
,并将结果与foo
和baz
结合起来。如果您通过文本框等获得用户输入,则输入将已成为字符串。如果bar
已经是字符串,则to_s
将自行返回。连接将产生一个字符串。可能会发生结果字符串看起来像rm -rf
,但除非您在其上进一步执行system
或eval
之类的操作,否则不会对字符串执行任何其他操作。