1. O que é injeção SQL? A chamada injeção SQL consiste em inserir comandos SQL no formulário do formulário para enviar ou inserir a string de consulta do nome de domínio ou da solicitação da página, e finalmente enganar o servidor para executar alguns comandos SQL maliciosos. Ao submeter parâmetros para construir instruções SQL inteligentes, você pode obter com sucesso os dados desejados.
2. SQL tipo de injeção Especificamente, a injeção SQL pode ser dividida em cinco categorias, a saber: injeção de números, injeção de caracteres, injeção de busca (como se fosse), injeção e injeção de conexão de frase. Do ponto de vista da aplicação, atenção especial deve ser dada à injeção de SQL em IP, busca, exclusão em lote e transferência de banco de dados para banco de dados.
3. Como injetar
Vamos ver um exemplo típico
SqlCommand cmd = new SqlCommand("SELECT * FROM PE_USERS WHERE UserName = '" 2+ Nome de Usuário + "' E Senha de Usuário = '" + PalavraPassaPalavra + "'", conn); Como não há validação para Nome de Usuário e PalavraSenha, se NomeUsuário="admin' OU 1=1--" A instrução SQL executada se torna:
SELECIONE * DE PE_USERS ONDE UserName='admin' OU 1=1—' E UserPassword='' Isso resulta em injeção de SQL, e as condições são sempre verdadeiras, então você pode fazer login com sucesso sem uma senha.
4. Como prevenir a injeção SQL
1. Filtrar ou converter cadeias suspeitas
A injeção SQL é evitada escrevendo funções que filtram ou convertem strings perigosas, e então usam GLOBAL.ASAX ou reescrevem instâncias de contexto
Aqui está um exemplo
bool estático público SqlFilter2(string InText) 2 { 3 string word="and|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|join"; 4 se(InText==null) 5 retorna falso; 6 foreach (string i na palavra. Split('|')) 7 { 8 if((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ParaLower(). IndexOf(" "+i)>-1)) 9 { 10 retornam verdadeiro; 11 } 12 } 13 retornam falso; 14 }
2. Global.asax
Protected void Application_BeginRequest(Object sender, EventArgs e) 2 { 3 // Percorrendo os parâmetros do Post, exceto para domínios ocultos 4 forach (string i nisso). Solicitação.Formulário) 5 { 6 se(i=="__VIEWSTATE")continue; 7 isso.vaErr(isso). Request.Form.ParaString()); 8 } 9 // Atravessar o parâmetro Get. 10 de forach (string i nisso). Request.QueryString) 11 { 12 isso.goErr(isto. Request.QueryString.ParaString()); 13 } 14 } void privado goErr(string tm) 2 { 3 se(WLCW). Estenda.CValididade.SqlFilter2(tm)) 4 isso. Response.end() 5 } Prós: Esse aspecto é usado pela maioria dos programadores iniciantes para evitar a injeção de SQL, e parece funcionar bem para evitar a injeção na maioria dos casos.
Desvantagens: 1. Filtra alguns caracteres que não foram originalmente usados para injeção, causando problemas inesperados. Por exemplo, se o nome de um membro do fórum contiver os mesmos caracteres dos caracteres filtrados, isso causará alguns problemas e problemas inesperados.
2. É necessário filtragem ou conversão toda vez, o que reduz a eficiência do programa
2. Uso de procedimentos armazenados para consultas paramétricas
O principal objetivo da injeção SQL é executar comandos maliciosos no banco de dados submetendo código SQL malicioso. Portanto, desde que os comandos SQL sejam processados antes da execução, a injeção SQL pode ser efetivamente evitada. Consultas parametrizadas podem efetivamente impedir a injeção SQL.
Exemplo
const string strSql = "SELECT * FROM [PE_Users] WHERE UserName = @UserName"; Parâmetros parms = novos Parâmetros("@UserName", DbType.String, Nome do Usuário); Existe um parâmetro @UserName acima, usando o objeto Prarmeter, através do qual o parâmetro é adicionado ao objeto Comando, Isso te dá uma consulta parametrizada. Como descrito acima, ADO.NET envia a seguinte instrução SQL para o SQL Server:
Exec sp_executesql N 'select * de [pe_users] onde username=@username ',N '@username nvarchar(20) ',@username=N 'nome' O SQL Server substitui @username pela string "name" antes de executar a consulta. Suponha que você tenha as seguintes entradas:
'união select @@version,null,null— A instrução SQL gerada é assim:
Exec sp_executesql N 'select * de [pe_users] onde username=@username ',N '@username nvarchar(20) ',@username=N ''' união selecionar @@version,null,null--' Você pode ver que ADO.NET escapa da entrada.
- public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
Copiar código
DbTye ou SqlDbType podem ser uma variedade de tipos de dados. Você pode escolher com base no seu tipo de dado. Em alguns lugares, também pode ser usado para especificar o comprimento do parâmetro: int size. Isso também evita efetivamente os excessos de banco de dados e as notas SQL Possibilidade de participar. Prós: Efetivamente impede a injeção de SQL. Desvantagens: Alguns lugares não podem ser aplicados, como em.
3. Lista branca
Descrição: Alguns intervalos de parâmetros conhecidos podem ser tratados na forma de listas brancas, o que pode impedir injeção e consulta SQL Errado, por exemplo: ordem por + nome da coluna, quando o nome da coluna é passado na forma de um parâmetro, uma lista branca pode ser formulada para julgar o parâmetro primeiro se o número está na lista branca, e depois consultar, caso contrário será processado incorretamente. Vantagens: seguro e confiável Desvantagens: Pequena variedade de aplicações |