Статьи

Javascript и безопасность

У Дори Смит есть отличная запись в ее блоге Javascript об использовании Javascript для защиты страниц ее сайта. Она утверждает, что Javascript действительно не подходит для этой работы, и я полностью с ней согласен. Тем не менее, можно использовать Javascript для дальнейшего повышения безопасности системы входа на стороне сервера.

Если вы не используете SSL, скорее всего, система входа в систему вашего сайта отправляет пароли в открытом виде. Они могут быть встроены в POST-запрос, но они все еще являются честной игрой для программ, таких как Ettercap . Хотя это и далеко не полностью решает проблему, вы можете уменьшить влияние атак с использованием сниффинга, используя Javascript для шифрования пароля пользователя перед его передачей в ваше приложение. Evesdropper может получить доступ к вашему приложению, используя данные, которые он прослушал, но он не сможет получить доступ к другим приложениям, использующим тот же пароль (большинство людей используют один и тот же пароль везде).

Но наверняка, если шифрование выполняется с помощью Javascript, злоумышленник сможет взломать его и самостоятельно расшифровать пароль? Вовсе нет, благодаря волшебству алгоритмов одностороннего шифрования — в частности, MD5.

MD5 — это односторонний алгоритм хеширования. Вы даете ему вход, и он выплевывает вывод. Хитрость в том, что не существует систематического способа извлечения исходного ввода из вывода, кроме атаки методом перебора. Javascript не обеспечивает встроенную поддержку MD5, но эта бесплатная библиотека обеспечивает реализацию Javascript MD5, специально разработанную для предотвращения передачи паролей в открытом виде.

Вот упрощенное объяснение того, как это работает:

  • Веб-сервер обслуживает форму со скрытым полем, содержащим случайную строку «вызов» и, необязательно, отметку времени, когда форма была предоставлена.
  • Пользователь вводит свой пароль и отправляет форму.
  • Javascript склеивает их пароль к вызову, а MD5 хэширует их обоих. Только хэш отправляется обратно на сервер.
  • Сервер знает пароль пользователя и запрос, который был отправлен, поэтому он хэширует их и сравнивает результат с данными, отправленными пользователем.

Естественно, при реализации такой вещи важно, чтобы система функционировала даже с отключенным Javascript. Вы можете сделать это, установив переменную в скрытом поле формы, когда используется метод шифрования Javascript; сервер может проверить, было ли установлено это поле, и предположить, что пароль был отправлен открытым текстом, если нет.

Если ваше веб-приложение хранит зашифрованные пароли (как и приложение с хорошим поведением), этот метод все еще можно использовать — вам просто нужно дважды MD5 пароль на стороне клиента, один раз, чтобы получить зашифрованную версию, а затем один раз с зашифрованной версией, добавленной к задача получить ответ, который следует отправить на веб-сервер.

Пример серверного кода для этого метода можно найти на этой странице сайта Javascript MD5.