Насколько безопасно отправлять текстовые пароли с помощью AJAX? - PullRequest
12 голосов
/ 17 июля 2009

Возможно, название плохо сформулировано, но не мог придумать лучшего способа сказать это.

В настоящее время я работаю над системой входа в систему (ничего формального, просто экспериментирую) и планирую использовать PHPLiveX (библиотеку AJAX) для некоторых функций. По сути, вы создаете некоторые функции PHP, которые затем вызываются с помощью JavaScript. Вы можете добавить параметры (getElementById) в JavaScript, которые передаются в функцию PHP.

Что я действительно хотел знать, так это то, безопасно ли просто вызывать функцию из JavaScript без предварительного шифрования пароля, а затем разрешить функции PHP зашифровать ее (в данном случае SHA256). Можно ли перехватить данные, передаваемые через AJAX? Если да, то насколько вероятно это?

Ответы [ 13 ]

45 голосов
/ 17 июля 2009

Не более или менее безопасно, чем обычный HTTP-запрос POST, выданный браузером (например, из <form>)

Исправление для этого - то же самое "исправление" для запросов не AJAX - используйте SSL.

20 голосов
/ 17 июля 2009

Как уже упоминали другие, это не более опасно, чем отправка HTTP-сообщения из формы. На самом деле это одно и то же.

Но если HTTPS не вариант, вы всегда можете использовать схему запроса / ответа по незашифрованному соединению. В основном это работает так:

  • На сервере есть SHA (или любой другой алгоритм хеширования, который вы предпочитаете) для хэша пароля пользователя.
  • Клиент имеет пароль.
  • Клиент запрашивает (используя незашифрованный AJAX), чтобы сервер отправил запрос (случайная строка байтов; символы в порядке.)
  • Сервер создает запрос и идентификатор запроса и сохраняет его с истечением срока действия.
  • Клиент получает вызов и идентификатор вызова.
  • Клиент хеширует пароль, используя SHA.
  • Клиент хэширует полученный хеш с добавленным к нему заданием.
  • Клиент отправляет идентификатор запроса (не сам вызов) и второй полученный хеш.
  • Сервер ищет вызов, используя ID, если он существует и не истек.
  • Сервер добавляет запрос к сохраненному хешу пароля и создает хеш по той же схеме, что и клиент.
  • Сервер сравнивает свой хеш с клиентом. Если это то же самое, пользователь аутентифицирован.

На самом деле довольно просто настроить, как только вы получите идею. Википедия содержит дополнительную информацию.

РЕДАКТИРОВАТЬ: Я заметил, я забыл упомянуть, прошла ли аутентификация успешно, вы должны удалить вызов, независимо Предоставление клиенту нескольких попыток для одного вызова может привести к проблемам с безопасностью.

7 голосов
/ 17 июля 2009

Независимо от того, отправляете ли вы пароль через AJAX или через обычную форму, он все равно отправляется через HTTP POST (надеюсь) запрос. Таким образом, вы ничего не добавляете и не удаляете с точки зрения безопасности.

Единственный способ запретить кому-либо перехватывать ваш пароль - использовать SSL (через AJAX или нет).

1 голос
/ 17 июля 2009

Да, это можно прочитать. Как и все остальное без какого-либо уровня безопасности (см. SSL)

Чтобы увидеть это, запустите такой инструмент, как WireShark , как вы выполняете команды AJAX.

Насколько вероятно? Не очень, но пароль пользователя, вероятно, будет сохранен в чьих-либо файлах журнала в виде обычного текста. Если кто-то в конце концов обнаружит это, это может быть плохой новостью. Еще в колледже у моего сетевого класса был доступ к некоторым (полу) модным маршрутизаторам. У нас были задания, в которых мы регистрировали аккаунты на случайных сайтах. Сделав это, мы заметили некоторые очень страшные вещи в файлах журналов в маршрутизаторах. Это открыло мне глаза на размышления о том, как каждое сообщение отслеживается и, скорее всего, где-то регистрируется.

1 голос
/ 17 июля 2009

Убедитесь, что целью вашего AJAX-вызова является доверенная страница HTTPS: //, и вы сделали ее настолько же безопасной, как и любые другие посылки той же информации, что и остальная часть вашего приложения. Большинство библиотек / сред не ограничивают вас только HTTP: // для ваших вызовов AJAX.

1 голос
/ 17 июля 2009

Это так же безопасно, как отправлять по сети форму входа, не защищенную SSL, как это делают почти все форумы!

1 голос
/ 17 июля 2009

AJAX-вызовы - это просто HTTP-запрос.

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

Чтобы сделать ваши AJAX-звонки безопасными, есть несколько способов:

  1. Использовать SSL. SSL будет шифровать сообщения между вашим пользователем и вашим сервером. Недостатком SSL является то, что вам придется платить дополнительную плату за действительные сертификаты SSL. Недействительные сертификаты SSL, хотя и могут быть использованы, не обеспечивают такого же уровня безопасности пользователям.
  2. Шифрование запросов перед отправкой на стороне клиента. Например: хешируйте пароль пользователя перед отправкой по сети. В большинстве случаев вам все равно не нужен простой текстовый пароль пользователя. Это невозможно использовать, когда пользователи не разрешают запускать сценарии на стороне клиента.
  3. И, кроме обычной вводящей в заблуждение информации, где POST безопаснее, чем GET, это не так. Оба они одинаково открыты для злоумышленников.
0 голосов
/ 26 сентября 2012

Следует также быть в курсе потенциальных уязвимостей безопасности при создании приложения, использующего Ajax.

На следующем сайте есть действительно хорошая информация об атаках Ajax и XSS или XSRF http://www.isecpartners.com/files/isec-attacking_ajax_applications.bh2006.pdf

Не забывайте, что когда вы делаете удаленную функцию доступной для вызова javascript, пользователь может просто угадать вызов функции и изменить его, чтобы выполнить его / ее указание.

0 голосов
/ 20 июля 2010

черт возьми, вы, ребята, беспокоитесь обо мне. SSL не защищает от атаки MITM отравления арп. Было бы смертельно поклоняться SSL, как вы, ребята. У вас должен быть способ зашифровать пароль на стороне клиента, прежде чем он сделает хотя бы один прыжок, иначе даже начинающий хакер сможет перехватить пароль в виде открытого текста

0 голосов
/ 18 июля 2009

Как уже упоминалось, SSL является лучшим решением здесь. Однако вы можете хешировать пароль на стороне клиента. Если вы заглянете в Google, вы найдете множество реализаций JavaScript в md5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...