Как запретить кому-либо отправлять запрос на мой веб-сервис - PullRequest
2 голосов
/ 27 июля 2010

У меня есть приложение на C #, которое сериализует объект в xml в поток http на мой сервер. На сервере есть некоторый php, который выполняет хранимую процедуру в mysql с данными xml в качестве единственного параметра.

Проблема в том, что кто-то может очень легко просто отправить XML-файл того же формата с большим количеством записей, что разрушит базу данных дерьмовыми данными. Какие у меня есть варианты, чтобы этого не случилось?

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

Ответы [ 4 ]

2 голосов
/ 27 июля 2010

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

1 голос
/ 27 июля 2010

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

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

1 голос
/ 27 июля 2010

Вы должны использовать некоторую форму аутентификации и авторизации. В сервисах на основе SOAP есть расширение WS-Security . Вот еще одна статья на MSDN , которая объясняет, как это работает. Однако я понятия не имею, что такое поддержка этих стандартов на стороне PHP. Если вы используете какой-то собственный протокол, вы можете просто потребовать, чтобы имя пользователя / пароль были отправлены вместе с запросом и проверены на стороне сервера.

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

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

Это гарантирует, что:

  • Выход из системы делает недействительным ключ аутентификации
  • Имя пользователя и пароль не отправляются в виде открытого текста для запросов веб-службы

Это не гарантирует, что:

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

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

...