Pracuję nad aplikacją webapp do nauczania koncepcji programowania. Strony internetowe zawierają trochę tekstu o koncepcji programowania, a następnie pozwalają użytkownikowi wpisać kod javascript w oknie edytora tekstu, aby spróbować odpowiedzieć na problem programowania. Gdy użytkownik kliknie przycisk "prześlij", analizuję tekst, który wpisał, aby sprawdzić, czy rozwiązał problem. Na przykład, proszę je "napisać funkcję o nazwie f
, która dodaje trzy do jej argumentu".Jak bezpiecznie "eval" kod użytkownika na stronie internetowej?
Oto co robię analizować tekst użytkownika:
- Run JSLint sprawie tekstu z rygorystycznymi ustawieniami, szczególnie bez zakładając funkcje przeglądarki lub konsoli.
- Jeśli wystąpią jakiekolwiek błędy, pokaż błędy i zatrzymaj się.
eval(usertext);
- Warunki przejścia przez przelot,
eval(condition)
. Przykładowy warunek to"f(1)===4"
. Warunki pochodzą z zaufanego źródła. - Pokaż warunki przejścia/niepowodzenia.
Moje pytania: czy to wystarczająco dobre, aby zapobiec problemom bezpieczeństwa? Co jeszcze mogę zrobić, aby być paranoikiem? Czy istnieje lepszy sposób robienia tego, co chcę?
Jeśli jest to istotne, moja aplikacja działa w Google App Engine z backendem Pythona, używa JQuery, ma indywidualne konta użytkowników.
Zastanawiam się, czy jsfiddle ma jakieś źródło/notatki dostępne ... Jestem pewien, że w pewnym momencie sprowadza się on do witryny, która nie jest podatna na XSS lub podobne.(XSS może * pozwolić komuś innemu * podać link do kodu eval'ed na wspomnianej stronie, która może wtedy "działać jako" użytkownik, który faktycznie przeglądał link.) –
Muszę powiedzieć, kiedy używam JSLint do przeskanowania mojego JS dla problemy przed kompresją Próbuję wyłączyć każdą funkcję, która może reprezentować preferencje autora, a nie kwestię kodu, wtedy pomijam 90% tego, co jest napisane i szukam brakujących średników i tym podobnych. Gdybym był tobą, zastanawiałbym się, ile użytkownicy będą lubili czytać "błędy" znalezione przez JSLint. – tomfumb
To dobra uwaga, dodam opcję wyłączenia czeków "stylistycznych". Ale chcę, aby domyślne było ścisłe, częścią projektu jest nauczenie czystego programowania w javascript. –