Proteja os comportamentos do servidor ColdFusion dos ataques de injeção SQL.

Risco de segurança de ataques de injeção SQL

Alguns bancos de dados permitem enviar múltiplas instruções SQL em uma única consulta. Devido a isso, existem possíveis riscos de segurança quando você passa parâmetros em uma sequência de caracteres da consulta para uma consulta de banco de dados gerada de forma dinâmica. Os invasores podem tentar alterar o URL ou variáveis de formulário em uma consulta dinâmica adicionando instruções SQL mal-intencionados aos parâmetros existentes. Isso é geralmente conhecido como ataque de injeção SQL. Parte do código do comportamento do servidor criado pelo Dreamweaver deve ser modificado para reduzir o risco de ataques de injeção SQL. Para obter mais informações relevantes sobre a injeção SQL, consulte este artigo da Wikipédia.

Observação: o problema descrito neste artigo foi corrigido no Dreamweaver 8.0.2 Updater.

Solução: atualize os comportamentos do servidor

Quando você deixar que uma sequência de caracteres de consulta passe um parâmetro, certifique-se de que somente as informações esperadas sejam passadas. A Adobe criou o Dreamweaver 8.0.2 Updater que reduz o risco de ataques de injeção SQL. Essas correções estão incorporadas em todas as versões subsequentes do Dreamweaver. Após atualizar Dreamweaver 8, você precisará reaplicar os comportamentos do servidor às páginas que os usam e, a seguir, reimplementar essas páginas em seu servidor.

O restante deste documento descreve como editar manualmente o código do Dreamweaver MX 2004 para evitar ataques de injeção SQL com o modelo do servidor ColdFusion. Os comportamentos do servidor que estão vulneráveis a esses ataques estão listados abaixo, junto com as correções:

Conjunto de registros com um filtro

Os conjuntos de registros não filtrados não precisam ser modificados, mas os conjuntos de registros filtrados sim precisam. No exemplo abaixo, um conjunto de registros do Dreamweaver MX 2004 denominado “Recordset1” é filtrado por um valor de ID passado dentro de um parâmetro de URL. O código destacado abaixo é o que precisa ser alterado:

<cfquery name="Recordset1" datasource="cafetownsend"> SELECT * FROM COMMENTS WHERE COMMENT_ID =#URL.COMMENT_ID#</cfquery>

Para proteger o conjunto de registros de ataques de injeção SQL, use o tag cfqueryparam dentro do tag cfquery que contém a instrução SQL SELECT. O tag cfqueryparam verificará o tipo de dados do parâmetro de consulta e ajudará a tornar seguro seus bancos de dados contra usuários não autorizados. A linha em amarelo é o código seguro modificado:

<cfquery name="Recordset1" datasource="cafetownsend"> SELECT * FROM COMMENTS WHERE COMMENT_ID =<cfqueryparam value="#URL.COMMENT_ID#" cfsqltype="cf_sql_numeric"></cfquery>

Assistente Inserir registro do comportamento do servidor e Registrar formulário de inserção

Para proteger o conjunto de registros de ataques de injeção SQL, use o tag cfqueryparam dentro do tag cfquery que contém a instrução SQL SELECT. O tag cfqueryparam verificará o tipo de dados do parâmetro de consulta e ajudará a tornar seguro seus bancos de dados contra usuários não autorizados.

Código original. O código destacado abaixo é o que precisa ser alterado:

<cfquery datasource="cafetownsend">   INSERT INTO COMMENTS (FIRST_NAME, LAST_NAME, TELEPHONE)   VALUES (<cfif IsDefined("FORM.textfield1") AND #FORM.textfield1# NEQ "">'#FORM.textfield1#'<cfelse>NULL</cfif>   ,<cfif IsDefined("FORM.textfield2") AND #FORM.textfield2# NEQ "">'#FORM.textfield2#'<cfelse>NULL</cfif>   ,<cfif IsDefined("FORM.textfield3") AND #FORM.textfield3# NEQ "">'#FORM.textfield3#'<cfelse>NULL</cfif>   )</cfquery>

Código seguro modificado:

<cfquery datasource="cafetownsend">   INSERT INTO COMMENTS (FIRST_NAME, LAST_NAME, TELEPHONE)   VALUES<cfif IsDefined("FORM.textfield1") AND #FORM.textfield1# NEQ ""><cfqueryparam value="#FORM.textfield1#" cfsqltype="cf_sql_clob" maxlength="50"><cfelse>''</cfif>   ,<cfif IsDefined("FORM.textfield2") AND #FORM.textfield2# NEQ ""><cfqueryparam value="#FORM.textfield2#" cfsqltype="cf_sql_clob" maxlength="50"><cfelse>''</cfif>   ,<cfif IsDefined("FORM.textfield3") AND #FORM.textfield3# NEQ ""><cfqueryparam value="#FORM.textfield3#" cfsqltype="cf_sql_clob" maxlength="20"><cfelse>''</cfif>   )</cfquery>

Observação: escolha os valores apropriados do cfslqtype e maxlength para seus dados.

Assistente Registrar atualização e Registrar formulário de atualização

Assistente Inserir registro do comportamento do servidor e Registrar formulário de inserção requer uma combinação das correções acima. Primeiro, procure o cfquery que contém a instrução SQL SELECT e modifique-o como descrito no Conjunto de registros com um filtro. A seguir, procure o cfquery que contém a instrução SQL UPDATE e modifique-o como descrito em Assistente Inserir registro do comportamento do servidor e Registrar formulário de inserção.

Excluir o registro do comportamento do servidor

A modificação de Excluir o registro do comportamento do servidor é semelhante à do Conjunto de registros com um filtro.

Código original:

<cfquery datasource="cafetownsend">    DELETE FROM COMMENTS    WHERE COMMENT_ID=#URL.COMMENT_ID#</cfquery>

Código seguro modificado:

<cfquery datasource="cafetownsend">   DELETE FROM COMMENTS   WHERE COMMENT_ID=<cfqueryparam value="#URL.COMMENT_ID#" cfsqltype="cf_sql_numeric"></cfquery>

Observação: escolha os valores apropriados do cfslqtype e maxlength para seus dados.

Login do usuário para o comportamento do servidor

Para corrigir o código de Login do usuário para o comportamento do servidor, procure pelos tags cfquery e adicione tags cfqueryparam.

Código original:

<cfquery name="MM_rsUser" datasource="cafetownsend">   SELECT FIRST_NAME,LAST_NAME FROM COMMENTS WHERE FIRST_NAME='#FORM.textfield1#'   AND LAST_NAME='#FORM.textfield2#'</cfquery>

Código seguro modificado:

<cfquery name="MM_rsUser" datasource="cafetownsend">   SELECT FIRST_NAME,LAST_NAME FROM COMMENTS WHERE FIRST_NAME=<cfqueryparam value="#FORM.textfield1#" cfsqltype="cf_sql_clob" maxlength="50">   AND LAST_NAME=<cfqueryparam value="#FORM.textfield2#" cfsqltype="cf_sql_clob" maxlength="50"></cfquery>

Observação: escolha os valores apropriados do cfslqtype e maxlength para seus dados.

Verificar o novo usuário para o comportamento do servidor

Verificar o novo usuário para o comportamento do servidor requer que Inserir registro do comportamento do servidor seja primeiro adicionado à página. Primeiro, procure o cfquery que contém a instrução SQL SELECT e modifique-o como descrito no Conjunto de registros com um filtro. A seguir, procure o cfquery que contém a instrução SQL INSERT e modifique-o como descrito em Assistente Inserir registro do comportamento do servidor e Registrar formulário de inserção.

Conjunto de páginas mestre e de detalhe

Para o objeto do aplicativo Conjunto de páginas mestre e de detalhe, as alterações são principalmente no conjunto de registros que o Dreamweaver cria para a Página detalhada. Se você não tiver um conjunto de registros filtrado na Página mestre, nenhuma alteração deve ser feita na Página mestre. Se você tiver um conjunto de registros filtrado na Página mestre, consulte o Conjunto de registros com um filtro para atualizar o código do conjunto de registros.

Primeiro, procure o cfquery que contém a instrução SQL SELECT e modifique-o como descrito no Conjunto de registros com um filtro.

Informações adicionais

A Adobe recomenda que você use o tag cfqueryparam dentro de cada tag cfquery ara ajudar a tornar seguro seus bancos de dados contra usuários não autorizados. Para obter mais informações, consulte:

Esta obra está licenciada sob uma licença não adaptada da Creative Commons Attribution-Noncommercial-Share Alike 3.0  As publicações do Twitter™ e do Facebook não são cobertas pelos termos do Creative Commons.

Avisos legais   |   Política de privacidade online