Proteja os comportamentos do servidor ColdFusion do Dreamweaver 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
- Assistente Inserir registro do comportamento do servidor e Registrar formulário de inserção
- Assistente Registrar atualização e Registrar formulário de atualização
- Excluir o registro do comportamento do servidor
- Logon do usuário para o comportamento do servidor
- Verificar o novo usuário para o comportamento do servidor
- Conjunto de páginas principais e de detalhe
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.
Logon do usuário para o comportamento do servidor
Para corrigir o código de Logon 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 principais e de detalhe
Para o objeto do aplicativo Conjunto de páginas principais 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 principal, nenhuma alteração deve ser feita na Página principal. Se você tiver um conjunto de registros filtrado na Página principal, 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:
- Aprimorar a segurança com cfqueryparam
- Boletim de segurança da Adobe:APSB 06-07 - Vulnerabilidade de injeção SQL para comportamento do servidor Dreamweaver