Проблема безопасности, если Javascript оценивается Java на сервере

#java #javascript #security #rhino

#java #javascript #Безопасность #rhino

Вопрос:

Если я оцениваю код Javascript, отправленный из браузера, на сервере (Java webapp с использованием Rhino Javascript Engine), представляет ли это угрозу безопасности?

Удаление Javascript выполняется только для того, чтобы узнать, является ли это допустимым Javascript.

Я не ожидаю, что оценка вернет мне что-либо. Я не ожидаю, что он что-либо сохранит или к чему-либо прикоснется. Все, что нужно сделать, это сообщить мне, отправил ли пользователь действительный javascript.

Если это создает проблемы с безопасностью, могу ли я предпринять некоторые шаги, чтобы убедиться, что JavaScript не причинит никакого вреда системе?

Комментарии:

1. Допустимый JavaScript может использоваться для нанесения вреда системам; вам решать, что является вредным, а что нет. Я думаю, вам нужно переосмыслить свою модель безопасности здесь. Поможет публикация дополнительной информации о том, что вы собираетесь защищать или что вы намерены предотвратить.

2. Если вы просто хотите убедиться, что введенный javascript действителен, то вам нужно только правильно его скомпилировать?

Ответ №1:

Да, это создает угрозу безопасности, потому что из JavaScript внутри Rhino можно получить доступ к чему угодно во время выполнения Java, включая (например) все java.io классы.

Вы можете убедиться, что все ваши вызовы Rhino выполняются под юрисдикцией SecurityManager, который ограничивает практически все. В коде JDK ScriptEngine нет встроенного способа сделать это; Я не знаю о том, какие инструменты доступны для Rhino, используемые с хуком Mozilla.

Комментарии:

1. Версия Rhino на JDK должна ограничивать возможности скрипта разрешениями, доступными при запуске скрипта. Однако по умолчанию он будет иметь доступ к коду вашего приложения, который обычно не будет безопасным.

2. Правильно, вот что я имею в виду — довольно часто что-то вроде веб-сервера запускается без ограничительного менеджера безопасности, и даже если он есть, он, вероятно, более разрешительный, чем то, что вы хотели бы передать любому случайному скрипту, размещенному на общедоступном URL 🙂