2013-08-12 27 views
7

Wielu programistów uważa, że ​​należy unikać metody JavaScript eval(). Ten pomysł ma sens z punktu widzenia projektu. Jest często używany jako brzydki sposób obejścia sytuacji, gdy dostępna jest prostsza i lepsza opcja.Korzystanie z metody eval() JavaScriptu

Nie rozumiem jednak obaw związanych z lukami w zabezpieczeniach. Z pewnością uruchamianie eval() daje hakerowi możliwość uruchamiania dowolnego kodu JavaScript, który można uruchomić.

Ale czy oni nie mogą tego zrobić? W przeglądarce Chrome przynajmniej narzędzia deweloperskie umożliwiają użytkownikowi końcowemu uruchamianie własnego skryptu JavaScript. W jaki sposób eval() jest bardziej niebezpieczny niż narzędzia dla programistów?

+2

To nie jest "wspólny konsensus" *. Wielu doświadczonych programistów denerwuje FUD na temat 'eval'. * "Eval to zło" * prawdopodobnie nigdy nie jest dziś powiedziane przez doświadczonych programistów. Jeśli jesteś głupi, może to być niebezpieczne. Ale zazwyczaj jest to po prostu powolne, brzydkie i prowadzi do trudnego do ewolucji kodu. –

+0

Teraz nie widzę, jak to pytanie może otrzymać dobrą odpowiedź ... –

Odpowiedz

11

Jak wspomniał B-Con, atakujący nie jest tym, który siedzi przy komputerze, więc może używać już w twoim skrypcie kodu eval() jako środka do przekazywania złośliwego kodu do twojej strony w celu wykorzystania sesji obecnego użytkownika w jakiś sposób (np. użytkownik podążający za szkodliwym linkiem).

Niebezpieczeństwo związane z eval() ma miejsce, gdy jest wykonywane na niesobanckich wartościach i może prowadzić do podatności na atak DOM Based XSS.

np. Rozważmy następujący kod HTML (raczej wymyślony, ale to pokazuje problem mam nadzieję)

<script> 

eval('alert("Your query string was ' + unescape(document.location.search) + '");'); 

</script> 

Teraz jeśli ciąg kwerendy jest ?foo po prostu dostać się okno dialogowe z ostrzeżeniem o następującej treści: Your query string was ?foo

Ale co Kod ten pozwoli użytkownikowi na przekierowanie użytkowników z ich witryn do adresu URL, takiego jak http://www.example.com/page.htm?hello%22);alert(document.cookie+%22, gdzie www.example.com jest Twoją witryną.

ten modyfikuje kod, który jest wykonywany przez eval() do

alert("Your query string was hello"); 
alert(document.cookie+""); 

(nowe linie dodanych przeze mnie dla jasności). Teraz może to być coś bardziej szkodliwego niż pokazanie aktualnej wartości cookie, ponieważ wymagany kod jest po prostu przekazywany na łańcuch zapytania przez link atakującego w zakodowanej formie. Na przykład może to być wysłanie pliku cookie do domeny atakującego w żądaniu zasobu, umożliwiając przejęcie sesji uwierzytelniania.

Odnosi się to do dowolnej wartości z użytkownika/wejścia zewnętrznego, która nie jest realizowana i wykonywana bezpośrednio w eval(), a nie tylko w łańcuchu zapytania, jak pokazano tutaj.

+0

Ma to sens. Myślałem, że 'eval()' pozwala na włamywanie się do samej witryny, zamiast zezwalać innym witrynom na skrobanie danych użytkownika. –

+0

Nie bezpośrednio, ale może się zdarzyć, gdy użytkownik admin został skierowany. – SilverlightFox

2

Osoba atakująca nie ma dostępu do narzędzi programistycznych przeglądarki użytkownika. Atakującym prawdopodobnie nie jest użytkownik siedzący przy komputerze.

Niebezpieczeństwo: eval() polega na tym, że osoba atakująca może manipulować danymi, które ostatecznie są przetwarzane w inny sposób przez eval(). Jeśli ciąg znaków d pochodzi z połączenia HTTP, atakujący może wykonać atak MITM i zmodyfikować ciąg znaków. Jeśli ciąg pochodzi z pamięci zewnętrznej, osoba atakująca mogła zmanipulować dane w tej lokalizacji przechowywania. Itd.

+2

Prawdziwym problemem jest ciąg pochodzący z dowolnego źródła dostarczonego przez użytkownika.Atak MITM zawsze będzie problemem, względy 'eval'. Jeśli wykonują MITM, mogą tak samo łatwo modyfikować zwykły nieoceniony ładunek JS. – Matt

+1

Kolejny klasyczny przykład to "eval'ing GET variables to łatwy sposób na otwarcie otworów XSS. Itd. –

Powiązane problemy