Подтвердить что ты не робот

Как убедиться, что мои запросы AJAX происходят с одного и того же сервера в Python

Я уже задал вопрос об аутентификации IP здесь: TastyPie Authentication с того же сервера

Однако мне нужно что-то еще! IP-адрес может быть очень легко подделан.

enter image description here

Сценарий: Мой API (TastyPie) и клиентское приложение (в javascript) находятся на одном сервере/сайте/домене. Мои пользователи не входят в систему. Я хочу использовать свой API на стороне моего javascript.

Вопрос:. Как я могу убедиться (аутентификация), что мои AJAX-запросы являются , исходящими с того же сервера?

Я использую Tatypie. Мне нужна аутентификация, что запросы от клиента выполняются на одном сервере/домене и т.д. Я не могу использовать "зарегистрированные сеансы", так как мои пользователи не заходят в систему.

Я просмотрел секретные ключи и создал подпись, но они могут просматриваться в javascript, что делает этот метод небезопасным. Если я сделаю это, чтобы запросить форму подписи на сервере (скрывая закрытый ключ в некотором коде Python), любой может сделать тот же HTTP-запрос на get_signature, что делает мой javascript, тем самым побеждая точку.

example get signature

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

using Django for the signature

Я не могу поверить, что я единственный человек с этим требованием. Это общий сценарий, я уверен. Пожалуйста, помогите:) Пример использования пользовательской аутентификации в Tastypie также приветствуется.

Спасибо

Добавлено:

4b9b3361

Ответ 1

В зависимости от вашей инфраструктуры ответ @dragonx может вас заинтересовать больше всего.

my 2c

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

Я не могу поверить, что я единственный человек с этим требованием.

Возможно, нет, но, как вы видите, вы склонны к нескольким атакам к вашему API, и это может быть причиной того, что кто-то не разделяет ваш дизайн и не делает более строгую безопасность с помощью auth.

ИЗМЕНИТЬ

Поскольку мы говорим о запросах AJAX, что делает эта часть IP? IP всегда будет IP-адресом клиента! Так что, вероятно, вам нужен публичный API...

  • Я бы пошел с частью tokens/session/cookie.

  • Я иду с сгенерированным токеном, который длится некоторое время, и поток, описанный ниже.

  • Я бы пошел с ограничителем в течение некоторого времени, вроде Github. Например, 60 запросов в час на ip или более для зарегистрированных пользователей

Чтобы преодолеть проблему с обновляющим токеном, я бы просто сделал это:

  • Клиент посещает сайт

    - > сервер генерирует API TOKEN INIT

    - > Клиент получает API TOKEN INIT, который действителен только для запуска 1 запроса.

  • Клиент делает запрос AJAX API

    - > Клиент использует API TOKEN INIT

    - > Сервер проверяет API TOKEN INIT и ограничивает

    - > Сервер принимает запрос

    - > Сервер возвращает API TOKEN

    - > Клиент использует данные ответа и сохраняет API TOKEN для дальнейшего использования (будет сохранен в памяти браузера через JS)

  • Клиент запускает Comm с API для ограниченного количества или запросов. Обратите внимание, что вы знаете также токен init date, чтобы вы могли использовать его для проверки первого посещения на странице.

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

Таким образом, вам не нужно обновлять.

Конечно, описанный выше сценарий может быть упрощен с использованием только одного токена и ограничения по времени, указанного выше.

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

Конечно, умный атакующий может захватить токены с сервера и повторить шаги, но тогда у вас уже была эта проблема с самого начала.

Некоторые дополнительные точки

  • В качестве комментариев, пожалуйста, закройте записи в API. Вы не хотите быть жертвой атак DOS при записи, если у вас есть сомнения относительно вашей реализации (если не использовать auth) или для дополнительной безопасности
  • Сценарий токена, описанный выше, также может стать более сложным, например, путем постоянного обмена токенами

Только для справки. В хранилище облачных вычислений GAE используется signed_urls для какой-либо цели.

Надеюсь, это поможет.

PS. в отношении IP-спуфинга и защиты от подделки атак wikipedia говорит, что пакет не будет возвращен злоумышленнику:

Некоторые протоколы верхнего уровня обеспечивают собственную защиту от IP-адресов подталкивание атак. Например, протокол управления передачей (TCP) использует порядковые номера, согласованные с удаленным компьютером, чтобы обеспечить что входящие пакеты являются частью установленного соединения. Поскольку злоумышленник обычно не видит никаких ответных пакетов, порядковый номер необходимо угадать, чтобы захватить соединение. Бедные внедрение во многих старых операционных системах и сетевых устройствах, однако, означает, что порядковые номера TCP могут быть предсказаны.

Ответ 2

Если это чисто один и тот же сервер, вы можете проверить запросы против 127.0.0.1 или localhost.

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

Ответ 3

Я думаю, вы немного смущены (или я, пожалуйста, поправьте меня). То, что ваш JS-код опубликован на том же сервере, что и ваш API, не означает, что запросы AJAX будут поступать с вашего сервера. Клиенты загружают JS с вашего сервера и выполняют его, что приводит к запросам вашего API, отправленным с клиентов, а не с одного и того же сервера.

Теперь, если приведенный выше сценарий правильно описывает ваше дело, то, вероятно, вы пытаетесь защитить ваш API от bot scraping. Самая простая защита - CAPTCHA, и вы можете найти еще несколько идей на странице Wiki.

Если вы обеспокоены тем, что другие сайты могут совершать звонки AJAX в ваш API для копирования функциональности вашего сайта, вам не следует - запросы AJAX могут быть отправлены на тот же сервер, что и страница JS, если это не JSONP.

Ответ 4

Короткий ответ: невозможно предотвратить выделение злоумышленника.

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

Давайте рассмотрим ваш сценарий здесь, как я понимаю. Единственный способ аутентификации клиента - это IP-адрес, очень слабая форма проверки подлинности. Как вы заявили, это можно легко подделать, и с некоторыми усилиями ваш ответ сервера может быть получен обратно на исходный IP-адрес злоумышленника. Если это произойдет, вы ничего не можете с этим поделать. Дело в том, что если вы считаете, что кто-то из действительного IP-адреса является допустимым пользователем, то спуфины и законные пользователи неразличимы. Это похоже на то, что кто-то крадет ваш пароль и пытается войти в StackOverflow. Для StackOverflow злоумышленник и вы неотличимы, поскольку все, что им нужно, это имя пользователя и пароль.

Вы можете делать причудливые вещи с клиентом, как указано в других ответах, таких как токены, временные ограничения и т.д., но выделенный злоумышленник сможет имитировать действия законного клиента, и вы не сможете чтобы рассказать им обособленно, потому что оба они выглядят от действительных IP-адресов. Например, в вашем последнем примере, если я был злоумышленником, который ищет вызовы API, я бы обманул законный IP-адрес, получил подпись и использовал его для вызова API, как это сделал бы законный клиент.

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

Ответ 5

Возможно, вы могли бы достичь этого, используя политику с одинаковым исходным кодом

отсылайте http://en.wikipedia.org/wiki/Same_origin_policy

Ответ 6

Как было предложено Venkatesh Bachu, Same Origin Policy и http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing (CORS) могут быть использованы в качестве решения. В вашем API вы можете проверить заголовок Origin и ответить соответствующим образом. Необходимо проверить, можно ли изменить заголовок Origin, используя расширения, такие как данные вмешательства. Определенный хакер все еще может отслеживать, указывая браузер на локальный прокси-сервер.

Ответ 7

Если этот сервер приложений работает на обычном веб-сервере с настраиваемым IP-адресом прослушивания, установите его в 127.0.0.1. С модулем TCPServer он похож на

SocketServer.TCPServer(("127.0.0.1", 12345), TheHandlerClass)

Используйте команду netstat для проверки правильности адреса прослушивания как "127.0.0.1"

tcp4 0 0 127.0.0.1.12345 *.* LISTEN

Это эффективно сделает любое соединение, возникшее за пределами одного и того же хоста, невозможным на уровне TCP.

Ответ 8

Существует два общих типа решений: внутриполосные решения с использованием обычных механизмов веб-сервера/клиента, которые легко реализовать, но имеют ограничения; и внеполосные решения, которые полагаются на вас, чтобы настроить что-то извне, это займет немного больше работы, но не имеет таких же ограничений, как и внутри диапазона.

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

Вы можете устранить эти ограничения, если вы мотивированы, путем введения клиентских сертификатов. Это своего рода оборотная сторона для SSL-сертификатов, которые мы все используем на веб-серверах, - они работают одинаково, но используются для идентификации клиента, а не сервера. Поскольку сам сертификат никогда не проходит через провод (вы устанавливаете его локально в браузере или другом клиенте), у вас нет таких же угроз от "человек-в-середине" и утечки браузера. Это решение мало используется в дикой природе, потому что оно запутывает настройку (очень запутанную для типичного пользователя), но если у вас ограниченное количество клиентов, и они находятся под вашим контролем, тогда было бы возможно развертывать и управлять это ограниченное количество клиентских сертификатов. Операции с сертификатом обрабатываются браузером, а не кодом клиента (т.е. Не в JavaScript), поэтому ваша озабоченность по поводу того, что ключевые данные, видимые в JavaScript, не будут применяться в этом сценарии.

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