2011-12-29 3 views
1

У меня есть приложение facebook, а некоторые функции требуют некоторых скриптов, запущенных через ajax. Есть ли способ убедиться, что сценарий вызывается только из моего приложения? Я использую jquery для вызовов ajax следующим образом:Ограничить возникновение вызова ajax

$.post('script.php', {var1: val1, var2: val2}, function(data){...}); 

.
Код внутри script.php запускает некоторые sql-запросы и просто проверяет, что все запрошенные переменные передаются через вызов ajax.
Что еще я должен проверить, чтобы сценарий мог выполняться только при вызове из моего приложения, а не путем явных вызовов?

Заранее спасибо.

ответ

3

Существует очень мало способов убедиться, что вы уверены, что запрос Ajax вызывается из вашего приложения со 100% уверенностью. Если бы это было критически важным (высокая безопасность) требование, то я бы обеспечить ему так же, как я бы обеспечить какой-либо конкретной веб-ресурс:

  1. Использовать SSL
  2. Требовать шлюз входа для установления сеанса
  3. Проверьте правильность этой сессии, прежде чем разрешить запрос на обработку

Если вы не хотите, чтобы пройти через хлопоты установления сеанса, то есть менее определены, но все еще весьма полезное средство предотвращения доступ (причинный доступ, то есть):

Проверьте наличие двух заголовков запросов: Referrer и X-Requested-With. Referrer должен содержать URL-адрес вашей базовой страницы, а X-Requested-With должен содержать XMLHttpRequest. Их можно подделать, но для этого потребуется гораздо более решительный «атакующий», чем тот, кто просто просматривает URL-адрес напрямую.

+1

Я должен отметить, что даже если вы пошли с моим более безопасным первым предложением (установлением сеансов), вы могли бы (и должны) использовать менее защищенный метод проверки заголовков запросов. –

0

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

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

Чтобы сделать еще один шаг, вы можете заблокировать свои запросы на уровне сервера для этого пути к этому конкретному имени ip/host.

В действительности, дело доходит до того, насколько безопасным/полезным является ваш веб-сервис.

0

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

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

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

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

+0

Вы говорите о создании этого в веб-приложении или приложении Andriod? –

+0

Не имеет значения. Подход тот же. – jeffsix

+0

Мне было бы очень интересно увидеть какое-либо веб-приложение, способное генерировать и передавать клиенту сертификат SSL, который затем будет использоваться при описании. Я никогда не слышал об этом. –

1

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

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

Если вы можете ограничить определенные машины/IP-адреса, просто сделайте это. Сохраните список серверов, перечисленных на белом фоне, и убедитесь, что запрос получен из одного из них.

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

Смежные вопросы