WCF / ASP.NET - защищен от злоупотреблений, таких как DOS - PullRequest
0 голосов
/ 20 января 2011

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

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

Если метод Ping() просто вызывается во время OnLoad веб-страницы формы, существует вероятность атак DOS, например, через скрипт, который постоянно отправляет HTTP-запросы GET на страницу.

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

Один из вариантов, который я рассмотрел, заключается в том, чтобы предоставить пользователям доступ к кнопке, которая позволяет им проверять доступность службы и активировать форму за один раз. Это будет по крайней мере баланс между двумя. Я прошу ваш вклад в идеи о том, как лучше сбалансировать этот подход. Любые ответы на основе asp.net, c # или javascript / ajax хороши.

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

Спасибо за помощь и вклад заранее!

ОБНОВЛЕНИЕ 1:

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

ОБНОВЛЕНИЕ 2:

  • Метод Ping() в настоящее время является методом c # на стороне сервера, а не javascript.
  • Общедоступная служба WCF ограничена IP-адресами, чтобы разрешать запросы только от публичного веб-сервера

Ответы [ 3 ]

3 голосов
/ 20 января 2011

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

Примерно так в jQuery. Это предполагает, что Ping() возвращает true, если служба работает, false в противном случае:

$('#myformid').submit(function() {
  var svcUp = Ping();

  if(!svcUp)
      alert("Sorry, there was an error submitting, please try again.");

  return svcUp;
});

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

К счастью, в WCF есть несколько полезных настроек для управления троттлингом, посмотрите MaxConcurrentCalls , MaxConcurrentInstances и MaxConcurrentSessions

1 голос
/ 20 января 2011

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

1 голос
/ 20 января 2011

На стороне клиента действительно нет хорошего решения для предотвращения атаки DOS - я могу создать скрипт, используя ваш метод Ping js, который будет вызывать его миллион раз в цикле.Вы можете предотвратить это на стороне сервера, отслеживая количество вызовов в секунду с одного и того же идентификатора ip / session / user / otherclient-side.Если количество вызовов в секунду превышает какой-либо разумный предел, вы временно блокируете этого клиента.

Вы можете посмотреть http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx - прокрутите вниз до «Предотвратить атаку отказа в обслуживании (DOS)» для примера

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