Na semana passada fiz um site para outra pessoa e acidentalmente descobri que havia muitas lacunas em meu trabalho. Em apenas 20 segundos, usei injeção de SQL para consertar. Então verifiquei algumas informações sobre injeção de sql e obtive alguns insights, espero poder compartilhá-las com os novatos. Os especialistas estão rindo!
A ideia geral do ataque de injeção SQL:
Descubra locais de injeção de SQL;
Determine o tipo de servidor e o tipo de banco de dados em segundo plano;
Para determinar a executabilidade
, alguns invasores geralmente usam injeção de SQL. A seguir, também falarei sobre meus próprios insights sobre o método de injeção de SQL.
Método de injeção:
Em teoria, a página de autenticação seria assim:
Selecione * de admin onde nome de usuário='XXX' e senha='YYY' instrução, se a filtragem de caracteres necessária não for executada antes de executar oficialmente esta instrução, é fácil implementar a injeção de SQL.
Por exemplo, digite na caixa de texto do nome de usuário: abc' ou 1=1-- Digite na caixa de senha: 123, então a instrução SQL se torna:
selecione * de admin onde nome de usuário='abc' ou 1=1 e senha='123' Não importa qual nome de usuário e senha o usuário insira, esta instrução sempre será executada corretamente e o usuário pode facilmente enganar o sistema e obter uma lei legal identidade.
Adivinhe a solução:
A ideia básica é: adivinhar todos os nomes de banco de dados, adivinhar todos os nomes de tabelas no banco de dados, analisar os nomes das tabelas que podem armazenar nomes de usuários e senhas, adivinhar todos os nomes de campos da tabela, adivinhar todos os registros no conteúdo da tabela.
Também existe uma maneira de obter o nome do seu banco de dados e o nome de cada tabela.
Basta obter o nome do banco de dados e o nome da tabela relatando um erro no formato: http://www .cn/news?id=10'!
Para jsp, geralmente adotamos as seguintes estratégias para lidar com isso:
1.Declaração Preparada
Se você já é um desenvolvedor moderadamente avançado, você deve sempre usar PreparedStatement em vez de Statement.
Aqui estão alguns motivos
1. Legibilidade e manutenção do código.
2. PreparedStatement melhora o desempenho tanto quanto possível.
3. O ponto mais importante é que a segurança melhorou bastante.
Até agora, algumas pessoas (inclusive eu) nem conhecem a sintaxe SQL básica e maligna.
String sql = "select * from tb_name where name= '"+varname+"' e passwd='"+varpasswd+"'";
'
1] como nome A senha é arbitrária, vamos ver como será?
senha = 'casual';
Como '1'='1' é definitivamente verdadeiro, pode passar em qualquer verificação.
Passe ['; drop table tb_name ] como varpasswd, então:
select * from tb_name = 'any' e passwd = ''; drop table tb_name;
E se você usar instruções pré-compiladas, qualquer conteúdo transmitido não terá nenhuma relação de correspondência com as instruções originais (a premissa é que o próprio banco de dados suporta pré-compilação, mas pode não haver bancos de dados do lado do servidor que não suportem compilação. existem apenas alguns bancos de dados de desktop, ou seja, aqueles com acesso direto a arquivos. Contanto que todos usem instruções pré-compiladas, você não precisará fazer nenhuma filtragem nos dados recebidos. Se você usar instruções comuns, poderá ter que gastar. muito tempo perdido,;, etc. Julgamento planejado e pensamento excessivo.
2. Expressões regulares
2.1 Expressão regular para detectar metacaracteres SQL/(%27)|(')|(--)|(%23)|(#)/ix.
2.2 Corrija a expressão regular para detectar metacaracteres SQL /((%3D)|(=))[^n]*((%27)|(')|(--) 54ne. com
|(%3B)|(:))/i
2.3 Expressão regular típica de ataque de injeção SQL/w*((%27)|('))((%6F)|o|(%4F))((%72)|r |(. Aliança de gerenciamento de rede da China www.bitscn.com
%52))/ix
2.4. Detectar injeção de SQL, expressão regular da palavra-chave de consulta UNION /((%27)|('))union/ix(%27)|(') - single
Aspas e sua união hexadecimal equivalente - a palavra-chave union.
2.5. Expressão regular/exec(s|+)+(s|x)pw+/ix para detectar ataques de injeção de SQL no MS SQL Server
3. Filtragem de strings
public static String filterContent(Conteúdo da string){
String flt="'|and|exec|insert|select|delete|update|count|*|%
|chr|mid|master|truncar|char|declare|; |ou|-|+|,";
Stringfilter[] = flt.split("|");
for(int i=0; i {
content.replace(filtro[i], "");
}
devolver conteúdo;
}
4. Mascaramento de caracteres inseguros
Esta parte usa js para bloquear, que desempenha um papel muito pequeno. Embora o método de bloqueio de palavras-chave tenha um certo efeito, em aplicativos reais, essas palavras-chave SQL também podem se tornar palavras-chave de consulta reais e, então, serão bloqueadas por você. o usuário não poderá usá-lo normalmente. Basta colocar algum esforço nos padrões de codificação.
Quando houver variáveis no SQL executado, basta usar PreparedStatement fornecido pelo JDBC (ou outra camada de persistência de dados). Lembre-se de não usar o método de emenda de strings.
Introdução à função: Verifique se contém "'"," \","/ "
Descrição do parâmetro: A string a ser verificada Valor de retorno: 0: Sim 1: Não Nome da função Sim
verificação de função (a)
{
retornar 1;
fibdn = new Array ("'" ," \","/ ");
i=fibdn.comprimento;
j=a.comprimento;
para (ii=0; ii { para (jj=0; jj
{ temp1=a.charAt(jj);
temp2=fibdn[ii];
if (tem'; p1==temp2)
{retorno 0;
}
}
retornar 1
;