/ / Ruby spustiteľný v YAML - ruby-on-rails, ruby, yaml

Ruby spustiteľný v YAML - ruby ​​na koľajniciach, rubín, yaml

Mám vzorku yaml súbor (abc.yaml) ako toto:

entity1:
condition: "created_at >= #{Date.today - 3.months}"

Chcem prečítať túto podmienku YAML v Ruby ako:

"created_at >= 2015-03-02"

Ale keď to urobím

YAML.load_file("abc.yaml")["entity1"]["condition"]

Dostávam:

"created_at >= #{Date.today - 3.months}"

Dajte nám vedieť, ako to obísť.

odpovede:

1 pre odpoveď č. 1

Urobte to iba vtedy, ak ste si úplne istí, že nikto nemôže zmeniť váš súbor yamlu tak, aby injektoval niečo škodlivé:

condition = YAML.load_file("abc.yaml")["entity1"]["condition"]
condition = eval ""#{condition}""

2 pre odpoveď č. 2

Bezpečnejšou možnosťou by bolo previesť iba známe údaje z vopred určeného formátu. Alebo použite niečo v pohode, napríklad settingslogic https://github.com/settingslogic/settingslogic, Na načítanie nastavení používa formátovanie v štýle ERB, takže niektoré z nich sú zabudované do bezpečnosti.

napr:

defaults: &defaults
cool:
saweet: nested settings
neat_setting: 24
awesome_setting: <%= "Did you know 5 + 5 = #{5 + 5}?" %>

0 pre odpoveď č. 3

Použite to ako

entity1:
condition: "created_at >= <%= Date.today - 3.months %>"

A pri čítaní načítať ako

abc = YAML.load(ERB.new(File.read("file_path")).result)
abc["entity1"]["condition"]