Внедрение JavaScript в JSON и безопасность - PullRequest
5 голосов
/ 22 июня 2011

У меня есть онлайн-сервис, где пользователи могут создавать документы с поддержкой json. Затем они сохраняются на сервере, и другие пользователи могут загрузить их. Затем JSON декодируется именно так, как он был представлен. Существуют ли какие-либо угрозы безопасности в случае, если пользователь подделывает json перед тем, как отправить его, и внедряет произвольный javascript, который затем выполняется в браузере зрителей? Это вообще возможно? это то, что мне нужно знать, если это возможно, или возможно произвольное выполнение javascript из строки json.

Ответы [ 3 ]

9 голосов
/ 22 июня 2011

Это полностью зависит от того, a) очищаете ли вы JSON на стороне сервера, и (еще больше) на b) как вы декодируете JSON на стороне клиента, когда вы загружаете его снова.

  • Любой код, который использует eval() для десериализации JSON в объект Javascript, открыт для атаки, которую вы описываете.

  • Любой код, который использует JSONP для загрузки JSON (т. Е. Передает JSON как литерал Javascript в именованную функцию обратного вызова), открыт для атаки, которую вы описываете (по сути, это то же самое, что и eval()).

  • Наиболее надежные механизмы синтаксического анализа JSON (например, json2.js, функция jQuery $.parseJSON или встроенные функции JSON.parse() в браузерах, которые ее поддерживают) не будут принимать JSON, который не следует Спецификация JSON . Поэтому, если вы используете библиотеку для анализа строки JSON, вы можете быть в безопасности.

  • Независимо от того, как вы собираетесь загружать JSON на стороне клиента, рекомендуется очищать любой пользовательский контент на стороне сервера. В этом случае вы можете использовать серверный код для проверки правильности JSON (например, используя json.loads(user_submitted_json) в Python и перехватывая ошибки).

Поэтому, проявив некоторую осторожность как на стороне сервера, так и на стороне клиента, вы сможете сделать это безопасно.

7 голосов
/ 22 июня 2011
<plug shameless="true">

JSON sans eval разработан, чтобы избежать проблем с искаженным JSON, но при этом все еще эффективен при синтаксическом анализе.

Этот анализатор JSON не пытается проверить JSON,поэтому может возвращать результат с синтаксически неверным вводом, но не использует eval, поэтому является детерминированным и гарантированно не изменяет какой-либо объект, кроме возвращаемого значения.

В json есть ряд анализаторов JSON в json.org.Эту реализацию следует использовать всякий раз, когда проблема безопасности (когда JSON может поступать из ненадежного источника), скорость - проблема, а ошибка в искаженном JSON - не проблема.

</plug>
5 голосов
/ 22 июня 2011

JSON традиционно анализируется с помощью оператора eval(), который настолько небезопасен, насколько это возможно. Если вы разрешите это, ваше приложение будет небезопасным.

...