FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
Cita:
Eso, o simplemente no les parece adecuado compartir sus conocimientos. // Saludos |
#2
|
||||
|
||||
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:
|
#3
|
||||
|
||||
Cita:
Hacer un es un daño, pero aparte de tumbar el servicio no provee una ventaja. El ejemplo de los apostrofes es para obtener acceso (login) o eliminar un filtro del SQL. Ahora bien, una vez estas dentro, que es lo que sigue? Si no estas buscando tumbar el servicio, la opción logica es minar información. Es este punto donde entra el asunto del '%': Extraer info de los usuarios (averiguar la info de Bob): http://www.unixwiz.net/techtips/sql-injection.html Cita:
Injectando el sql desde un query de pagina & deduciendo la tabla que tiene los logins de usuarios: http://www.securiteam.com/securityre...DP0N1P76E.html Cita:
Osea, lo que falto aclarar antes es que el ejemplo clásico de inyección es de rompimiento (acceso), pero una vez dentro, es uso mas "tradicional" del sql, el conocimiento del lenguaje, el tipo de motor, entorno, etc. Hay se usa el rango completo, como acceso a tablas de sistemas, funciones, comandos de búsqueda (donde entra el %!!!), etc... El error mio fue presumir que era obvio que se puede usar cualquier comando del SQL con una inyección, sin ser claro en el porque.. Es por eso que se puede usar el '%' para una inyección, es cosa de darse cuenta que la inyección no solo rompe, sino que tambien extrae información.
__________________
El malabarista. |
#4
|
||||
|
||||
No hombre, no. Para que tú puedas poner una consulta como las de arriba, necesitas inyectarla. Y para eso es necesario que puedas poner apóstrofos sin restricciones. Una vez que puedes hacer esto entonces claro que puedes hacer uso del comodín para averiguar información. Pero el mal no está en el comodín en sí.
Es por eso que molesta ver este tipo de mensajes en donde se hace una afirmación que asusta y que no necesariamente es correcta. Digámoslo de otra manera. Un código como este:
deja abierta la puerta a la inyección SQL. Pero si escapamos los apóstrofos:
sigo sin ver dónde está el problema con que el usuario escriba un comodín. Los ejemplos que pones se basan en poder inyectar una sentencia con comodín pero gracias a que se deja abierta la puerta del apóstrofo. Es decir, no es que no entienda cómo usar el comodín para extraer información, una vez rota la entrada (usando tus términos). El caso es que el mensaje original dice, textualmente: Cita:
// Saludos |
#5
|
||||
|
||||
No creo que Mario halla querido ensañarse con el comodín. Más bien debe ser un hipotético escenario en donde los desarrollares dejan al usuario ingresar código SQL arbitrariamente, confiando en la buena voluntad de los usuarios. O aveces, también confiando en la ignorancia de ellos...
|
#6
|
||||
|
||||
Cita:
Lo que puedo concluir hasta el momento es que no tiene ningún peligro permitir que el usuario escriba un comodín en la consulta. A menos, claro, que no escape (bien directamente o bien por el uso de parámetros) el apóstrofo, pero eso es harina de otro costal. // Saludos |
|
|
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 |
|