#javascript #jquery #ajax #json #wcf
#javascript #jquery #ajax #json #wcf
Вопрос:
У меня есть WCF
служба, вызываемая $.ajax({ url: 'service.svc?a=1', dataType: "JSONP", ...})
на одной из страниц mysite.com
(100% клиентский стек). Я хочу ограничить использование службы mysite.com только для пользователей, возможно ли это сделать, и если да, то как?
Единственная идея, которая у меня есть на данный момент, — это ввести параметр ‘via’, который поможет мне понять, через какой www был получен доступ к моей службе.
PS Я действительно изо всех сил пытаюсь придумать хорошее название, пожалуйста, заполните его, чтобы изменить его!
Комментарии:
1. Я думаю, что вам нужен токен CSRF, который вы генерируете и проверяете на сервере. Эта ссылка может вам помочь — owasp.org/index.php /…
2. большое спасибо за это. Очень интересно.
3. взгляните на это сообщение в блоге blog.clauskonrad.net/2010/04 / … посмотрите, действительно ли это то, чего вы хотите
4. Интересно, но у меня нет такого понятия, как «известный клиент», любой клиент, посещающий веб-сайт, имеет право вызывать службу. Я не уверен, смогут ли люди устанавливать сертификаты только для доступа к моему веб-сайту. в любом случае интересно.
Ответ №1:
Мы разработали веб-инструмент, и мы используем данные через службу WCF, но мы не используем напрямую службу WCF, потому что это служба REST, и мы не внедрили какую-либо защиту в службе. итак, вызовите службу по-другому.
1) мы создали разные, но необходимые файлы обработчиков в том же проекте
2) Этот файл-обработчик вызывает нашу службу WCF
3) Поскольку наш инструмент основан на Сети, поэтому мы проверяем идентификатор сеанса при вызове обработчика
4) Если идентификатор сеанса совпадает, мы передаем данные, иначе мы показываем сообщение об истечении срока действия сеанса
Пожалуйста, дайте мне знать, если вам все еще неясна эта концепция.
Комментарии:
1. Другой способ — через IIS вы можете разрешить только свой сайт (mysite.com ) IP-адрес хост-сервера. Таким образом, если запрос поступает с другого IP-адреса, ваш IIS блокирует запрос
2. Но в вопросе говорится о 100% клиентском коде, поэтому блокировка / внесение в белый список по IP бесполезно.
3. Кроме того, любой злоумышленник может просто получить токен сеанса из вашего приложения, посетив страницу один раз, а затем использовать токен для вызова обработчика, когда захочет (и загрузить новый токен сеанса).
Ответ №2:
Предполагая, что вы не хотите заставлять своих посетителей сначала входить в систему / аутентифицироваться: вы не можете.
Чтобы иметь возможность ограничить использование определенной группой пользователей (в вашем случае посетителей mysite.com ), пользователи должны отправить что-то (ключ, пароль, токен) в ваш сервис, чтобы идентифицировать себя. Если вы сохраните этот токен в своем клиентском приложении (например, javascript), люди могут просто извлечь токен и использовать его любым удобным для них способом. Так что это невозможно. Вы также не можете доверять никаким данным, отправляемым браузером (например, через param), потому что их всегда можно подделать с помощью простых инструментов. Это практически все варианты, которые у вас есть.
Реальный вопрос в том, зачем вам защищать этот контент, если он уже общедоступен через сам веб-сайт? Можно было бы легко создать простой скребок для получения вашего контента, если бы захотели.
Комментарии:
1. основная и единственная причина, по которой я не хочу предотвращать удаление данных. формат, в котором данные отображаются пользователям (canvas, элементы управления jquery без состояния и т. Д.), Потребует довольно больших усилий для «обратного проектирования» исходных данных, В то время как прямой вызов службы предоставит им данные бесплатно. На данный момент лучше всего использовать обработчики ashx, но прежде я просто хотел убедиться, что лучшего варианта нет.
2. Да, конечно, если вы просто возвращаете половину отображаемой страницы, вы не предоставляете «необработанные» данные api. Но вопрос заключался в том, можно ли защитить ваш API данных, чего вы не можете из-за материала, упомянутого в моем ответе.
Ответ №3:
Если вы размещаете свое приложение в IIS, вы можете просто добавить к себе web.config:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, POST" />
</customHeaders>
</httpProtocol>
</system.webServer>
Для Access-Control-Allow-Origin вы можете задать свой адрес приложения: Access-Control-Allow-Origin: http://domain1.com , http://domain2.com
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="http://domain1.com" />
<add name="Access-Control-Allow-Methods" value="GET, POST" />
</customHeaders>
</httpProtocol>
</system.webServer>
Вы также можете достичь цели, написав поведение, которое добавляет определенный заголовок к каждому сообщению. Вот руководство: http://blogs.msdn.com/b/carlosfigueira/archive/2012/05/15/implementing-cors-support-in-wcf.aspx
Существует постоянная CorsConstants .Вместо Origin вы можете установить свой домен.
Чтобы проверить, имеет ли ответ требуемый заголовок, вы можете использовать fiddler.
Комментарии:
1. Ничто не мешает вредоносным клиентам подделывать это, это просто используется хорошими, безопасными браузерами / клиентами. Это ничего не защищает.
2. @Dhaval Patel Мне это действительно нравится. Я все равно попробую.
3. @user3455395 как я уже сказал, это ничего не защищает! Прочитайте: nczonline.net/blog/2010/05/25 /. … Исходный заголовок может быть установлен на что угодно с помощью таких инструментов, как curl и т. Д. CORS (как называется это «решение») — это просто метод, позволяющий выполнять междоменные вызовы AJAX. Не для защиты вашего контента!
Ответ №4:
Вы можете аутентифицировать пользователя и генерировать одноразовый токен со скользящим временем истечения срока действия.Поместите этот токен в базу данных с аутентифицированным пользователем, а затем отправляйте этот токен с каждым запросом на обслуживание для авторизации пользователя.
Ответ №5:
Хотя вы не можете создать 100% пуленепробиваемое решение в принципе, если не внедряете учетные записи модерируемых пользователей, вот подход, который я использовал, чтобы помешать горячей ссылке на моем сервере. И дело не в ссылках.
Мой сервер реализует ETag
заголовки и 304 Not Modified
заголовки для определенных файлов, которых в противном случае было бы достаточно с временным кэшем. Это делается для экономии пропускной способности и по-прежнему позволяет видеть, к чему был получен доступ. Затем маршрут пользователя к цели отслеживается на стороне сервера. Если этапы выполнены, пользователю предоставляется credit
доступ к дорогостоящему ресурсу. Кредиты могут добавляться, так что одновременный доступ будет работать. Помимо этого, я также устанавливаю файлы cookie в браузере пользователя во время маршрута и тестирую их позже. Поддельные клиенты, как известно, плохо разбираются в файлах cookie, если они вообще их знают.
Помните, идеального решения не существует, но я считаю, что если вы это реализуете, ваш сервер не будет перегружен. Я должен знать, 99% моих запросов украдены, эта фильтрация работает!