O ataque de injeção SQL refere -se a explorar vulnerabilidades de design, executando comandos SQL em servidores de destino e outros ataques.
A principal razão pela qual o ataque de injeção do SQL é bem -sucedido ao gerar dinamicamente os comandos SQL.
por exemplo:
Se a sua instrução de consulta for selecionada * do admin, onde o nome de usuário = '"& usuário &"' e senha = '"& pwd &"' ""
Então, se meu nome de usuário é: 1 'ou' 1 '=' 1
Então, sua declaração de consulta se tornará:
Selecione * FROM admin Where UserName = '1 ou' 1 '=' 1 'e senha =' "& PWD &" '"
Dessa forma, sua declaração de consulta será aprovada e você poderá inserir sua interface de gerenciamento.
Portanto, ao impedir, você precisa verificar a entrada do usuário. Personagens especiais especiais, como citações únicas, citações duplas, semicolons, vírgulas, colonos, conexões etc., são convertidos ou filtrados.
Os personagens e cordas especiais que precisam ser filtrados são:
usuário da rede
xp_cmdshell
/adicionar
EXEC Master.DBO.XP_CMDSHELL
Administradores de grupo local da rede
Selecione
contar
ASC
char
MID
'
:
"
inserir
excluir de
Mesa de soltar
atualizar
truncar
de
%
Abaixo estão dois códigos de prevenção que escrevi sobre a solução de ataques de injeção para sua referência de aprendizado!
Versão JS do código de ataque de injeção SQL ~:
[Início do código]
<Script Language = "JavaScript">
<!-
var url = local.search;
var re =/^/? (.*) (Selecione%20 | Inserção%20 | delete%20From%20 | contagem/(| DROP%20Table | Atualização%20trate%20 | ASC/(| MID/(| CHAR/ (| xp_cmdshell | Exec%20master | líquido%20localgroup%20Administrators |/"|: | líquido%20User |/'|%20or%20) (.*) $/gi;
var e = re.test (url);
if (e) {
alerta ("o endereço contém caracteres ilegais ~");
location.href = "error.asp";
}
//->
<Cript>
[Fim do código]
Versão ASP do código para evitar ataques de injeção de SQL ~:
[Início do código]
<%
Em erro de erro em seguida
Dim STRTemp
Se lcase (request.servervariables ("https")) = "off" então então
strtemp = "http: //"
Outro
strtemp = "https: //"
Final se
strTemp = strtemp & request.Servervariables ("server_name")
Se request.Servervariables ("Server_port") <> 80 então strtemp = strtemp & ":" & request.servervariables ("server_port")
strTemp = strtemp & request.Servervariables ("url")
Se Trim (request.QueryString) <> "" então strtemp = strtemp & "?"
strtemp = lcase (strtemp)
Se Instr (STRTemp, "Selecione%20") ou Instr (STRTemp, "Inserir%20") ou Instr (STRTemp, "Excluir%20From") ou Instr (STRTemp, "Count (") ou Instr (STRTemp, "Drop Drop %20table ") ou instrum (strtemp," update%20 ") ou instrum (strtemp," truncate%20 ") ou instrum (strtemp," asc (") ou instrum (strtemp," mid (") ou instrum (strtemp , "char (") ou instrum (strtemp, "xp_cmdshell") ou Instr (strtemp, "execu%20master") ou instrum (strtemp, "líquido%20LocalGroup%20Administrators") ou Instr (strTemp ":") ou Instr (STRTemp, "líquido%20User") ou Instr (STRTEMP, "" " ") ou instrum (strtemp,"%20or%20 ") então
Response.Write "<Script Language = 'JavaScript'>"
Response.Write "Alert ('Endereço ilegal !!');"
Response.Write "Location.href = 'Error.asp';"
Response.write "<cript>"
Final se
%>
[Fim do código]
C# Verifique seqüências para evitar ataques de injeção de SQL
Neste exemplo, é provisoriamente especificado como = e 'números
bool checkparams (objeto params [] args)
{
string [] Lawless = {"=", "'"};
if (sem lei == null || Lawless.length <= 0) retorna true;
// Construa expressões regulares, Exemplo: Lawless é o signo e o 'sinal, então a expressão regular é.* [=}'].* (Para o conteúdo relacionado de expressões regulares, consulte MSDN)
// Além disso, como quero fazer funções gerais e fáceis de modificar, tenho mais uma etapa da matriz de personagens para expressões regulares.
string str_regex = ".*[";
for (int i = 0; i <learless.length-1; i ++)
str_Regex+= Lawless [i]+"|";
str_Regex+= Lawless [Lawless.Length-1]+"].*";
//
foreach (objeto arg em args)
{
se (arg é string) // se for uma string, verifique diretamente
{
if (regex.matches (arg.toString (), str_regex) .count> 0)
retornar falso;
}
caso contrário, se (arg é icollection) // se for uma coleção, verifique se o elemento na coleção é uma string.
{
foreach (objeto obj em (icollection) arg)
{
se (obj é string)
{
if (regex.matches (obj.toString (), str_regex) .count> 0)
retornar falso;
}
}
}
}
retornar true;