Блокировать междоменные вызовы веб-службы asp.net .asmx
Вопрос
Я создал приложение, которое использует jQuery и JSON для использования веб-сервиса ASP.NET .asmx для выполнения операций crud.Приложение и .asmx находятся в одном домене.Я не возражаю против того, чтобы люди удаленно выполняли операции чтения .asmx, но не хочу, чтобы люди случайным образом удаляли материал!!!
Я могу разделить методы, которые я хотел бы сделать общедоступными, и "скрытые" методы на 2 веб-сервиса.Как я могу заблокировать вызовы "скрытой" веб-службы.asmx в том же домене, в котором она размещена?
Заранее благодарю.
Редактировать: Может ли кто-нибудь прокомментировать это, кажется правдоподобным ( источник: http://www.slideshare.net/simon/web-security-horror-stories-presentation ):Ajax может устанавливать Http-заголовки, обычные формы - нет.Ajax-запросы должны быть из одного и того же домена.
Таким образом, запросы "x-requested-with" "XMLHttpRequest" должны быть из того же домена.
Решение
Есть два сценария, которые необходимо обеспечить с помощью веб-служб:
- Аутентифицирован ли пользователь?
- Происходит ли действие с моей страницы?
Часть аутентификации уже обработана, если вы используете проверку подлинности с помощью форм.Если ваш веб-сервис находится в области сайта, защищенной от проверки подлинности Forms, никто не сможет получить доступ к вашим веб-сервисам, пока они не войдут в систему.
Второй сценарий - это немного более сложная история.Атака известна как CSRF или XSRF (Подделка межсайтовых запросов).Это означает, что вредоносный веб-сайт выполняет действия от имени вашего пользователя, пока он еще входит в систему на вашем сайте. Вот отличная статья о XSRF.
Джефф Этвуд как бы подводит итог всему этому по ссылке выше, но вот защита XSRF в четыре этапа:
- Запишите GUID в файл cookie вашего пользователя.
- Перед вызовом AJAX считайте это значение из файла cookie и добавьте его в сообщение веб-службы.
- На стороне сервера сравните значение ФОРМЫ со значением файла cookie.
- Поскольку сайты не могут считывать файлы cookie с другого домена, вы в безопасности.
Другие советы
В AJAX вызовы выполняет браузер, поэтому, даже если бы вы проверили, что домен тот же, это было бы недостаточно безопасно, потому что его можно легко подделать.
Вам нужно использовать какие-то токены аутентификации (желательно с тайм-аутом), чтобы обеспечить безопасность.
Быстрым и грязным решением было бы использовать ограничения IP-адресов, чтобы разрешить доступ только к IP-адресу вашего домена через IIS.
Вероятно, лучше было бы использовать HTTP-аутентификацию.Я нашел много способов сделать это Аутентификация в ASP.NET Веб-сервисах полезный обзор.