Запланированные задачи ColdFusion — как защититься при использовании <cflogin>?
-
16-09-2019 - |
Вопрос
У меня есть веб-сайт, написанный на 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.
Надеюсь, поможет!