Autor Zpráva
TomasJ
Profil
Zdravím, nejsem sice úplný začátečník co se týče JS a celkově vývoje webových aplikací a stránek. Přesto tu mám jedenzačátečnický dotaz:
Jak je vlastně eval nebezpečný? Jak eval z JS ublíží mému webu?
Proč ho vlastně nepoužívat, když si stejně kdokoliv může v rámci možností JS hrát s mým webem a přidat si klidně funkci, kde eval použije? Neukamenujte mne, že se ptám na základní věc, ale píše se o tom neustále a já, i když eval nepoužívám, stále nechápu v čem může mému webu ublížit? Děkuji předem všem odpovídajícím.
Chamurappi
Profil
Reaguji na TomaseJ:
Sám o sobě nebezpečný není.
1) Při obzvláště nešikovném použití může představovat XSS díru — třeba když se nějaký vstup od uživatele dostane přímo do řetězce volaného evalem, pak by nějaká zlá stránka mohla tento vstup nasimulovat a jménem uživatele provádět nepěkné věci.
2) Při běžně nešikovném použití vypadá hloupě, třeba když ho někdo pustí na value s cílem převést řetězec na číslo. To je nebezpečné zejména pro reputaci programátora :-)
3) Skoro ve všech zbývajících případech je eval jen zbytečný a neefektivní. Což je též důvod k jeho nepoužívání.

Jak eval z JS ublíží mému webu?
Velmi pravděpodobně nijak. Ale nejspíš mu ani nepomůže.

Já používám eval jen na AJAXem stahovaný JSON.
Joker
Profil
TomasJ:
Why is using the JavaScript eval function a bad idea?

Body 1 a 3 zhruba odpovídají bodům 1 a 3 v Chamurappiho příspěvku.

Bod 2, jelikož je méně zřejmé, jaký kód se vlastně nakonec provede, znesnadňuje to ladění a může to být zdrojem nepříjemných a těžko dohledatelných chyb.
TomasJ
Profil
Chamurappi, Joker:
Takže eval nijak neuškodí mému webu - chápu to správně? Já se ptám hlavně kvůli zmiňovanému JSON, kde je eval dobrý, ale údajně jsou funkce z něj vytvořené, pomalejší, než ty, které existují od načtení stránky (což se dočítám i z odkázaného tématu).

Chamurappi:
třeba když ho někdo pustí na value s cílem převést řetězec na číslo
Tak to jsem z této chybičky venku, na to používám parseInt/Float :)
Radek9
Profil
TomasJ:
kvůli zmiňovanému JSON
Primárně bych zkoušel JSON.parse a teprve při nepodpoře bych se uchýlil k evalu.
Chamurappi
Profil
Reaguji na Radka9:
Když pak narazí na JSON, který nefunguje s evalem (kvůli znaku U+8232 U+2028, spletl jsem si číselnou soustavu), nebo na JSON, který nefunguje s JSON.parse (třeba kvůli JS komentáři), bude mít kód fungující jen v části prohlížečů => hůř odhalí problém.
Radek9
Profil
Chamurappi:
který nefunguje s evalem (kvůli znaku U+8232)
Silně pochybuji, že v reálných datech se kdy objeví.

třeba kvůli JS komentáři
V JSONu, bereme-li ho jako formát pro data, nemá podle specifikace JS komentář co dělat.
Chamurappi
Profil
Reaguji na Radka9:
Silně pochybuji, že v reálných datech se kdy objeví.
Bavíme se o všech možných situacích, kdy se JSON může používat, ne o nějakém specifickém případu. Je tedy jisté, že se v reálných datech objeví úplně všechno, co se objevit může.

V JSONu, bereme-li ho jako formát pro data, nemá podle specifikace JS komentář co dělat.
Podle specifikace JS ale může být v zápisu objektu komentář. (Což je mimochodem slabina toho standardizovaného JSONu, že na rozdíl od XML nepodporuje žádný druh komentářů.)
Také můžou být v souladu s pravidly JS názvy členů zapsané bez uvozovek, s čímž se JSON.parse nepopere. Dokonce mu vadí i apostrofy.

Připadá mi velmi smutné, jak je standardizovaný JSON vychýlený od standardního zápisu JS objektu. Dělá to zbytečný zmatek. I když vyhynou prohlížeče neznající JSON.parse, při technice JSONP se vždy de facto evaluje, takže ta jemná nebezpečná rozdílnost přežije navždy. Nechci-li ji nikdy řešit, můžu JSON.parse zcela přehlížet.
_es
Profil
Chamurappi:
Také můžou být v souladu s pravidly JS názvy členů zapsané bez uvozovek
No ale nie je to veľmi dobrý nápad - môže sa stať, že názov člena bude kľúčové slovo JS a vtedy to fungovať nebude.
Jan Tvrdík
Profil
Chamurappi:
Pokud zpracovávám JSON, který si sám generuji na serveru (např. pomocí PHP), tak nemám problém zajistit, aby byl kompatibilní s eval i JSON.parse. Pokud zpracovávám JSON z externího zdroje, na kterým nemám kontrolu, tak použití eval představuje bezpečností problém.

Připadá mi velmi smutné, jak je standardizovaný JSON vychýlený od standardního zápisu JS objektu.
Mně to zase dělá radost, protože parser JSONu je o to jednodušší a rychlejší, protože nemusí řešit nekonzistence (tedy až na 1e3 vs. 1E3 a bíle znaky).
Chamurappi
Profil
Reaguji na _es:
Jo, s tím se musí trochu počítat. I když v ECMAScriptu 5 už tento problém neexistuje.


Reaguji na Jana Tvrdíka:
Velmi často zpracovávám data ze zdroje, který je z pohledu aplikace důvěryhodný, ale není přímo pod mojí kontrolou kvůli dělbě práce.

tak použití eval představuje bezpečností problém
Krátkým regulárem jde prověřit, že v řetězci není nic nebezpečného.

nemusí řešit nekonzistence (tedy až na 1e3 vs. 1E3 a bíle znaky)
Přihozením apostrofů a volitelnosti uvozovek kolem názvu člena by složitost formátu už moc výrazně nevzrostla. Existoval by pak jen jeden JSON.
Nebo když už to chtěli standardizovat trochu jinak, mohli to i nazvat jinak. Třeba JLON: JSON-like Object Notation :-)
_es
Profil
Chamurappi:
I když v ECMAScriptu 5 už tento problém neexistuje.
Zaujímavé, nevedel som. Otestoval som kód:
try{var x=eval("({while:1})")}catch(e){alert(e.message)}
V IE8 to zachytí výnimku, vo Firefoxe, Opere a Chrome (nejaké novšie verzie) nie.

Krátkým regulárem jde prověřit, že v řetězci není nic nebezpečného.
Pri dlhšom zápise hodnoty to bude asi zbytočne zaťažovať procesor.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: