Pergunta

O que é uma forte maneira de proteger contra injeção de SQL para um aplicativo asp clássico?

FYI eu estou usando-o com um DB acesso. (Eu não escrever o app)

Foi útil?

Solução

Stored Procedures e / ou declarações preparadas:

https://stackoverflow.com/questions / 1973 / o que-é-o-melhor-way-to-avoid-de injeção de SQL-ataques

Posso proteger contra SQL Injection por escapar aspas simples e cercando a entrada do usuário com aspas simples?

Catching SQL Injection e outros mal-intencionado solicitações da Web

Com o Access DB, você ainda pode fazê-lo, mas se você já está preocupado com SQL Injection, eu acho que você precisa para obter o acesso de qualquer maneira.

Aqui está um link para a técnica no Access:

http://www.asp101.com/samples/storedqueries.asp

Note que o que normalmente protege de injeção não é o próprio procedimento armazenado, mas o fato de que ele é parametrizado e não dinâmico. Lembre-se que mesmo SPs que código dinâmico de construção pode ser vulnerável a injeção se eles usam parâmetros em determinadas maneiras de construir o código dinâmico. No geral, eu prefiro SPs porque eles formam uma camada de interface que os aplicativos de chegar ao banco de dados, de modo que os aplicativos não estão sequer autorizados a executar código arbitrário em primeiro lugar.

Além disso, o ponto de execução do procedimento armazenado pode ser vulnerável se você não usar o comando e os parâmetros, por exemplo, este ainda é vulnerável porque é construído de forma dinâmica e pode ser um alvo injecção:

Conn.Execute("EXEC usp_ImOnlySafeIfYouCallMeRight '" + param1 + "', '" + param2 + "'") ;

Lembre-se que seu banco de dados precisa defender seu próprio perímetro, e se vários logins tem direitos para INSERT/UPDATE/DELETE em tabelas, qualquer código nesses aplicativos (ou aplicativos comprometidos) pode ser um problema em potencial. Se os logins só tem direitos para executar procedimentos armazenados, esta forma um funil através do qual você pode muito mais facilmente garantir o comportamento correto. (Semelhante a conceitos OO onde os objetos são responsáveis ??por suas interfaces e não expor todos os seus funcionamentos internos.)

Outras dicas

Aqui estão alguns scripts sqlinject eu fiz há muito tempo uma versão simples e uma versão estendida:

function SQLInject(strWords) 
dim badChars, newChars, i
badChars = array("select", "drop", ";", "--", "insert", "delete", "xp_") 
newChars = strWords 
for i = 0 to uBound(badChars) 
newChars = replace(newChars, badChars(i), "") 
next 
newChars = newChars 
newChars= replace(newChars, "'", "''")
newChars= replace(newChars, " ", "")
newChars= replace(newChars, "'", "|")
newChars= replace(newChars, "|", "''")
newChars= replace(newChars, "\""", "|")
newChars= replace(newChars, "|", "''")
SQLInject=newChars
end function 


function SQLInject2(strWords)
dim badChars, newChars, tmpChars, regEx, i
badChars = array( _
"select(.*)(from|with|by){1}", "insert(.*)(into|values){1}", "update(.*)set", "delete(.*)(from|with){1}", _
"drop(.*)(from|aggre|role|assem|key|cert|cont|credential|data|endpoint|event|f ulltext|function|index|login|type|schema|procedure|que|remote|role|route|sign| stat|syno|table|trigger|user|view|xml){1}", _
"alter(.*)(application|assem|key|author|cert|credential|data|endpoint|fulltext |function|index|login|type|schema|procedure|que|remote|role|route|serv|table|u ser|view|xml){1}", _
"xp_", "sp_", "restore\s", "grant\s", "revoke\s", _
"dbcc", "dump", "use\s", "set\s", "truncate\s", "backup\s", _
"load\s", "save\s", "shutdown", "cast(.*)\(", "convert(.*)\(", "execute\s", _
"updatetext", "writetext", "reconfigure", _
"/\*", "\*/", ";", "\-\-", "\[", "\]", "char(.*)\(", "nchar(.*)\(") 
newChars = strWords
for i = 0 to uBound(badChars)
Set regEx = New RegExp
regEx.Pattern = badChars(i)
regEx.IgnoreCase = True
regEx.Global = True
newChars = regEx.Replace(newChars, "")
Set regEx = nothing
next
newChars = replace(newChars, "'", "''")
SqlInject2 = newChars
end function

"A forte maneira de proteger contra injeção de SQL para um aplicativo ASP clássico" é validar impiedosamente todas as entradas. Período.

Procedimentos armazenados sozinho e / ou um sistema de banco de dados diferente não necessariamente garantia igual bom.

MS apresentou recentemente uma ferramenta de inspeção de injeção SQL que procura a entrada unvalidated que é usado em uma consulta. É isso que você deve estar procurando.

Aqui está o link: A Microsoft Source Code Analyzer para SQL Injection ferramenta está disponível para encontrar vulnerabilidades de injeção SQL em código ASP

Usando querys parametrizadas, você precisa criar um objeto de comando, atribuí-la parâmetros com um nome e um valor, se você fizer isso você não precisa se preocupar com qualquer outra coisa (referindo-se a injeção de SQL é claro;))

http://prepared-statement.blogspot.com /2006/02/asp-prepared-statements.html

E não confio em procedimentos armazenados, eles podem se tornou um vetor de ataque também se você não usar declarações preparadas.

Se os procedimentos armazenados não são uma opção - e mesmo se eles são - validar todas as entradas completamente

Ei, qualquer banco de dados tão bom como desenvolvedor que usa-lo.

Nada mais, mas nada menos.

Se você é bom desenvolvedor, você pode construir site de e-commerce usando arquivos de texto como um banco de dados. Sim, não vai ser tão bom quanto o Oracle dirigido site, mas ele vai fazer muito bem para pequenas empresas como em casa, fabricação de jóias personalizadas.

E se você é bom desenvolvedor, você não vai usar instruções SQL incorporadas em suas páginas ASP. Mesmo no Access você tem a opção de consultas construir e usar ..

procs loja com verificação de dados, juntamente com html codificar -. É a melhor maneira de evitar ataques de injeção SQL

O Microsoft Source Code Analyzer para a ferramenta SQL Injection está disponível para encontrar vulnerabilidades de injeção SQL em código ASP

Mudar para SQL Express, no mínimo, é uma ótima opção. Ele vai fazer coisas muito mais seguro. Mesmo que o uso de parâmetros e procedimentos armazenados pode ajudar muito. Eu também recomendo que você valida as entradas cuidadosamente para ter certeza que eles correspondem ao que você está esperando.

Para valores como números, é bastante fácil de extrair o número para verificar se ele é realmente apenas um número. Escapar todos os caracteres especiais para SQL. Fazendo isso vai impedir a tentativa de ataque de trabalhar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top