Как защитить функции access=remote в CFC от шпионов?

Одной из замечательных особенностей CFC является возможность повторного использования кода как для обычной страницы .cfm, так и для приложений Flex.

Одно из таких приложений, которое я разработал, использует Flex для построения графиков и требует доступа к функции «getResults()» в файле cfc.

Весь этот контент находится за механизмом аутентификации, но так как cfc откроет себя для запроса wsdl:

https://myserver.com/c/functions.cfc?wsdl

и фактически вернет результаты в браузер, если URL-запрос создан правильно:

https://myserver.com/c/functions.cfc?method=getResults&Term=2009&Course=Anatomy

Какие методы люди использовали для защиты cfc от прямого доступа, ЕСЛИ ТОЛЬКО запрос не поступает непосредственно от процессора CFML ИЛИ от Flex Remoting?


person Chris Brandt    schedule 22.05.2009    source источник


Ответы (6)


Вы можете использовать некоторые переменные области видимости CGI, чтобы проверить, откуда поступает запрос.

то есть: CGI.REMOTE_HOST, CGI.REMOTE_ADDR

Таким образом, вы, вероятно, создадите новую функцию со свойством access="public", которая проверяет значения этих переменных по списку допустимых значений для вашего сервера. Если он возвращает true, вы выполняете запрос, а если он возвращает false, вы выдаете/возвращаете какую-то ошибку.

person Jason    schedule 22.05.2009
comment
Вы также, вероятно, могли бы защитить запрос какими-то учетными данными, чтобы добавить еще одну тонкую стену раздражения. - person Jas Panesar; 23.05.2009
comment
Я думаю, что это правильный путь. Я использую CGI.SCRIPT_NAME, чтобы проверить, обращается ли браузер напрямую к CFC. Если они есть, они получают ботинок. - person Chris Brandt; 26.05.2009

Я бы предложил добавить обработчик OnRequestStart в ваш файл application.cfc и выполнить там проверку... что это за проверка, зависит от вашей текущей модели, но некоторые хорошие предложения заключаются в том, чтобы проверить cgi.remote_user (если он аутентифицирован) или, возможно, сохранить что-то в области сеанса?

<cfif structKeyExists(session,"empID") and len(session.empid)>
  <!--- user is authenticated, process normally --->
<cfelse>
  <!--- abort request or sending meaningful error message --->
</cfif>
person Goyuix    schedule 23.05.2009
comment
Я предполагаю, что я также пытаюсь защитить конкретный cfc от манипулирования кем-то, кто уже аутентифицирован/авторизован - person Chris Brandt; 26.05.2009

Как насчет использования нового атрибута ролей? Каждый, кто посещает ваш сайт, автоматически получает cflogin roles="public".

person Phillip Senn    schedule 28.05.2009

Я предпочитаю иметь только один аргумент для каждого метода — либо XML, либо Struct — и требовать, чтобы определенное имя узла/объекта присутствовало в этом XML или Struct.

<cfif NOT StructKeyExists(arguments.myArgs, "requiredParam")>
    <cfxml name="myXML">
         <error>
             <message>Required parameter not found.</message>
         </error>
    </cfxml>

    <cfreturn myXML />
</cfif>

person Eric Belair    schedule 26.05.2009

Хотя я немного устарел, я откопал заметки Билла Перселла о безопасности приложений CF в целом. Обеспечение CFC упомянули.

http://www.bpurcell.org/blog/index.cfm?mode=entry&entry=978

person Jas Panesar    schedule 22.05.2009

Просто наткнулся на этот вопрос, когда искал что-то еще, и подумал, что добавлю свой 2p:

У меня есть приложение, использующее удаленный CFC, которое я хочу сделать доступным только для зарегистрированных пользователей с правами администратора. В этом случае проверка переменных CGI все равно пройдет для гостевых пользователей приложения.

Когда пользователь-администратор входит в систему, я беру хэш его идентификатора сеанса и времени входа в систему и сохраняю его в базе данных и в области сеанса. Когда я обращаюсь к удаленному CFC, я передаю хэш как переменную и проверяю его по базе данных пользователей-администраторов.

Если запись возвращается, я знаю, что текущий пользователь — администратор, и продолжаю выполнять запрос.

person Gary Stanton    schedule 20.06.2012