Как я могу защитить веб-сервисы ColdFusion CFC? - PullRequest
5 голосов
/ 12 ноября 2011

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

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

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

Ответы [ 4 ]

1 голос
/ 16 апреля 2012
<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, который будетукороченный)
  • формат (возвращаемый формат)

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

1 голос
/ 12 ноября 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 - здесь определенно хорошая идея). Это должно быть!

1 голос
/ 12 ноября 2011

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

1 голос
/ 12 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...