Как защитить веб-службы ColdFusion CFC?

Я нахожусь в процессе создания простой веб-службы для нашего клиента, который хочет иметь возможность получать информацию о корзине покупок и добавлять/обновлять элементы в корзине. Я написал CFC с удаленным методом для каждого. Теперь, очевидно, когда эти методы CFC установлены на access="remote", весь мир может вызывать их как есть. Однако мне нужно включить безопасность, чтобы гарантировать, что единственными людьми, которые могут вызывать эти методы удаленно (не с моего веб-сайта), являются те, кому я дал разрешение. И я не хочу, чтобы это было навязчиво (принуждение входа в систему и т. д.).

Например, веб-службы существуют на http://www.mywebsite.com, и я хочу разрешать запросы только от http://www.yoursite1.com и http://www.yoursite2.com. Использование HTTP_REFER не годится, так как его можно подделать. Как я могу это сделать? Можно ли использовать самозаверяющий сертификат, чтобы как-то проверить, разрешен ли запрос?

ПРИМЕЧАНИЕ. Я также хотел бы иметь возможность использовать эти веб-службы для вызовов с нашего собственного веб-сайта, поэтому мне потребуется решение, которое работает для обоих сценариев.


person Eric Belair    schedule 11.11.2011    source источник
comment
Когда вы говорите о запросах с вашего сайта1 и вашего сайта2, вы имеете в виду, что веб-службы будут вызываться сервером, на котором запущены эти сайты, или посетителями этих сайтов?   -  person Jake Feasel    schedule 12.11.2011
comment
Посетители веб-сайтов поставщиков будут инициировать вызовы наших веб-служб. Например, когда они нажимают «Добавить товар в корзину», он вызывает веб-службу, которая отправляет комбинацию товара/количества в веб-службу, которая сохраняет значения в базе данных для этого пользователя.   -  person Eric Belair    schedule 12.11.2011


Ответы (4)


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

person Peruz Carlsen    schedule 11.11.2011

Я думаю, что вам лучше всего будет настроить прокси-сервер на клиентских сайтах. Скорее всего, вам это понадобится в любом случае, поскольку в противном случае пользователи этих сайтов будут поражены ограничениями междоменного доступа (запросы ajax обычно разрешены только для домена исходно запрошенной страницы).

Например, у вас есть веб-сервис: https://www.mywebsite.com/myService.cfc?wsdl

На каждом из клиентских сайтов будет еще один веб-сервис, примерно такой:

http://www.yoursite1.com/myServiceProxy.cfc?wsdl

myServiceProxy.cfc будет выглядеть примерно так:

<cfcomponent>
<cffunction name="getData" access="remote" returnType="struct">
    <cfargument name="myArg1"><!--- whatever is needed for your service --->
    <cfset var ret = {}>
    <cfset var secretKey = "MySuperSecretSharedKey">
    <cfif IsDefined("session.validUser")><!--- whatever is needed to validate remote user --->

    <cfinvoke 
      webservice="https://www.mywebsite.com/myService.cfc?wsdl" 
      method="getData" 
      returnVariable="ret"> 

       <cfinvokeargument name="secretKey" value="#secretKey#">
       <cfinvokeargument name="myArg1" value="#arguments.myArg1#"><!--- etc.... --->

    </cfinvoke>

    </cfif>
    <cfreturn ret>
</cffunction>
</cfcomponent>

Как вы можете видеть из этого примера, прокси-код сможет проверить, является ли пользователь действительным, на основе сеанса или чего-то еще необходимого. Затем, поскольку этот прокси-код был настроен с использованием секретного ключа, его можно передать обратно в вашу реальную службу. Используя этот секретный ключ, вы можете убедиться, что вызывающая сторона вашей службы действительна (также обратите внимание на HTTPS — определенно хорошая идея здесь). Это должно быть так!

person Jake Feasel    schedule 11.11.2011

Вы можете добавить дополнительную логику входа в Application.cfc в той же папке CFC. Вы можете использовать базовую аутентификацию HTTP через HTTPS, если хотите. Используйте <cflogin>, чтобы получить имя пользователя и пароль.

person Henry    schedule 12.11.2011

<cfhttp method="get" url="http://api.bitly.com/v3/shorten?login=xxxxxxxxxx&apiKey=xxxxxxxxxxxxx&longUrl=http://www.xxxxxxxxxxxxx.com&format=xml" result="returnObject">

Переменные, которые немного нужны:

  • Логин (логин)
  • apiKey (секретный ключ)
  • longurl (URL будет сокращен)
  • формат (формат возврата)

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

person n_kips    schedule 16.04.2012