Bezpečné výpočty v novém vlákně
Při tvorbě webové aplikace jsem řešil problém, jak uživateli poskytnout možnost zadat své vlastní matematické vzorce, které by se dále v programu prováděly a to tak, aby jejich běh neohrožoval bezpečnost celé webové aplikace či dokonce aplikačního serveru. Vlastní parser vzorců se mi vytvářet nechtěl; určitě by nebyl tak efektivní jako těch pár řádků kódu, kterými jsem problém vyřešil.
V programovacím jazyce Ruby lze nastavit bezpečnostní mód běhu a to naprosto jednoduše přiřazením čísla do proměnné $SAFE. Definováno je pět bezpečnostních úrovní:
0 | Bez jakýchkoliv kontrol. Výchozí. |
>=1 | Vyloučeny potenciálně nebezpečné operace. |
>=2 | Zákaz načítání programových souborů z globálních umístění. |
>=3 | Všechny nové objekty jsou podezřelé. |
>=4 | Oddělení běhu programu, bezpečné objekty nelze měnit. |
Zde je anglicky podrobnější definice bezpečnostních úrovní.
V mém řešení je v novém vlákně nastavena bezpečnostní úroveň číslo 4, tedy nejbezpečnější úroveň běhu. V této úrovni nelze použít ani puts. Matematický vzorec je uživatelem zadán jako řetězec a vyhodnotí se funkcí eval. Veškerý kód je krátký a srozumitelný:
expr = "1*25+19/1" begin result = Thread.start {$SAFE=4; eval(expr) }.value rescue result = nil # pripadna chyba osetrena end
Lze uživateli vytvořit efektivnější webovou kalkulačku?