我可以使用字符串作为可执行代码行的一部分吗?

时间:2014-11-26 23:51:57

标签: ruby string replace eval

我有一个字符串:

parsed[tag] => "first_name: 'Richard'"

我需要执行如下代码:

client.put_if_absent("profiles", bot_client_name, {first_name: 'Richard'})

我是否有可能使用第一个字符串以某种方式充当等效文本的代码?我尝试使用eval(parsed[tag]),但这是一次失败。

我改为:

response = "client.put_if_absent('profiles', bot_client_name, {#{parsed[tag]}})"

eval(response)

这实际上有效 - 我可以做些什么来减少潜在的风险?

3 个答案:

答案 0 :(得分:3)

请不要使用eval来解析用户输入。这是非常危险的,你永远不会让它变得安全。您在此处的真正目标似乎是使用此字符串"first_name: 'Richard'"并从中创建此对象{first_name: 'Richard'}。你不需要eval来完成这项任务。

如果您尝试接受用户输入并将其转换为对象哈希,请查看此问题。 How do I convert a String object into a Hash object?我建议在该帖子中查看jackquack的答案,以便了解如何使用Ruby强大的字符串库(http://www.ruby-doc.org/core-2.1.4/String.html)中的方法来解析您的输入

如果您的用户输入采用JSON,YAML,XML等标准格式,那么您可以使用一个可以为您完成所有这些艰苦工作的库。如果您的用户输入是自定义格式,例如您的情况,那么您需要自己进行解析。

答案 1 :(得分:0)

这当然取决于你的标签是什么,但是只需要像这样解析它:

parsed_tag_hash = Hash[*parsed[tag].scan(/\w+/)]
# {"first_name"=>"Richard"}
client.put_if_absent("profiles", bot_client_name, parsed_tag_hash)

答案 2 :(得分:-1)

Meta-answer,因为我不知道Ruby:

假设您的字符串是用户输入,您需要确保它不会导致任何正在执行的操作。

虽然这可能是一个棘手的问题,但我认为您可以使用已知的约束来解决您的问题的有效输入,以确保它不可执行。使用正则表达式确保输入中没有字符串结束字符或转义字符,以便eval将其视为除单个字符串常量之外的任何内容。 HTH。