如何避免使用`#{str}`来解决安全问题

时间:2013-09-04 21:24:11

标签: ruby-on-rails ruby security code-injection

这是编写这样的代码的便捷方式:

str = "John"
p "Welcome, #{str}"
# => "Welcome, John" 

在真正的Rails应用程序中,有可能故意编写str来终止当前表达式并启动恶意代码。在我们确实需要将字符串与已评估的函数值混合的情况下,如何避免使用#{}?例如:"Hello, #{foo(param)}"

2 个答案:

答案 0 :(得分:6)

这个警告

"#{str}"是安全的:格式本身不能是用户提供的。另一方面,插入的str的评估)不是(eval)结果。

因此,要使此代码不安全,实际上相当困难:

fmt = "doBadStuff()"
eval('"Welcome #{' + fmt + '}"')

当然,结果字符串(来自初始问题)必须正确使用(例如database placeholders或正确引用HTML)以避免标准注入漏洞; 但想象中的漏洞不存在

答案 1 :(得分:0)

"foo#{bar}baz"唯一要做的就是在to_s上应用bar,并将结果与​​foobaz结合起来。如果您通过文本框等获得用户输入,则输入将已成为字符串。如果bar已经是字符串,则to_s将自行返回。连接将产生一个字符串。可能会发生结果字符串看起来像rm -rf,但除非您在其上进一步执行systemeval之类的操作,否则不会对字符串执行任何其他操作。