2012-12-24 9 views
10

Chciałbym pozwolić użytkownikowi na wykonanie prostych obliczeń na wejściach tekstowych, dzięki czemu wpisanie 2 * 5 spowoduje 10. Zamieniam wszystko oprócz cyfr na pusty ciąg, a następnie dokonuję obliczeń za pomocą eval(). Wydaje się to łatwiejsze i prawdopodobnie szybsze niż ręczne analizowanie.Czy korzystanie z javascript eval() jest bezpieczne w przypadku prostych obliczeń na wejściach?

Często mówi się, że eval() jest niebezpieczne, więc chciałbym usłyszeć, czy istnieje jakiekolwiek niebezpieczeństwo lub wada korzystania z niego w tej sytuacji.

function (input) { 
    value = input.value.replace(/[^-\d/*+.]/g, ''); 
    input.value=eval(value); 
} 
+5

'var wartość' * westchnienie * – katspaugh

+2

A wtedy zapytasz ludzi, dlaczego' 2 + 2e-3' '1' zamiast' 2.002'. Ostrzeż ludzi przed błędnymi danymi wejściowymi, nie wyrzucaj ich w milczeniu. I spróbuj/pochwyć ocenę, abyś mógł powiedzieć użytkownikowi, czy się nie udało. – DCoder

Odpowiedz

7

To jest bezpieczne, nie dlatego, że są odkażania, ale ponieważ wszystko jest wprowadzone przez użytkownika i uruchomienia własnej przeglądarce. Jeśli naprawdę chcieli wprowadzić złośliwy kod, mogliby to zrobić za pomocą firebuga lub inspektora sieci, a nawet za pomocą skryptozakładki. Na szczęście niewiele można zrobić złośliwie za pomocą javascript, poza zablokowaniem własnej przeglądarki :)

1

Jest to bezpieczne, ponieważ dokonuje się sprawdzania danych wejściowych przed umieszczeniem go w eval.

oprócz należy również dodać:

()%

+3

To nie jest * sprawdzanie poprawności *, to * filtrowanie *. – DCoder

+0

Nie dodałem(), ponieważ 1() spowodowałoby błąd "nie jest funkcją" w konsoli i nie lubię tego; również ocena może się nie udać z powodu niedopasowanych zamków. Chociaż prawdopodobnie powinienem użyć metody "try/catch". Dzięki za modulo i wykładnik z drugiego posta. –