ColdFusion adicionando cotações extras ao construir consultas de database em strings

Eu estou codificando no ColdFusion, mas tentando ficar no cfscript, então eu tenho uma function que me permite passar em uma consulta para executá-lo com #query#

De alguma maneira, quando eu construo minhas consultas com sql = "SELECT * FROM a WHERE b='#c#'" e o transmito, o ColdFusion substituiu as aspas simples por 2 aspas simples. então, torna-se WHERE b=''c'' na consulta final.

Eu tentei criar as strings de várias maneiras diferentes, mas não consigo deixar apenas uma citação. Mesmo fazer uma substituição de string não tem efeito.

Alguma ideia do porquê isso está acontecendo? Está arruinando minhas esperanças de viver em cfscript durante este projeto

O ColdFusion, por design, escapa de aspas simples quando interpola variables ​​dentro de tags .

Para fazer o que você quer, você precisa usar a function PreserveSingleQuotes() .

 #PreserveSingleQuotes(query)# 

Isso não resolve, no entanto, o perigo de injeção de SQL ao qual você está se expondo.

O uso do também permite que seu database em cache a consulta, o que na maioria dos casos melhorará o desempenho.

Pode ser útil ler uma coluna antiga do Ben Forta e um post recente de Brad Wood para obter mais informações sobre os benefícios de usar o .

A resposta à sua pergunta, como outros disseram, está usando preserveSingleQuotes(...)

No entanto, a solução que você realmente deseja não é construir dinamicamente suas consultas dessa maneira. É ruim ruim.

Coloque seu SQL dentro das tags cfquery, com quaisquer ifs / switches / etc, conforme apropriado, e assegure-se de que todas as variables ​​CF usem a tag cfqueryparam .

(Note, se você usar variables ​​na cláusula ORDER BY, você precisará escaping manualmente de qualquer variável; cfqueryparam não pode ser usado em cláusulas ORDER BY)

O ColdFusion escapa automaticamente de aspas simples em tags quando você usa a seguinte syntax:

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

Caso você queira preservar aspas simples em #Foo# você deve chamar #PreserveSingleQuotes(Foo)# .

Esteja ciente de que o escape automático funciona apenas para valores de variables, não para resultados de funções.

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

Desse modo, a function PreserveSingleQuotes() (consulte o Adobe LiveDocs ) não é muito mais do que uma “operação nula” no valor – transformando-o em um resultado de function para ignorar o escape automático.

Eu votei a resposta de Dave desde que eu pensei que ele fez um bom trabalho.

No entanto, gostaria de acrescentar que existem várias ferramentas diferentes projetadas para o ColdFusion que podem simplificar muitas das tarefas comuns de SQL que você provavelmente executará. Existe uma ferramenta muito leve chamada DataMgr, escrita por Steve Bryant, bem como a transferência de Mark Mandel, Reactor , que foi originalmente criada por Doug Hughes e uma que desenvolvi chamada DataFaucet . Cada um deles tem seus pontos fortes e fracos. Pessoalmente, acho que você está apto a considerar o DataFaucet como aquele que lhe dará a melhor capacidade de permanecer no cfscript, com uma variedade de syntaxs para construir diferentes tipos de consultas.

Aqui estão alguns exemplos:

 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(); 

A estrutura garante que o cfqueryparam seja sempre usado com essas instruções de filtro para evitar ataques de injeção de SQL, e existem syntaxs semelhantes para instruções de inserção, atualização e exclusão. (Existem algumas regras simples para evitar a injeção de SQL ).