【问题标题】:Read string as variable RUBY将字符串读取为变量 RUBY
【发布时间】:2013-08-26 15:22:15
【问题描述】:

我正在从 CSV 文件中的单元格 A1 中提取以下字符串,并将其存储为变量:

#{collector_id}

所以,单元格 A1 读取 #{collector_id},而我的代码基本上是这样做的:

test = #excel_cell_A1

但是,如果我这样做:

puts test

我明白了:

#{collector_id}

我需要将#{collector_id} 读取为实际变量collector_id,而不是我用来调用该变量的代码。这可能吗?

感谢您的帮助。我正在使用 ruby​​ 1.9.3。

【问题讨论】:

  • 这没有多大意义。我们需要查看至少会被 Ruby 解释器接受的实际代码。见sscce.org

标签: ruby csv


【解决方案1】:

您可以使用subgsub 替换预期的输入值:

collector_id = "foo"
test = '#{collector_id}'
test.sub("\#{collector_id}", "#{collector_id}") #=> "foo"

我会避免使用eval(或至少检查您正在运行的内容)来降低运行从 CSV 文件中收到的任意代码的风险。

【讨论】:

  • 好建议。我认为这就足够了,我可以避免使用eval 作为最佳实践。
【解决方案2】:

试试这个:

test_to_s = eval("\"#{ test }\"")
puts test_to_s

%q["#{ test }"] 将构建字符串"#{collector_id}"(双引号是字符串的一部分,"#{collector_id}".length == 17),然后eval 将评估为 ruby​​ 代码

【讨论】:

  • 永远不要在用户提供的数据上使用eval。您刚刚创建了一个不错的远程代码执行漏洞(这是最严重的安全问题之一)。
  • 我同意安全问题 - 幸运的是,对于我的特殊情况,我的团队将创建我从中提取的 csv 文件。它基本上是电子邮件的内容文件。
猜你喜欢
  • 1970-01-01
  • 2013-07-14
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 2010-10-07
  • 1970-01-01
  • 2020-03-24
相关资源
最近更新 更多