2011-01-13 1 views
0

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

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

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

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

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

+1

Будет ли у HTTP-рефери эта информация? –

+0

Да, возможно, это то, что я ищу. Может ли это значение быть фальшивым? Как и в случае, вы можете отправить запрос Ajax и перезаписать это значение с именем моего домена – user574040

ответ

0

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

+0

Несомненно, это просто усложнило бы перепроектировать, но не невозможно? Если кто-то еще взял весь код JavaScript, который они могут сделать, он может включить его на свой сайт, а затем включить аутентифицированные значения. – user574040

+0

@ user574040, да, но значение токена будет генерироваться сервером.И сервер будет использовать этот токен только для аутентифицированных пользователей на этом сайте. Таким образом, без сервера javascript бесполезен. –

+0

Но как бы вы аутентифицировали использование, прежде чем отправлять им токен? – user574040

0

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

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

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

+0

Итак, если я использую значения, которые входят в состав HTTP, я могу сказать, что они исходят из правильного источника. Но люди могут обманывать или подделывать эти значения, но устанавливая их вручную, прежде чем они сделают запрос. Если бы я только проверил эту проверку, люди, которые отменили проектирование кода, возможно, не смогут определить, какую проверку я делаю на сервере. Я опасаюсь использовать что-то вроде MAC, потому что я уверен, что первое, что произойдет, когда я разоблачу это, это то, что он будет реконструирован. – user574040

0

Вы можете использовать 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> 

observer.php

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

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

http://localhost/talker.php 
+0

Java попросили, а не PHP – celwell