我有一个字符串:
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)
这实际上有效 - 我可以做些什么来减少潜在的风险?
答案 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。