В духе моих других вопросов, касающихся "распространенных ошибок программирования... которых следует избегать"
Каких ошибок программисту ColdFusion следует избегать?
В духе моих других вопросов, касающихся "распространенных ошибок программирования... которых следует избегать"
Каких ошибок программисту ColdFusion следует избегать?
установить <cffile>
путь загрузки в доступный через Интернет каталог с поддержкой CF!!!
isStruct()
перед isObject()
в серии <cfif>
, ожидающих isStruct, ловит только struct (компонент cfc также возвращает True из isStruct())
нет HtmlEditFormat()
при отображении пользовательского контента (XSS)
забыл добавить output=false для методов CFC
не используя <cfqueryparam>
внутри <cfquery>
не охватывая не столь очевидные переменные, такие как имя cfquery или индекс цикла в методе
используйте <cfform>
, когда все, что им нужно, это простой ванильный HTML <form>
забыл UrlEncodedFormat()
пользовательский URL
использовать <cffeed>
без очистки содержимого
слишком доверяйте isDate()
(любое число вернет true)
ожидать, что сравнение строк будет чувствительным к регистру (операторы IS и EQ не чувствительны к регистру)
отправка строк «да» или «нет» в SerializeJSON()
без добавления пробела для сохранения строки (иначе SerializeJSON()
или DeserializeJSON()
преобразует их в «истина» и «ложь»)
не помещая службы singletons в область приложения
слепо создавайте столько CFC, сколько хотите, как в JAVA
помещение сложного значения/объекта в список (не может, список - это просто строка значений, разделенных запятыми)
написание функций, которые принимают массив в качестве аргумента и изменяют этот массив, ожидая, что этот массив будет изменен (массив в CFML передается по значению)
слепо изменяет access="remote"
в методе и ожидает, что он сработает (когда удаленный прокси обычно более уместен)
используйте много WriteOutput() в cfscript, когда CFML более подходит
слепо использует IsDefined()
, когда StructKeyExists()
обычно может делать это более эффективно
слепо использует Iif()
и De()
, не зная, что они такие же неприятные, как Evaluate()
обновите некоторый код в onApplicationStart() и не увидите разницы при обновлении (перезапустите приложение!)
<cfloop>
или '' за пределами <cfquery>
, что приводит к открытию нескольких новых соединений запроса. В 99% случаев лучше иметь несколько операторов внутри одного cfquery для выполнения нескольких действий или для объединения данных вместе.
абсолютный путь жесткого кодирования, когда ExpandPath()
обычно лучше
забыл включить поддержку Unicode в DSN (Unicode становится '????')
не обновляться до последней версии JRE и исправлений
неправильное использование области клиента и взорвать реестр Windows...
использует устаревшие/устаревшие функции/функции (т. е. флэш-форму, также известную как flex 1.x alpha, cftable, полнотекстовый поиск Verity и т. д.)
передача CFCATCH
функции в качестве аргумента типа Struct
(CFCATCH
ведет себя как Struct
, но это не так. Просто передайте его как тип 'Any
').
Не читать Лучшие практики CFC из вики ColdBox.
покупка в духе .ASP(X), .JSP или [вставьте веб-технологию] всегда лучше.. ;)
не использовать PrecisionEvaluate()
и получать всевозможные ошибки округления с плавающей запятой, особенно при расчете денег.
HTMLEditFormat()
. (Одна из причин распространенности XSS-уязвимостей заключается в том, что имена escape-функций HTML повсюду такие подробные: htmlspecialchars()
, Server.HTMLEncode()
, как хотите. Обычно я создаю функцию-оболочку для HTMLEditFormat()
и называю ее h()
, что очень удобно. оболочка для URLEncodedFormat с именем u()
.)
- person Tomalak; 28.07.2009
Неуместное использование #
ВЫБРАТЬ *
Не очищать ввод URL/форм
Отладка в производственной среде (даже если вывод подавлен)
Бессовестное воровство форматирования Генри...
Атаки путем внедрения кода SQL. Похоже, что cfquery просто создан для их разрешения. Поэтому вам следует использовать cfqueryparams.
В Coldfusion все переменные по умолчанию являются глобальными, если только они не объявлены с ключевым словом var
. (Несколько похоже на ситуацию в Javascript.)
Таким образом, вы либо должны помнить var
каждую переменную, используемую в функции, включая такие вещи, как имена, которые используются в cfquery
name
, либо вы можете просто использовать этот прием:
<cffunction name="MyFunction">
<cfset var Local = StructNew()>
<!--- Now anything Local. is automatically local --->
<cfset Local.x = 42>
<!--- Including cfquery name="" --->
<cfquery name="Local.Customers" datasource="some_datasource">
SELECT C.ID, C.Name
FROM Customers C
</cfquery>
</cffunction>
В имени Local
нет ничего волшебного, это просто условность. Хотя Coldfusion 9 добавит явный локальный область действия, поэтому, если вы используете Local
, это, вероятно, облегчит обновление до CF9, когда придет время.
Обратите внимание, что для CFC ситуация немного отличается: в CFC область variables
("область действия по умолчанию") не является глобальной, как для обычных функций, а скорее существует для каждого экземпляра CFC. Таким образом, хотя забывание использовать var
не так опасно в CFC, как в функции верхнего уровня, наилучшей практикой по-прежнему является постоянное использование var
.
Неспособность предотвратить отображение пользователями ошибок coldfusion.
Добавьте метод onError в Application.cfc верхнего уровня, чтобы пользователи не могли видеть все эти подробные сообщения дампа, раскрывающие вашу внутреннюю работу (и сбои).
<cffunction name="onError" returntype="void" output="true">
<cfargument name="exception" type="any" required="true" />
<cfargument name="eventname" type="string" required="true" />
varscoper также является отличным инструментом для автоматизации проверки упущений области видимости переменных в компонентах.
http://varscoper.riaforge.org/
Чрезмерное использование «запроса запроса». То есть дальнейшая фильтрация или сортировка результатов запроса с помощью тега cfquery.
Этот тип работы часто лучше выполняется самой базой данных, особенно если набор данных большой.
Одной из самых больших ошибок будет неиспользование cfqueryparam.
Очень плохой:
SELECT UserName
FROM Customers
WHERE CustomerID = #URL.custid#
Очень хороший:
SELECT UserName
FROM Customers
WHERE CustomerID = <cfqueryparam value="#URL.custid#" cfsqltype="cf_sql_integer">`
Эта ошибка будет стоить вам веб-сайта.
Помещение переменных в неправильную область видимости; даже если вы не взорвете реестр и не сломаете сервер, легко будет медленно снижать производительность вашего приложения, поднимая переменные до самой высокой области, в которой, по вашему мнению, они могут вам понадобиться, или потерять информацию, потому что вы сохранили ее в одной области и пытался получить к ним доступ в другой области.
Использование cfcatch
без захвата и/или передачи некоторой информации об ошибке, чтобы ее можно было найти и исправить. (Трудно найти ошибку, которая не сообщает вам, что она произошла.)
Использование listcontains()
, когда вы хотите listfind()
. Особенно, если в списке есть цифры. listfind()
соответствует только целому элементу в списке; listcontains()
соответствует части элемента. (Да, однажды мы сделали эту ошибку.)
С правами администратора: