2012-05-17 1 views
5

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

Скажем, я выдаю запрос GET для ввода нового пользователя в мою базу данных по адресу site.com/adduser/<userid>. Кто-то может перенаселить мою базу данных, выпустив поддельные запросы.

+0

уточните ваш вопрос, пожалуйста .... –

+4

[Вы не должны использовать GET для любых целей, кроме поиска данных.] (Http://tools.ietf.org/html/rfc2616#section-9.1.1) – Gumbo

+0

Это просто проще использовать пример GET, я бы, вероятно, использовал POST. – Peteris

ответ

5

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

+0

Я боялся, что это будет так. Если у кого-то есть какие-либо обфускационные трюки, чтобы предложить, я все уши. – Peteris

0

Он работает как любая другая веб-страница: авторизация входа в систему, проверьте реферер.

+0

Не могли бы вы пояснить ? Вы говорите, что серверное приложение будет знать, кто выдает запрос, и что он может распознать только запросы AJAX? – Peteris

+0

См. Http://stackoverflow.com/questions/7127686/blocking-non-ajax-requests-to-php Аутентификация сеанса зависит от вас. Вы можете предоставить клиенту ключ, который передается с каждым запросом. –

+0

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

1

Prevent Direct Access To File Called By ajax Function, похоже, вопрос.

Вы можете (среди других решений, я уверен) ...

  • управление использование сессии (войти создать сеанс);
  • отправьте уникальный ключ клиенту, который должен быть возвращен до истечения срока его действия (не может быть повторно использован и не может быть сохранен для использования позднее);
  • и/или установить заголовки как в связанном ответе.

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

1

Это ту же проблему, что и CSRF - и решение одинаковое: используйте токен в запросе AJAX, который вы предварительно сохранили в eslewhere (или можете регенерировать, например, путем шифрования параметров с помощью идентификатора sessin в качестве ключа). Chriss Shiflett имеет некоторые разумные примечания по этому вопросу, и есть OWASP project для обнаружения CSRF с PHP

+1

Это не та же проблема, что и CSRF. В CSRF это проблема с идентификацией, но я беспокоюсь, что пользователь сам может злоупотреблять своими учетными данными для входа, свой собственный токен сеанса и использовать свою собственную учетную запись для искусственного заполнения базы данных. – Peteris

+0

Учитывая, что невозможно ограничить доступ к серверу только вашими API-интерфейсами ajax, это точно так же, как CSRF – symcbean

+0

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

0

Решение добавляет жирную строку в запросы ajax. Также вы должны посмотреть на базовую аутентификацию, это не будет единственным защитником. Вы можете поймать доходы с этим кодом со страницы АЯКС

Ajax Позвоните

function callit() 
{ 
if(window.XMLHttpRequest){xmlhttp=new XMLHttpRequest();}else{xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");} 
xmlhttp.onreadystatechange=function(){if(xmlhttp.readyState==4&&xmlhttp.status==200){document.getElementById('alp').innerHTML=xmlhttp.responseText;}} 
xmlhttp.open("get", "call.asp", true); 
**xmlhttp.setRequestHeader("X-Requested-With","XMLHttpRequest");** 
xmlhttp.send(); 
} 

PHP/ASP запрошенной страницы Ответ

ASP

If Request.ServerVariables("HTTP_X-Requested-With") = "XMLHttpRequest" Then 
'Do stuff 
Else 
'Kill it 
End If 

PHP

if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')) 
{ 
//Do stuff 
} else { 
//Kill it 
} 
+1

Спасибо за внимание, но это только проверка заголовка, как упомянули другие. Это недостаточно безопасно, так как пользователь может подделать заголовок. – Peteris

2

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

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

+1

Это лучшее объяснение, которое я видел по разным повторяющимся вопросам. Вы должны добавить его в http://stackoverflow.com/questions/1756591/prevent-direct-access-to-file-called-by-ajax-function, который является самым старым обманом этого вопроса. – IMSoP

+0

Вы правы, @IMSoP, в ответах этого потока есть много некомпетентности. Я немного адаптировал свой ответ, потому что то, что действительно нужно OP, должно было указываться в направлении аутентификации. – Enno

1

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

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

3

Этого можно достичь.
Всякий раз, когда вы создаете страницу, которая должна сделать такой запрос. Создайте случайный токен и сохраните его в сеансе (для аутентифицированного пользователя) или в базе данных (если этот запрос разрешен публично).
и вместо вызова site.com/adduser/<userid> вызов site.com/adduser/<userid>/<token>
всякий раз, когда вы получаете такой запрос, если маркер является действительным или нет (от сеанса или базы данных)
В случае лексемы является правильным, процесс запроса и удалить используемый маркер из сессии/дб
Если маркер неверен, отклоните запрос.