2008-09-29 16 views

Respuesta

26

procedimientos almacenados y/o declaraciones preparadas:

https://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks

Can I protect against SQL Injection by escaping single-quote and surrounding user input with single-quotes?

Catching SQL Injection and other Malicious Web Requests

Con acceso DB, todavía puede hacerlo, pero si ya te preocupa la inyección de SQL, creo que debes salir de Access de todos modos.

Aquí hay un enlace a la técnica de acceso:

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

Tenga en cuenta que lo que normalmente protege de inyección no es el procedimiento almacenado en sí, sino el hecho de que es parametrizado y no dinámico. Recuerde que incluso los SP que crean código dinámico pueden ser vulnerables a la inyección si usan parámetros de cierta manera para construir el código dinámico. En general, prefiero los SP porque forman una capa de interfaz que las aplicaciones obtienen en la base de datos, por lo que las aplicaciones ni siquiera pueden ejecutar código arbitrario en primer lugar.

Además, el punto de ejecución del procedimiento almacenado puede ser vulnerable si no utiliza el comando y los parámetros, p. esto sigue siendo vulnerable porque se genera dinámicamente y puede ser un blanco de inyección:

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

Recuerde que su base de datos necesita defender su propio perímetro, y si varios inicios de sesión tienen derechos a INSERT/UPDATE/DELETE en tablas, cualquier código en aquellas aplicaciones (o aplicaciones comprometidas) puede ser un problema potencial. Si los inicios de sesión solo tienen derechos para ejecutar procedimientos almacenados, esto forma un embudo a través del cual puede garantizar con mayor facilidad el comportamiento correcto. (Similar a los conceptos OO donde los objetos son responsables de sus interfaces y no exponen todo su funcionamiento interno.)

3

Usando las consultas parametrizadas, necesita crear un objeto de comando, asignarle parámetros con un nombre y un valor, si usted por lo que no tendría que preocuparse de nada más (refiriéndose a la inyección SQL, por supuesto;))

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

Y no confiar en los procedimientos almacenados, pueden convirtió en un vector de ataque también si usted don usar declaraciones preparadas

+0

procedimientos almacenados no son la respuesta (incluso si no se está usando el acceso), ya que todavía se puede escribir código inyectable usando SP (lo he visto). Son consultas parametrizadas que te protegen. – Flory

+0

@Flory, ¿no es eso exactamente lo que dice? – Abel

+5

@Abel, seguro que sí. No sé lo que estaba fumando hace dos años. – Flory

1

procedimientos almacenados si no son una opción - e incluso si lo son - validar todas las entradas a fondo

-2

de conmutación de SQL Express por lo menos es una gran opción. Hará las cosas mucho más seguras. Aunque el uso de parámetros y procedimientos almacenados puede ser de gran ayuda. También recomiendo que valide las entradas cuidadosamente para asegurarse de que coincidan con lo que está esperando.

Para valores como números, es bastante fácil extraer el número para verificar que efectivamente se trata de un número. Escape todos los caracteres especiales para SQL. Hacer esto evitará que el intento de ataque funcione.

4

"Una forma sólida de proteger contra la inyección sql para una aplicación ASP clásica" es validar implacablemente todas las entradas. Período.

Los procedimientos almacenados solos y/o un sistema de base de datos diferente no necesariamente equivalen a una buena seguridad.

MS lanzó recientemente una herramienta de inspección de inyección SQL que busca la entrada no validada que se utiliza en una consulta. ESO es lo que deberías estar buscando.

Aquí está el enlace: The Microsoft Source Code Analyzer for SQL Injection tool is available to find SQL injection vulnerabilities in ASP code

1

Hey, cualquier base de datos tan bueno como desarrollador que lo utiliza.

Nada más pero nada menos.

Si es un buen desarrollador puede construir un sitio de comercio electrónico utilizando archivos de texto como base de datos. Sí, no será tan bueno como el sitio web impulsado por Oracle, pero le irá bien para las pequeñas empresas, como la fabricación de joyería personalizada en el hogar.

Y si es un buen desarrollador, no usará enunciados SQL en línea en sus páginas ASP. Incluso en Access tiene la opción de crear y usar consultas ...

Procs de tienda con verificación de datos, junto con la codificación html - es la mejor manera de prevenir cualquier ataque de inyección SQL.

8

Aquí hay un par de guiones sqlinject me hizo hace mucho tiempo una versión sencilla y una versión extendida:

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 
Cuestiones relacionadas