Portál AbcLinuxu, 30. dubna 2025 10:20
V poslednom období sa mi dostal pod ruky zaujímavý problém. Potrebujem bezpečne vypočítať uživateľom zadaný matematický vzorec. Problémy su hneď dva. Jednak vyhodnotiť, či vzorec vôbec je validný. (alebo teda či ide o vzorec, alebo nie - tu je tolerovaťeľné isté pochybenie) Druhý, väčší problém je bezpečnosť celého riešenia.
Tu ide hlavne o to, že zadaný reťazec nemusí byť matematický príklad. Podobne ako napríklad google rozozná vyhľadávací reťazec od príkladu. (ide o veľmi podobnú funkcionalitu) Istá dávka tolerancie v tomto smere je v poriadku. (nevadí, keď sa pokúsi príklad vypočítať, aj keď ide o inú frázu) To som vyriešil sadou regexpov - overujem použité znaky, ich kombinácie a podobne. Všeobecne sa dá povedať, že pokiaľ dostanem na vstupe príklad, tak ho rozoznám. V prípade záujmu dohodím par riadkov v pythone, ale nejde o nič extra zaujímavé.
Tu začína byť trošku problém. Na vstupe môže byť takmer čokoľvek. (predchádza len pár filtrami, ako lowercase, orezanie whitespaces a podobne) Používateľ navyše nemôže byť považovaný za dôveryhodnú osobu a môže - či už úmyselne, alebo zámerne poskytnúť nebezpečné vstupné hodnoty. (reťazec)
Pythoní eval nemôžem v tomto prípade považovať za bezpečné riešenie. Nejaké snahy o jeho secure variantu už pred nejakou dobou stroskotali. Ako riešenie sa mi ponúka spúšťanie samostatného procesu v chroote s časovým obmedzením. (v desatinách sekundy - nevadí, ak sa príklad nestihne vypočítať, vadí, ak sa bude počítať pridlho) V takom prípade zvažujem navyše použitie perlu (jeho syntax je IMHO trošku bližšia "bežnému" matematickému zápisu) plus, samozrejme, par filtrov. (konverzia na desatinnu bodku a podobne)
Otázka teda je, ako (by) ste to riešili vy? Podeľte sa o svoje nápady / skúsenosti v diskusii! Za každu radu budem vďačný.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.