Запланированные задачи ColdFusion — как защититься при использовании <cflogin>?

StackOverflow https://stackoverflow.com/questions/1675085

Вопрос

У меня есть веб-сайт, написанный на ColdFusion, который содержит как обычные интерактивные веб-страницы, так и некоторые задачи, выполняемые через планировщик CF.Макет каталога

/
/app
/scheduledTasks

Я бы хотел, чтобы задачи могли использовать все те же настройки и т. д.созданный в файле application.cfc внутри /app, поэтому я хотел бы переместить весь каталог /scheduledTasks в /app.Проблема в том, что application.cfc использует механизм cflogin и мою собственную форму входа.Планировщик CF позволяет указать имя пользователя и пароль только для базовой аутентификации HTTP.Запланированные задачи никогда не пройдут мимо этого.Как я могу решить эту проблему или есть ли лучший подход для начала?

Я задавался вопросом о том, чтобы просмотреть некоторые переменные CGI в OnRequestStart моего приложения.cfc, такие как пользовательский агент, удаленный IP-адрес и/или магическое значение в параметрах URL-адреса, и, если все они есть, обойти безопасность, поскольку я «знаю», что это Планировщик CF на другом конце.Это не очень хорошая безопасность, но это может быть приемлемо.

Я также задавался вопросом о создании нового файла application.cfc в моем корне, от которого наследуется файл application.cfc в /app.Я бы оставил задачи там, где они есть, и поместил бы туда новый файл application.cfc, который наследует общие элементы от корня.Однако это увеличивает сложность, и у меня возникли проблемы при попытке получить доступ к CFC внутри /app/cfcs из /scheduledTasks.

Кто-нибудь имел подобную проблему и решил ее?

Это было полезно?

Решение

оставьте задачи расписания в отдельной папке, как будто она сейчас находится в корне сайта.

создайте файл application.cfc в папке Scheduletasks, который расширяет файл в каталоге приложений, например:

<cfcomponent extends="/.apps/application">

перегрузите метод onrequeststart и введите аутентификацию следующим образом:

<cffunction name="onRequestStart" returntype="void" access="public" output="false">
    <cfargument name="targetPage" type="any" required="true">
    <cfif not structkeyexists(url, "access") or not url.access eq application.ApplicationName>
        <cflocation url="/" addtoken="false">
    </cfif>
</cffunction>

это ОЧЕНЬ базовая безопасность, но она выполнит свою работу.настроить по своему вкусу.

Другие советы

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

Запланированные задачи ColdFusion передают определенные данные в информации CGI, включая:

HTTP_USER_AGENT=CFSHEDULE

Теперь HTTP_USER_AGENT можно подделать, поэтому следующий вопрос — определить, насколько безопасным вам нужен доступ к папке.Вы хотите, чтобы эти задачи выполнял только CF?Или вы хотите запускать их и извне?Только твой компьютер?И т. д.Как только это будет определено, вы можете написать для него код, и решение rip747 будет хорошим, поэтому я не собираюсь предлагать что-либо еще!;)

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

В файле application.cfc, методе onApplicationStart добавьте что-то вроде:

<!--- List of Directories Excluded from Login --->
<cfset application.ExcludedLoginDirs = "/monitoring/registration/wservices/">   

Затем в вашем onSessionStart (или любом другом методе, который вы используете, чтобы предотвратить несанкционированный доступ и перенаправить для входа в систему:

<!--- Find current directory --->
<cfset currentDir = listgetAt("-," & cgi.Script_Name, listLen("-," & cgi.script_Name, "/")-1, "/")>

<!--- Exclude LOGIN if user authenticated or Directory Excluded --->
<!--- In this code, I FORCE login if user is NOT autenticated AND directory is NOT excluded --->
<cfif Val(session.User_ID) EQ 0 AND ListFind(application.ExcludedLoginDirs, "#currDir#", "/") EQ 0> 
      ............Login..........
</cfif>

и т. д.......

Некоторые преимущества этого метода:1. Если вызывающее программное обеспечение не реализует файлы cookie и не поддерживает состояние сеанса, оно работает.2.если вызывающее программное обеспечение ДЕЙСТВИТЕЛЬНО поддерживает сеанс, доступ предоставляется к защищенным страницам, передавая cfid и cftoken в URL-адресе вызова.3.если очень гибко и не требует обслуживания, кроме добавления в конечном итоге нового каталога и УНИЧТОЖЕНИЯ ПРИЛОЖЕНИЯ... (я использую

<cfif isDefined("url.destroyApp")>
     <cfset reinit = this.onApplicationStart()>
</cfif> 

в методе onRequestStart и

<cfset StructClear(application)>

в качестве моей первой строки в методе onApplicationStart.

Надеюсь, поможет!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top