Problema:
Um ataque SQL Injection por um hacker malicioso pode causar estragos em um banco de dados e expôr informações confidenciais. Uma simples declaração tal como:
SELECT * FROM tbl_user WHERE userId = #URL.userId#
poderia ser facilmente alterada para:
SELECT * FROM tbl_user WHERE userId = 1;DROP TABLE tbl_user
Isso equivale a um fracasso de proporções Titanic, perdendo apenas para a perda do Flamengo num jogo Fla-Flu! (nota do tradutor)
Solução:
ColdFusion oferece um par de soluções muito simples para previnir que isso aconteça. A primeira é definir o SQL permitido no datasource e usar a tag <cfqueryparam> em todas as suas queries!
Explicação detalhada:
Definindo o SQL permitido em um datasource (fonte de dados):
Quando um novo datasource é configurado, por padrão, o ColdFusion definie o SQL permitido para SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, GRANT, REVOKE e Stored Procedures. Quando definirmos um datasource, o SQL permitido deverá conter apenas o que é necessário para a aplicação. Se a aplicação não usar DROP ou GRANT, eles devem ser desligado.
O SQL permitido é acessado via tela Advanced Settings na configuração do datasource.
Usando a tag <cfqueryparam>:
A tag <cfqueryparam> tem múltiplos usos, ela verifica o tipo do parâmetro passado e para databases que usam variáveis de vínculo permanente (bind), permite ao ColdFusion vincular essas variáveis, o que aumenta a performance. Verificando o tipo de dado tambem previne ataques de SQL Injection. O boletim de segurança da Adobe sôbre esta matéria está aqui: http://www.adobe.com/devnet/security/security_zone/asb99-04.html
Para usar a tag <cfqueryparam> simplesmente adicione-a à sua query:
<cfquery datasource="#request.dsn#" name="qGetUserByUserId"> SELECT * FROM tbl_user WHERE userId = <cfqueryparam value="#URL.userId#" cfsqltype="cf_sql_integer" /> </cfquery>
Agora, se o valor da variável URL não fôr um inteiro, como deveria ser, o ColdFusion emitirá um erro. Esta é uma rápida e fácil correção e deve ser colocada em todas as queries.