Autor | Zpráva | ||
---|---|---|---|
TomasJ Profil |
#1 · Zasláno: 27. 1. 2014, 17:04:23
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 |
#2 · Zasláno: 27. 1. 2014, 17:12:15
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 eval em, 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 |
#3 · Zasláno: 27. 1. 2014, 17:29:18
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 |
#4 · Zasláno: 27. 1. 2014, 18:25:50
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 |
#5 · Zasláno: 27. 1. 2014, 18:50:21
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 eval em (kvůli znaku 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 |
#7 · Zasláno: 27. 1. 2014, 21:35:32
Chamurappi:
„který nefunguje s eval em (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 |
#8 · Zasláno: 29. 1. 2014, 13:38:11
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 eval uje, 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 |
#9 · Zasláno: 29. 1. 2014, 13:47:48
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 |
#10 · Zasláno: 29. 1. 2014, 14:45:02
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 |
#11 · Zasláno: 29. 1. 2014, 18:56:20
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 |
#12 · Zasláno: 30. 1. 2014, 09:33:25
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)} „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. |
||
Časová prodleva: 11 let
|
0