Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   como enviar nombre de tabla como parametro ? (https://www.clubdelphi.com/foros/showthread.php?t=75875)

sabueso1010 24-09-2011 00:21:16

como enviar nombre de tabla como parametro ?
 
hola foro tengo el siguente codigo en donde quiero enviar como parametros 2 valores 1. el nombre de la tabla , 2. el valor de un campo, este es mi codigo:

Código Delphi [-]
qtabla:=dbserver+'\@viajes.db';
with data.qapagos do begin
  close;
  SQL.Clear;
  SQL.ADD('select * from :xtabla  where referencia = :xreferencia ');
  parambyname("xtabla").asstring:=qtabla;
  parambyname("xreferencia").asinteger:=_referencia;
  open;
end;

al ejecutar me marca error
alguien me puede ayudar a como pasar esos 2 parametros ?
saludos.

Caral 24-09-2011 00:27:35

Hola
No lo se, pero me parece que sobran comillas:
Código Delphi [-]
qtabla:=dbserver+'\@viajes.db';
with data.qapagos do begin
  close;
  SQL.Clear;
  SQL.ADD('select * from :xtabla  where referencia = :xreferencia ');
  parambyname('xtabla').asstring:=qtabla;
  parambyname('xreferencia').asinteger:=_referencia;
  open;
end;
Saludos

Al González 24-09-2011 00:38:07

Cita:

Empezado por sabueso1010 (Mensaje 413253)
al ejecutar me marca error

¿De casualidad el error es "error message and line number not specified"? :)

oscarac 24-09-2011 00:39:25

seria de Muuuuuucha ayuda saber cual es el error no?

Casimiro Notevi 24-09-2011 00:39:41

También depende la BD que estés usando, algunas no lo permiten.

sabueso1010 24-09-2011 00:53:33

datos extras
 
estoy utilizando el DBE con tablas paradox.

este es el error que me marca en tiempo de ejecucion


Código:

project cllmex raised exception class EDBEngineerror with message " invalid use of keyword.
token: ?
line number 1'. process stopped. use step or run to continue

que sera el error ?

saludos !!!!

oscarac 24-09-2011 00:55:02

asi se llama tu base de datos? @viajes.DB?

sabueso1010 24-09-2011 21:49:09

hola oscarac y demas amigos
 
la base de datos se llama cllmex y es un alias en DBE que esta direccionado
a c:\cllmex\datos

la tabla se llama @viajes.db

por eso al campo qtabla le asigno la cadena

qtabla:=dbserver+'\@viajes.db'
pues la variable dbserver trae arrastrando el valor 'C:\cllmex\datos'

entonces qtabla := 'c:\cllmex\datos' + '\@viajes.db';

resultado qtabla := 'c:\cllmex\datos\@viajes.db';

ecfisa 25-09-2011 17:45:47

Hola sabueso1010.

No podés pasar el nombre de la tabla a una consulta así en forma directa, vas a tener que crearte un procedimiento para la tarea.
¿ Es necesario que lo hagas de forma dinámica ? No me parece buena idea por que además de ser ineficiente, deja tu código expuesto a los ataques de inyección de sql.

De todas maneras no conozco Paradox para saber si lo soportaría y de ser así como hacerlo.

Un saludo.

defcon1_es 26-09-2011 09:50:40

Hola. Prueba a construir la sentencia SQL de esta forma.
Código Delphi [-]
qtabla:=dbserver+'\@viajes.db'; 
with data.qapagos do 
begin   
  close;   
  SQL.Clear;   
  SQL.ADD('select * from '+qtabla+' where referencia = :xreferencia ');   
  parambyname("xreferencia").asinteger:=_referencia;   
  open; 
end;

Nota: No la he probado, a lo mejor debes usar la función QuotedStr.

SQL.ADD('select * from '+QuotedStr(qtabla)+' where referencia = :xreferencia ');

ecfisa 26-09-2011 17:07:55

Hola sabueso1010.

Una aclaración, cuando dije:
Cita:

No podés pasar el nombre de la tabla a una consulta así en forma directa, vas a tener que crearte un procedimiento para la tarea.
Me estaba refiriendo a que no podés enviar el nombre de tabla en un parámetro como está en el código que adjuntas en el mensaje #1.

Del modo que te sugiere defcon1_es si se puede, pero deja el código expuesto a la Inyección SQL.

Saludos.

abelg 26-09-2011 17:13:32

Hola, mira este código y espero te ayude.

Código Delphi [-]
qtabla:=dbserver+'\@viajes.db';
 with data.qapagos do
 begin
    close;
    SQL.Clear;
    SQL.ADD('select * from _tabla  where referencia = :xreferencia ');
    SQL.Text := StringReplace(SQL.Text, '_tabla', qtabla, [rfReplaceAll, rfIgnoreCase]);
    parambyname("xreferencia").asinteger:=_referencia;
    open;
 end;

solo que al formar tu consulta por código no le veo sentido pero esto funciona, correctamente.
ojo. qtabla tiene que ser un variable tipo string

defcon1_es 26-09-2011 18:39:32

Cita:

Empezado por ecfisa (Mensaje 413477)
Hola sabueso1010.

Una aclaración, cuando dije:

Me estaba refiriendo a que no podés enviar el nombre de tabla en un parámetro como está en el código que adjuntas en el mensaje #1.

Del modo que te sugiere defcon1_es si se puede, pero deja el código expuesto a la Inyección SQL.

Saludos.

Me has dejado intrigado, pero en el ejemplo ¿cómo se podría inyectar código SQL si el nombre de la tabla no lo puede teclear un usuario?
¿modificando en memoria el contenido de la variable qTabla?

Voy a buscar más referencias sobre inyecciones de código SQL y sobre todo herramientas para el análisis de este tipo de vulnerabilidad.

sabueso1010 26-09-2011 20:18:36

solucionado
 
solucionado con el codigo de defcon1_es que es

Código Delphi [-]
qtabla:=dbserver+'\@viajes.db';
with data.qapagos do
begin
  close;
  SQL.Clear;
  SQL.ADD('select * from '+QuotedStr(qtabla)+' where referencia = :xreferencia ');
  parambyname('xreferencia').asinteger:=_referencia;
  open;
end;

y muy importante tanto como el codigo el consejo de ECFISA, hay que tomar
en cuenta mucho que asi el codigo queda expuesto a inyeccion, muy cierto. por el momento sali del problema con el codigo pero si hay que considerar lo que nos dice ECFISA.

gracias a todos los que coolaboraron con este hilo y espero le sirva en el futuro a alguien mas.

saludos.

ecfisa 26-09-2011 22:41:44

Cita:

Empezado por defcon1_es (Mensaje 413493)
Me has dejado intrigado, pero en el ejemplo ¿cómo se podría inyectar código SQL si el nombre de la tabla no lo puede teclear un usuario?

Hola defcon1_es.

Si el valor es asignado por código yo tampoco veo la posibilidad de hacerlo. Mi comentario fué por que no ví de que manera sabueso1010 asignaba el valor a la variable, por lo que el código SQL bién podría haber quedado expuesto.

Ahora revisando con más detenimiento véo que no reparé bién en el mensaje #8 donde sabueso1010 dice:
Cita:

...
por eso al campo qtabla le asigno la cadena

qtabla:=dbserver+'\@viajes.db'
....
Así que en este caso, creo como vos, que no es factible.

Al igual que comentás en tu último mensaje, yo también tendría que profundizar más sobre si aún así existe la posibilidad, ya que es una vulnerabilidad potencial muy peligrosa.
Lo que es claro que con el uso de parámetros no es viable la inyección.

Un saludo.

defcon1_es 27-09-2011 17:19:48

Y tanto que es peligrosa:

"existen alrededor de 115 millones de vulnerabilidades de inyección SQL en circulación,
basándose en los datos conseguidos mediante la monitorización de un conjunto de 30 aplicaciones web durante los pasados nueve meses."

Noticia: http://www.csospain.es/Los-ataques-d...noticia-113621


La franja horaria es GMT +2. Ahora son las 09:23:45.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi