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

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

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

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

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

Ответ 1

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

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

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

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

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

Возможно, было бы полезно прочитать старую колонку Ben Forta и a недавняя публикация Brad Wood для получения дополнительной информации о преимуществах использования <cfqueryparam>.

Ответ 2

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

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

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

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

Ответ 3

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) не намного больше, чем "нулевая операция" по значению - превращение его в результат функции, чтобы обойти автоматическое экранирование.

Ответ 4

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

Я хотел бы добавить, однако, что есть несколько различных инструментов, предназначенных для ColdFusion, которые могут упростить многие общие задачи SQL, которые вы, вероятно, будете выполнять. Там очень легкий инструмент, называемый DataMgr, написанный Стивом Брайантом, а также Transfer от Mark Mandel, 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-инъекции.)