Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-09-2011
sabueso1010 sabueso1010 is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 31
Poder: 0
sabueso1010 Va por buen camino
Smile 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.
Responder Con Cita
  #2  
Antiguo 24-09-2011
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #3  
Antiguo 24-09-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por sabueso1010 Ver Mensaje
al ejecutar me marca error
¿De casualidad el error es "error message and line number not specified"?
Responder Con Cita
  #4  
Antiguo 24-09-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
seria de Muuuuuucha ayuda saber cual es el error no?
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #5  
Antiguo 24-09-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
También depende la BD que estés usando, algunas no lo permiten.
Responder Con Cita
  #6  
Antiguo 24-09-2011
sabueso1010 sabueso1010 is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 31
Poder: 0
sabueso1010 Va por buen camino
Talking 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 !!!!
Responder Con Cita
  #7  
Antiguo 24-09-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
asi se llama tu base de datos? @viajes.DB?
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #8  
Antiguo 24-09-2011
sabueso1010 sabueso1010 is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 31
Poder: 0
sabueso1010 Va por buen camino
Smile 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';
Responder Con Cita
  #9  
Antiguo 25-09-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 25-09-2011 a las 17:52:26.
Responder Con Cita
  #10  
Antiguo 26-09-2011
Avatar de defcon1_es
defcon1_es defcon1_es is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuenca - España
Posts: 533
Poder: 21
defcon1_es Va por buen camino
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 ');
__________________
Progress Openedge
https://abevoelker.com/progress_open...dered_harmful/


Delphi forever...
Responder Con Cita
  #11  
Antiguo 26-09-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #12  
Antiguo 26-09-2011
abelg abelg is offline
Miembro
 
Registrado: jul 2004
Posts: 50
Poder: 20
abelg Va por buen camino
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
Responder Con Cita
  #13  
Antiguo 26-09-2011
Avatar de defcon1_es
defcon1_es defcon1_es is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuenca - España
Posts: 533
Poder: 21
defcon1_es Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
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.
__________________
Progress Openedge
https://abevoelker.com/progress_open...dered_harmful/


Delphi forever...

Última edición por defcon1_es fecha: 26-09-2011 a las 18:45:08.
Responder Con Cita
  #14  
Antiguo 26-09-2011
sabueso1010 sabueso1010 is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 31
Poder: 0
sabueso1010 Va por buen camino
Smile 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.
Responder Con Cita
  #15  
Antiguo 26-09-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por defcon1_es Ver Mensaje
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 27-09-2011 a las 18:25:17.
Responder Con Cita
  #16  
Antiguo 27-09-2011
Avatar de defcon1_es
defcon1_es defcon1_es is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuenca - España
Posts: 533
Poder: 21
defcon1_es Va por buen camino
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
__________________
Progress Openedge
https://abevoelker.com/progress_open...dered_harmful/


Delphi forever...
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Enviar a VK_F1 como parametro mRoman OOP 4 01-05-2010 17:44:56
pasar el nombre de una forma como parametro Willo Varios 7 10-03-2009 23:17:05
pasar como parámetro nombre de un componente joanajj Varios 3 04-07-2007 22:25:49
Parámetro como nombre de campo Loviedo SQL 4 12-04-2007 19:49:35
Asignar como parámetro el nombre de la tabla PINO72 Firebird e Interbase 4 20-03-2005 20:00:11


La franja horaria es GMT +2. Ahora son las 20:05:27.


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
Copyright 1996-2007 Club Delphi