编写这样的代码是一种方便的方法:
str = "John"
p "Welcome, #{str}"
# => "Welcome, John"
在真实的 Rails 应用程序中,可能str
会故意编写以终止当前表达式并启动恶意代码。#{}
在确实需要将字符串与评估函数值混合的情况下,如何避免使用?例如:"Hello, #{foo(param)}"
。
编写这样的代码是一种方便的方法:
str = "John"
p "Welcome, #{str}"
# => "Welcome, John"
在真实的 Rails 应用程序中,可能str
会故意编写以终止当前表达式并启动恶意代码。#{}
在确实需要将字符串与评估函数值混合的情况下,如何避免使用?例如:"Hello, #{foo(param)}"
。
"#{str}"
这个警告是安全的:格式本身不能由用户提供。另一方面,插入的值(对 的评估str
)不是(评估)结果。
所以,让这段代码变得不安全实际上是相当困难的:
fmt = "doBadStuff()"
eval('"Welcome #{' + fmt + '}"')
当然,必须正确使用生成的字符串(来自最初的问题)(例如,数据库占位符或 HTML 正确引用)以避免标准注入漏洞;但想象中的漏洞并不存在。
唯一要做的就是用and"foo#{bar}baz"
应用和连接结果。如果您通过文本框等获取用户输入,则输入已经是字符串。如果已经是一个字符串,它会返回自己。连接将产生一个字符串。结果字符串可能看起来像,但除非你进一步做类似或的事情,否则不会对字符串做任何其他事情。to_s
bar
foo
baz
bar
to_s
rm -rf
system
eval