ColdFusion добавляет дополнительные кавычки при построении запросов к базе данных в строках

Я кодирую в ColdFusion, но стараюсь оставаться в cfscript, поэтому у меня есть функция, которая позволяет мне передать запрос для его запуска с <cfquery blah > #query# </cfquery>

Однако каким-то образом, когда я создаю свои запросы с помощью sql = "SELECT * FROM a WHERE b='#c#'" и передаю их, ColdFusion заменил одинарные кавычки двумя одинарными кавычками. поэтому в конечном запросе он становится WHERE b=''c''.

Я пробовал создавать строки разными способами, но не могу заставить его оставить только одну кавычку. Даже замена строки не дает никакого эффекта.

Любая идея, почему это происходит? Это разрушает мои надежды жить в cfscript на время этого проекта.


person Community    schedule 05.11.2008    source источник


Ответы (4)


ColdFusion по своей природе избегает одинарных кавычек при интерполяции переменных внутри тегов <cfquery>.

Чтобы сделать то, что вы хотите, вам нужно использовать функцию PreserveSingleQuotes(). .

<cfquery ...>#PreserveSingleQuotes(query)#</cfquery>

Однако это не устраняет опасность SQL-инъекции, которой вы подвергаете себя.

Использование <cfqueryparam> также позволяет вашей базе данных кэшировать запрос, который в большинстве случаев улучшит производительность.

Может быть полезно прочитать старую колонку Бена Форта и недавний пост Брэда Вуда для получения дополнительной информации о преимуществах использования <cfqueryparam>.

person ale    schedule 05.11.2008

Ответ на ваш вопрос, как уже говорили другие, использует preserveSingleQuotes(...)

Однако решение, которое вам действительно нужно, состоит в том, чтобы не динамически создавать запросы таким образом. Это Плохо Плохо Плохо.

Поместите свой SQL внутри тегов cfquery с любыми ifs/switches/и т. д., если это необходимо, и убедитесь, что все переменные CF используют тег cfqueryparam.

(Обратите внимание: если вы используете переменные в предложении ORDER BY, вам нужно будет вручную экранировать любые переменные; cfqueryparam нельзя использовать в предложениях ORDER BY)

person Peter Boughton    schedule 05.11.2008

ColdFusion автоматически экранирует одинарные кавычки в тегах <cfquery> при использовании следующего синтаксиса:

SELECT * FROM TABLE WHERE Foo='#Foo#'

Если вы хотите сохранить одинарные кавычки в #Foo#, вы должны вызвать #PreserveSingleQuotes(Foo)#.

Имейте в виду, что автоматическое экранирование работает только для значений переменных, а не для результатов функции.

SELECT * FROM TABLE WHERE Foo='#LCase(Foo)#' /* Single quotes are retained! */

В связи с этим функция PreserveSingleQuotes() (см. Adobe LiveDocs) не гораздо больше, чем «нулевая операция» над значением - превращение его в результат функции для обхода автоматического экранирования.

person Tomalak    schedule 05.11.2008

Я проголосовал за ответ Дэйва, так как думал, что он хорошо поработал.

Однако я хотел бы добавить, что существует также несколько различных инструментов, разработанных для ColdFusion, которые могут упростить многие общие задачи SQL, которые вы, вероятно, будете выполнять. Существует очень легкий инструмент под названием DataMgr, написанный Стивом Брайантом, а также Передача от Марка Манделя, Reactor, который изначально был создан Дугом Хьюзом, а я разработал его под названием DataFaucet. Каждый из них имеет свои сильные и слабые стороны. Лично я думаю, что вы склонны рассматривать DataFaucet как тот, который даст вам наилучшую возможность оставаться в cfscript с различными синтаксисами для построения различных типов запросов.

Вот несколько примеров:

qry = datasource.select_avg_price_as_avgprice_from_products(); //(requires CF8)

qry = datasource.select("avg(price) as avgprice","products"); 

qry = datasource.getSelect("avg(price) as  avgprice","products").filter("categoryid",url.categoryid).execute();

qry = datasource.getSelect(table="products",orderby="productname").filter("categoryid",url.categoryid).execute();


Платформа гарантирует, что cfqueryparam всегда используется с этими фильтрующими операторами для предотвращения атак с внедрением SQL-запросов, и существуют аналогичные синтаксис для операторов вставки, обновления и удаления. (Существует несколько простых правил, позволяющих избежать sql-внедрения.)

person Isaac Dealey    schedule 05.01.2009