Получить домен, из которого поступает запрос Ajax - PullRequest
0 голосов
/ 13 января 2011

У меня есть набор веб-службы JSONP, созданный в моем приложении J2EE, который будет использоваться веб-сайтом в другом домене. Веб-сервисы были созданы с использованием структуры Джерси.

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

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

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

Или кто-нибудь знает другой способ сделать это?

Ответы [ 3 ]

0 голосов
/ 13 января 2011

Ваши сервисы RESTful размещаются на веб-сервере, и с помощью REST вы ограничены стандартными компонентами HTTP. Например, вы можете получить IP-адрес хоста, который отправил запрос, но помните, что это может быть подделано.

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

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

0 голосов
/ 04 мая 2012

Вы можете использовать HTTP_REFERER, как уже упоминалось

Пример кода: talker.php

<html>
    <head>
    <title>HTTP Referer example</title>
    <script language="javascript" type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    </head>
    <body>
    <div class="result"></div>
    <script type="text/javascript">
        $(document).ready(function () {
            $.ajax({
                url: 'observer.php',
                success: function(data) {
                    $('.result').html(data);
                }
            });
        });
    </script>
    </body>
</html>

наблюдатель.php

<?php
    echo $_SERVER['HTTP_REFERER'];
?>

Результат выглядит следующим образом:

http://localhost/talker.php
0 голосов
/ 13 января 2011

Один из способов достижения этого - аутентификация пользователей в удаленном домене, который должен отправить запрос.Так, например, сервер в удаленном домене может выдавать какое-то зашифрованное значение аутентифицированным пользователям.Затем при отправке запроса JSONP вы отправляете этот токен веб-службе, которая расшифровывает его.Идея состоит в том, что оба сервера должны иметь общий секретный ключ для шифрования / дешифрования этого токена.Таким образом, вы можете убедиться, что запрос пришел с другого сервера.

...