FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Aprendiendo de los errores de otros en BDs
Me econtre este sitio muy bueno que trata sobre diferentes estrategias para prevenir la inyección de código SQL en nuestras aplicaciones y me puse a pensar en varios ejemplos que he visto de desarrollos de mis colegas cordobeses en donde tal vez por comodidad practicamente se puede hacer de todo. He visto muchos casos donde por ejemplo en un soft de gestión, para buscar un producto por nombre le piden al usuario que escriba un "%" como comodín si no se sabe el nombre completo. En otros casos me encontré con una Forma que tenia un TMemoEdit para escribir supuestamente "comandos" definidos por el desarrollador del software quien coloco unos botones que al presionarlos simplemente escribian el código a ejecutar. De manera que tranquilamente podiamos ponernos a escribir cualquier comando SQL válido y su programa lo ejecutaba!!
Pero bueno, a todos en algún momento nos ha pasado.
__________________
AKA "El animalito" ||Cordobés a mucha honra|| |
#2
|
||||
|
||||
Conozco más de un programa que hace eso, pero claro, lo han pedido los clientes
|
#3
|
||||
|
||||
Cita:
Estrictamente hablando, esta es la consulta:
y sustituyo el parámetro con lo que escriba el usuario. // Saludos |
#4
|
||||
|
||||
la consulta es válida, pero si ya sabes que te pueden poner eso que mencionas simplemente quitas los % de la entrada del usuario y no haces un like asi tan directo.
__________________
AKA "El animalito" ||Cordobés a mucha honra|| |
#5
|
||||
|
||||
¡Pero no me has explicado nada! ¿Cuál es el peligro de esa consulta así de directa? Y, se lo diga o no, el usuario puede poner sus %.
// Saludos |
#6
|
||||
|
||||
El "%" le funcionara solo si tu consulta es un LIKE como pusiste, si es una igualdad (al menos en MySQL que es lo que trabajo todos los días) simplemente no hará nada.
__________________
AKA "El animalito" ||Cordobés a mucha honra|| |
#7
|
||||
|
||||
Bueno, eso lo entiendo. Lo que no entiendo es qué tiene que ver con inyección de código SQL, que es el tema que pusiste sobe la mesa. Si hay algún peligro potencial, sería bueno saberlo.
// Saludos |
#8
|
||||
|
||||
EL usar parámetros elimina la inyección de sql roman. Es una de las medidas a tomar.
__________________
El malabarista. |
#9
|
||||
|
||||
De acuerdo Mario, de hecho, siempre uso parámetros tan sólo por legibilidad y organización del código. Pero, vamos a suponer que no los uso. Sigue sin quedarme claro cuál es el peligro potencial del comodín. Entiendo otro tipo de peligros como el de aceptar que el usuario escriba apóstrofos, pero no veo qué sucede con el %.
// Saludos |
#10
|
||||
|
||||
El problema del comodin es solo si el codigo es vulnerable a injeccion.
Al usar parametros, este se "escapa". Es como con las URL. Si envias "un/ejemplo" directo, se entiende como una subcarpeta. Pero si se escapa es "un%2Fejemplo". Es el mismo principio: Al usar parametros, la BD "escapa" los caracteres potencialmente peligrosos, ergo, no hay peligro de injeccion.
__________________
El malabarista. |
#11
|
||||
|
||||
Yo creo que este sitio puede servir también como referencia, habla de la inyección de código y de parametrización pero trae mas ejemplos
__________________
AKA "El animalito" ||Cordobés a mucha honra|| |
#12
|
||||
|
||||
Cita:
// Saludos |
#13
|
||||
|
||||
me quede con las ganas de ver los ejemplos de AzidRain con lo que ha visto en los desarrollos de sus colegas cordobeses. para ver si caigo en alguno de esos casos
__________________
Todos llevamos nuestros demonios a cuestas.. |
#14
|
||||
|
||||
gmontes, Todos hemos caído en algún momento en alguna mala práctica o error de diseño, lo imporante es darse cuenta y no repetirlos. Aunque claro, siempre hay quien mantiene sus prácticas por comodidad pues muchas veces es más fácil hacer las cosas como caiga que buscarle patas por todos lados con tal de entregar algo bien. De ahi que son tan importantes las pruebas y que quien las realice vaya con toda la intención de hacer fallar tu programa.
__________________
AKA "El animalito" ||Cordobés a mucha honra|| |
#15
|
||||
|
||||
Pues yo sigo sin ver cuál es el problema con el comodín. ¿De verdad tienes alguna idea al respecto o lo soltaste así nada más?
// Saludos |
#16
|
||||
|
||||
Cita:
Tener "%algo" no es ningun problema.
__________________
El malabarista. |
#17
|
||||
|
||||
Hola,
¿Azidrain podrías no ser tan esquivo y secote al explicar? A como se ha venido dando el hilo me da la impresión de que tiraste un tema muy de forma airosa, y ahora no le sabes como escapartele. Te agradecería que destines tiempo en elaborar una respuesta lo más clara, en lo técnica y operativamente posible que ilustre los peligros de esos tipos de consultas, y brindando información más objetiva de donde podamos aprender. Creo que de ese modo los demás podríamos aprender más. Yo algo de injección SQL he escuchado, leído e investigado pero no he dedicado tiempo como para ponerlo en análisis y pruebas. En lo que hace a aplicaciones de escritorio, si el usuario no tiene demasiadas posibilidades de meter dedo ¿nos libra de algún ataque? Se escucha mucho hablar de injección SQL en el entorno web, es más las fuentes que estuve viendo de tu enlace se centra esto, pero hasta el momento no he visto algún artículo que hable de esto para aplicaciones de escritorio ¿Vale lo mismo? Saludos, |
#18
|
||||
|
||||
Hola.
Con seguridad todos los que participaron en este hilo conoce de forma clara la inyección sql, pero pensando en los que puedan leer el tema y no sepan de él o tengan una idea muy vaga, agrego un enlace donde se explica de forma sencilla la [Inyección SQL] Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#19
|
||||
|
||||
Cita:
Eso, o simplemente no les parece adecuado compartir sus conocimientos. // Saludos |
#20
|
||||
|
||||
He encontrado esto en unos foros:
Delphi - prevent against SQL injection up vote 16 down vote favorite 1 share [g+] share [fb] share [tw] I need to protect an application from SQL injection. Application is connecting to Oracle, using ADO, and search for the username and password to make the authentication. From what I've read until now, the best approach is by using parameters, not assigning the entire SQL as string. Something like this: query.SQL.Text := 'select * from table_name where name=:Name and id=:ID'; query.Prepare; query.ParamByName( 'Name' ).AsString := name; query.ParamByName( 'ID' ).AsInteger := id; query.Open; Also, I'm thinking to verify the input from user, and to delete SQL keywords like delete,insert,select,etc...Any input character different than normal ASCII letters and numbers will be deleted. This will assure me a minimum of security level? I do not want to use any other components than Delphi 7 standard and Jedi. sql oracle delphi sql-injection delphi-7 feedback 3 Answers active oldest votes up vote 26 down vote accepted Safe query.SQL.Text := 'select * from table_name where name=:Name'; This code is safe because you are using parameters. Parameters are always safe from SQL-injection. Unsafe var Username: string; ... query.SQL.Text := 'select * from table_name where name='+ UserName; Is unsafe because Username could be name; Drop table_name; Resulting in the following query being executed. select * from table_name where name=name; Drop table_name; Also Unsafe var Username: string; ... query.SQL.Text := 'select * from table_name where name='''+ UserName+''''; Because it if username is ' or (1=1); Drop Table_name; -- It will result in the following query: select * from table_name where name='' or (1=1); Drop Table_name; -- ' But this code is safe var id: integer; ... query.SQL.Text := 'select * from table_name where id='+IntToStr(id); Because IntToStr() will only accept integers so no SQL code can be injected into the query string this way, only numbers (which is exactly what you want and thus allowed) But I want to do stuff that can't be done with parameters Parameters can only be used for values. They cannot replace field names or table names. So if you want to execute this query query:= 'SELECT * FROM :dynamic_table '; {doesn't work} query:= 'SELECT * FROM '+tableName; {works, but is unsafe} The first query fails because you cannot use parameters for table or field names. The second query is unsafe but is the only way this this can be done. How to you stay safe? You have to check the string tablename against a list of approved names. Const ApprovedTables: array[0..1] of string = ('table1','table2'); procedure DoQuery(tablename: string); var i: integer; Approved: boolean; query: string; begin Approved:= false; for i:= lo(ApprovedTables) to hi(ApprovedTables) do begin Approved:= Approved or (lowercase(tablename) = ApprovedTables[i]); end; {for i} if not Approved then exit; query:= 'SELECT * FROM '+tablename; ... That's the only way to do this, that I know of. BTW Your original code has an error: query.SQL.Text := 'select * from table_name where name=:Name where id=:ID'; Should be query.SQL.Text := 'select * from table_name where name=:Name and id=:ID'; Because you have an error there, you cannot have two where's in one (sub)query Espero sirva de algo. Un Saludo.
__________________
Guía de Estilo de los Foros Cita:
|
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Aprendiendo a usar Trigger... | verito_83mdq | MySQL | 11 | 23-02-2011 00:05:13 |
Aprendiendo juegos de delphi | ferra99 | Varios | 6 | 29-10-2008 12:47:19 |
Aprendiendo | calistian | Varios | 4 | 14-06-2008 21:47:48 |
Aprendiendo a Aprender Firebird...!!! | RK2 | Firebird e Interbase | 5 | 12-05-2008 20:11:48 |
Aprendiendo delphi for php | JULIPO | PHP | 6 | 21-09-2007 21:19:47 |
|