Являются ли ColdFusion CFC очень безопасными при удаленном доступе? - PullRequest
5 голосов
/ 19 августа 2011

Я использую ColdFusion 9 и jQuery.

Я новичок в использовании CFC ColdFusion через CFAJAXPROXY. Мне любопытно, находится ли моя база данных в опасности, и как я могу легко исправить дыры в безопасности.

Я положил это вверху страницы:

<cfajaxproxy cfc="brands" jsclassname="jsApp">

Вот CFC, который используется после некоторых входов в систему:

<!--- ADD BRAND  --->
<cffunction name="addBrand" access="remote">
    <cfargument name="SiteID" required="true">
    <cfargument name="Brand" required="true">
    <cfscript>
        LOCAL.SiteID = ARGUMENTS.SiteID;
        LOCAL.Brand = trim(left(ARGUMENTS.Brand, 50));
    </cfscript>
    <cfquery name="GetBrands">
        INSERT INTO Brands(SiteID, Brand)
        VALUES      (<cfqueryparam cfsqltype="cf_sql_integer" value="#LOCAL.SiteID#">,
                    <cfqueryparam cfsqltype="cf_sql_varchar" value="#LOCAL.Brand#">)
    </cfquery>
    <cfreturn true>
</cffunction>

Вот jQuery, который отправит данные в CFC

$("#AddBrand").click(function() {
    NewBrand = $("#NewBrand").attr("value");
    var jro = new jsApp();
    jro.addBrand(NewBrand);
});

Итак, здесь есть большая дыра в безопасности? Следует ли использовать access = "remote" только для получения данных?

Ответы [ 4 ]

5 голосов
/ 19 августа 2011

Нет, access = 'remote' не нужно использовать только для извлечения данных, но его нужно использовать осторожно и с пониманием последствий для безопасности.

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

Теперь я собираюсь предположить, что вы не включили слово «легко» в свой вопрос, и я вместо этого добавлю слово «практически». Когда дело доходит до безопасности, здесь редко бывает «легко».

Так что есть несколько способов защитить эти методы. Многое зависит от того, как вы хотите это сделать и что вы уже делаете.

  1. Если вы используете <cflogin>, вы можете добавить roles="<Your Admin role name>" к функции. Я никогда не пробовал это, но я подозреваю, что это сработает. (Лично мне этот метод не нравится по нескольким причинам, но это вариант)

  2. Вы можете поместить некоторый код авторизации вверху функции.

<cfif NOT mySecurityCFC.isAuthorized(COOKIE.CFID,COOKIE.CFTOKEN)><cfreturn /></cfif>

Мне тоже не нравится этот метод.

  1. Вы можете использовать новый onCFCRequest() метод App.cfc в ColdFusion 9 для перехвата запросов и выполнения их через процедуру авторизации. Это чище, чем вариант 2. Я бы сказал, что это самый простой вариант, и он будет работать эффективно, но лично мне больше нравится вариант 4.

  2. В проекте ColdSpring есть несколько отличных инструментов для автоматического создания и работы с удаленными прокси-объектами, которые могут также включать защиту посредством Аспектно-ориентированного программирования (AOP). Комбинация удаленных прокси и AOP чрезвычайно мощна и может позволить вам создавать удаленные методы, не подвергая действительным базовым объектам, и перехватывать и авторизовать каждый запрос к этим методам без необходимости вставлять код в каждый метод. На самом деле сами методы даже не знают, что их защищают.

Я бы выбрал вариант 4. Это может звучать как пугающий и чрезвычайно высокоуровневый процесс, и в некотором смысле это так, но на самом деле это намного проще, чем вы думаете, реализовать. Шаги описаны в кратком руководстве ColdSpring. http://www.coldspringframework.org/index.cfm/go/documentation

3 голосов
/ 19 августа 2011

Вот один из способов защиты удаленно доступных ХФУ от вызова «неавторизованными» приложениями.

Используйте verifyClient() или атрибут cffunction verifyClient="true"

Метод verifyClient() и атрибут verifyClient гарантируют, что в вызывающий запрос включен зашифрованный токен безопасностикоторый Coldfusion сгенерировал для вашего приложения.Этот маркер безопасности неявно передается вместе с вашими данными, когда вы звоните в CFC, используя <cfajaxproxy>.Если этот токен не был включен в запрос, Coldfusion выдаст исключение.

<cffunction name="myMethod" access="remote">

    <!--- Prevent requests that have not originated from this application --->
    <cfset verifyClient() >

    ...

</cffunction>

<!-- Or --->

<cffunction name="myMethod" access="remote" verifyClient="true">

    ...

<cffunction>

** Railo 3.2.x не поддерживает метод verifyClient().Вы должны будете подражать поведению самостоятельно, если хотите.

3 голосов
/ 19 августа 2011

Если вы проверяете, что кто-то вошел в ваш файл Application.cfc, тогда это нормально. Запрос AJAX, как и любой другой запрос, сначала проходит через Application.cfc.

Вы можете проверить это, поместив прерывание в onRequestStart () и увидев, что ничего не вставлено. Вероятно, он потерпит молчание и не будет самым элегантным решением, но оно будет работать.

3 голосов
/ 19 августа 2011

Хорошо ... имейте в виду, что если у вас есть метод, который доступен удаленно ... любой может вызвать его.Не только ваш код AJAX.Сервер CF не знает , поступают ли запросы от вашего прокси-сервера AJAX или они поступают от кого-то другого, просто совершающего удаленный вызов.

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

Что вам действительно нужно сделать, это поставить какой-тоаутентификации и авторизации на месте, поэтому только санкционированные запросы могут выполнять удаленные вызовы.Попросите пользователя каким-либо образом установить сеанс (например, вход в систему) и принимать только удаленные запросы от авторизованных сеансов.

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