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ď č. 1Urobte 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"]