Armar SQL y despues ejecutarlo

24/09/2004 - 22:33 por Yan Carlos | Informe spam
Hola necesito la ayuda de Uds por favor...
Estoy armando una sentencia SQL y concatenandola en una variable hasta que
tenga la estructura adecuada... una vez que tengo toda la sentencia como la
ejecuto... algo asi
Set @misql = 'SELECT * '
Set @misql=@misql + 'FROM Tabla'
Como veo el resultado de la consulta que tiene @misql
Muchas gracias, espero su pronta respuesta...

Saludos
YAN

Preguntas similare

Leer las respuestas

#11 MAXI
25/09/2004 - 01:27 | Informe spam
Perdona Ivan, pense que decias que habia que armar un SP con Sql-Dinamico :(

pd: se nota que es viernes la pucha jeje




Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)
Mail: Maxi_accotto[arroba]speedy.com.ar

Msn Messager:

"Ivan Mostacero" escribió en el mensaje
news:
eso intente decir en mi post anterior.

"MAXI" wrote in message
news:#
Estimado: si usas Sql-Dinamico tampoco usaras el plan de ejecucion ;-) y
ademas permitiras la injeccion de codigo, con lo cual tu SP pasa a ser:}

Inseguro y Lento!! las dos grandes virtudes de los SP lo pierdes
enseguida
:(




Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)
Mail: Maxi_accotto[arroba]speedy.com.ar

Msn Messager:

"Ivan Mostacero" escribió en el mensaje
news:
> sip no es aconsejable ya que no estas reutilizando el plan de
> ejecucion,
> eso
> implica que tu stored procedure se recompilara en cada ejecucion.
>
> "Maxi" wrote in message
> news:#
>> Hola, esto hacelo en el cliente y NO uses Sql-dinamico!! no es para


nada
>> aconsejable
>>
>>
>> Salu2
>> Maxi
>> Buenos Aires - Argentina
>> Desarrollador Microsoft 3 Estrellas .NET
>> Nunca consideres el estudio como una obligación sino como
>> una oportunidad para penetrar en el bello y maravillosos
>> mundo del saber.
>> - Albert Einstein
>>
>>
>>
>> "Yan Carlos" escribió en el


mensaje
>> news:
>> > Hola necesito la ayuda de Uds por favor...
>> > Estoy armando una sentencia SQL y concatenandola en una variable


hasta
>> que
>> > tenga la estructura adecuada... una vez que tengo toda la sentencia
>> > como
>> la
>> > ejecuto... algo asi
>> > Set @misql = 'SELECT * '
>> > Set @misql=@misql + 'FROM Tabla'
>> > Como veo el resultado de la consulta que tiene @misql
>> > Muchas gracias, espero su pronta respuesta...
>> >
>> > Saludos
>> > YAN
>> >
>> >
>>
>>
>>
>> Outgoing mail is certified Virus Free.
>> Checked by AVG anti-virus system (http://www.grisoft.com).
>> Version: 6.0.764 / Virus Database: 511 - Release Date: 15/09/2004
>>
>>
>
>






Respuesta Responder a este mensaje
#12 Ivan Mostacero
25/09/2004 - 01:35 | Informe spam
jajaja sip, fin de semana yap, de aca hasta el lunes, bueno fin de semana
para todos jejeje.
"MAXI" wrote in message
news:
Perdona Ivan, pense que decias que habia que armar un SP con Sql-Dinamico


:(

pd: se nota que es viernes la pucha jeje




Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)
Mail: Maxi_accotto[arroba]speedy.com.ar

Msn Messager:

"Ivan Mostacero" escribió en el mensaje
news:
> eso intente decir en mi post anterior.
>
> "MAXI" wrote in message
> news:#
>> Estimado: si usas Sql-Dinamico tampoco usaras el plan de ejecucion ;-)


y
>> ademas permitiras la injeccion de codigo, con lo cual tu SP pasa a


ser:}
>>
>> Inseguro y Lento!! las dos grandes virtudes de los SP lo pierdes
>> enseguida
>> :(
>>
>>
>>
>>
>> Maxi
>>
>> Buenos Aires - Argentina
>> Desarrollador .NET 3 Estrellas
>> Microsoft User Group (MUG)
>> Mail: Maxi_accotto[arroba]speedy.com.ar
>>
>> Msn Messager:
>>
>> "Ivan Mostacero" escribió en el mensaje
>> news:
>> > sip no es aconsejable ya que no estas reutilizando el plan de
>> > ejecucion,
>> > eso
>> > implica que tu stored procedure se recompilara en cada ejecucion.
>> >
>> > "Maxi" wrote in message
>> > news:#
>> >> Hola, esto hacelo en el cliente y NO uses Sql-dinamico!! no es para
> nada
>> >> aconsejable
>> >>
>> >>
>> >> Salu2
>> >> Maxi
>> >> Buenos Aires - Argentina
>> >> Desarrollador Microsoft 3 Estrellas .NET
>> >> Nunca consideres el estudio como una obligación sino como
>> >> una oportunidad para penetrar en el bello y maravillosos
>> >> mundo del saber.
>> >> - Albert Einstein
>> >>
>> >>
>> >>
>> >> "Yan Carlos" escribió en el
> mensaje
>> >> news:
>> >> > Hola necesito la ayuda de Uds por favor...
>> >> > Estoy armando una sentencia SQL y concatenandola en una variable
> hasta
>> >> que
>> >> > tenga la estructura adecuada... una vez que tengo toda la


sentencia
>> >> > como
>> >> la
>> >> > ejecuto... algo asi
>> >> > Set @misql = 'SELECT * '
>> >> > Set @misql=@misql + 'FROM Tabla'
>> >> > Como veo el resultado de la consulta que tiene @misql
>> >> > Muchas gracias, espero su pronta respuesta...
>> >> >
>> >> > Saludos
>> >> > YAN
>> >> >
>> >> >
>> >>
>> >>
>> >>
>> >> Outgoing mail is certified Virus Free.
>> >> Checked by AVG anti-virus system (http://www.grisoft.com).
>> >> Version: 6.0.764 / Virus Database: 511 - Release Date: 15/09/2004
>> >>
>> >>
>> >
>> >
>>
>>
>
>


Respuesta Responder a este mensaje
#13 Leonardo Azpurua
25/09/2004 - 05:07 | Informe spam
"MAXI" escribió en el mensaje
news:%
Estimado: si usas Sql-Dinamico tampoco usaras el plan de ejecucion ;-) y
ademas permitiras la injeccion de codigo, con lo cual tu SP pasa a ser:}

Inseguro y Lento!! las dos grandes virtudes de los SP lo pierdes enseguida
:(



Hola, Maxi:

Ese asunto de la "inyección de SQL" me preocupa y no me preocupa.

Me preocupa porque es una putada que alguien pueda insertar codigo adicional
en una sentencia enviada desde mi aplicacion.

No me preocupa porque tengo la idea de que la técnica que uso para armar la
sentencias dinámicas impide por completo la inyeccion de codigo.

La mayoria de las sentencias dinamicas que armo desde la aplicación tienen
la parte variable en la clausula WHERE, es decir, algo como esto:

SELECT <campos> FROM <tablas> WHERE <condiciones>

donde las condiciones que no establecen relaciones (del tipo Tm.Ca = Tn.Cb)
tienen la forma <NombreCol> = <Literal> y
<Literal>::=<literalAlfa>|<literalNumerico>|<literalFecha>
cada uno de estos tipos de literal presenta un problema particular. Los
alfanumericos, por ejemplo, pueden contener el delimitador (' e.g.
McDonald's). Esto lo resuelvo reemplazando el delimitador por dos
delimitadores. Y eso lo hago en una función llamada StringDB, que en esencia
reemplaza los apostrofes por doble apostrofe y delimta el argumento.
[StringDB("McDonald's") = 'McDonald''s'

Los campos numéricos no pueden usar la coma como separador decimal, de
manera que tuve que escribir NumeroDB(arg As Double), que utiliza
Trim(Str(Arg)). Str representa los numeros en "formato interno", ignorando
los separadores de millar y utilizando siempre el punto como separador
decimal.

Y por ultimo, FechaDB(arg As Date), convierte la fecha al formato que espera
el proveedor especifico #yyyy-dd-mm# si es Access o {d 'yyyy-mm-dd'} si es
SQL Server.

El asunto es que sólo es posible "inyectar" codigo como parte de un string.
Hasta donde he visto, la inyección se realiza insertando codigo adicional en
un argumento de cadena.

Si uno escribe, por ejemplo, "WHERE Password = '" & Variable & "' ..., el
tipo malo podría descubrir la manera de asignar a Variable el valor "X' OR
'A' = 'A", y al armarse la sentencia obtendriamos
WHERE Password = 'X' OR 'A' = 'A'
que es cierta independientemente del valor de Password, ya que A=A es
siempre verdadera.

Pero si usamos WHERE Password = " & StringDB(Variable) & ..., tengo la
impresión de que es imposible inyectar código (si Variable = "X' Or 'A' 'A", StringDB(Variable) = X'' Or ''A''=''A, y la instruccion resultante
seria:
WHERE Password = 'X'' Or ''A'' = ''A'
es decir que a menos que el Password sea exactamente X' Or 'A' = 'A, la
condicion sera falsa.

La pregunta que te hago es la siguiente: ¿basta con empaquetar -del lado de
la aplicacion- los argumentos en funciones que validen la consistencia del
tipo de datos para impedir la inyección de código?

Y si tu respuesta es no, ¿podrias explicar (de manera convincente -y sabes
la clase de plaga esceptica que soy- ) por qué? ;-D

Salud y Gracias!

Leonardo
mvp vb
Respuesta Responder a este mensaje
#14 MAXI
25/09/2004 - 15:25 | Informe spam
Leo, a ver: si armas un SP que tiene un parametro y ese parametro lo usas
como SQL-Dinamico podrias tener el problema de injeccion de codigo:

En la aplicacion lo podes controlar impidiendo el ingreso de algunas
palabras como:

DROP
DELETE
CREATE

etc

Pero al ser un SP recuerda que se puede usar desde cualquier lado que se
tenga acceso, con lo cual TODAS las aplicaciones que usen esto deberian
tener un control.

Ahora bien, vayamos a lo logico:

Un SP nos ayuda a obtener mejores beneficios de Seguridad y Performance!!!
bien, al usar Sql-Dinamico, no estas cumpliendo con ninguna de las 2, por lo
cual yo te pregunto: Tiene sentido armarlo asi?

Yo te recomendaria que no, que armes la sentencia dinamica desde la
aplicacion y que uses roles de aplicacion, con esto vas a poder tener el
sistema seguro y que sea optimo.

Aca hay muchos que estamos en desacuerdo del uso del Sql-Dinamico, yo como
veras soy uno :-), es mas nunca lo he usado en la centera de aplicaciones
que tengo.

Cuando alguien quiere usar Sql-Dinamico es basicamente para escribir menos
codigo o SP mas reutilizables, y esa no es la idea, la idea no es que el
developer escriba menos codigo, sino que un recurso tan costoso (en todo
aspecto) como es el motor de BDD este lo mas optimo y seguro posible!!

Por eso la recomendacion.

Pero proba, a la variable de entrada ponele:

';drop table customers;' y?

Ademas de esto, hay un temita mas, el usuario que ejecute el Sql-Dinamico
(por mas que este dentro del SP) debera tener acceso a las tablas con lo
cual no podes aislar la seguridad como deberia serlo.

Un abrazo estimado!!





Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)
Mail: Maxi_accotto[arroba]speedy.com.ar

Msn Messager:

"Leonardo Azpurua" <l e o n a r d o (arroba) m v p s (punto) o r g> escribió
en el mensaje news:

"MAXI" escribió en el mensaje
news:%
Estimado: si usas Sql-Dinamico tampoco usaras el plan de ejecucion ;-) y
ademas permitiras la injeccion de codigo, con lo cual tu SP pasa a ser:}

Inseguro y Lento!! las dos grandes virtudes de los SP lo pierdes
enseguida
:(



Hola, Maxi:

Ese asunto de la "inyección de SQL" me preocupa y no me preocupa.

Me preocupa porque es una putada que alguien pueda insertar codigo
adicional
en una sentencia enviada desde mi aplicacion.

No me preocupa porque tengo la idea de que la técnica que uso para armar
la
sentencias dinámicas impide por completo la inyeccion de codigo.

La mayoria de las sentencias dinamicas que armo desde la aplicación tienen
la parte variable en la clausula WHERE, es decir, algo como esto:

SELECT <campos> FROM <tablas> WHERE <condiciones>

donde las condiciones que no establecen relaciones (del tipo Tm.Ca =
Tn.Cb)
tienen la forma <NombreCol> = <Literal> y
<Literal>::=<literalAlfa>|<literalNumerico>|<literalFecha>
cada uno de estos tipos de literal presenta un problema particular. Los
alfanumericos, por ejemplo, pueden contener el delimitador (' e.g.
McDonald's). Esto lo resuelvo reemplazando el delimitador por dos
delimitadores. Y eso lo hago en una función llamada StringDB, que en
esencia
reemplaza los apostrofes por doble apostrofe y delimta el argumento.
[StringDB("McDonald's") = 'McDonald''s'

Los campos numéricos no pueden usar la coma como separador decimal, de
manera que tuve que escribir NumeroDB(arg As Double), que utiliza
Trim(Str(Arg)). Str representa los numeros en "formato interno", ignorando
los separadores de millar y utilizando siempre el punto como separador
decimal.

Y por ultimo, FechaDB(arg As Date), convierte la fecha al formato que
espera
el proveedor especifico #yyyy-dd-mm# si es Access o {d 'yyyy-mm-dd'} si es
SQL Server.

El asunto es que sólo es posible "inyectar" codigo como parte de un
string.
Hasta donde he visto, la inyección se realiza insertando codigo adicional
en
un argumento de cadena.

Si uno escribe, por ejemplo, "WHERE Password = '" & Variable & "' ..., el
tipo malo podría descubrir la manera de asignar a Variable el valor "X' OR
'A' = 'A", y al armarse la sentencia obtendriamos
WHERE Password = 'X' OR 'A' = 'A'
que es cierta independientemente del valor de Password, ya que A=A es
siempre verdadera.

Pero si usamos WHERE Password = " & StringDB(Variable) & ..., tengo la
impresión de que es imposible inyectar código (si Variable = "X' Or 'A' > 'A", StringDB(Variable) = X'' Or ''A''=''A, y la instruccion resultante
seria:
WHERE Password = 'X'' Or ''A'' = ''A'
es decir que a menos que el Password sea exactamente X' Or 'A' = 'A, la
condicion sera falsa.

La pregunta que te hago es la siguiente: ¿basta con empaquetar -del lado
de
la aplicacion- los argumentos en funciones que validen la consistencia del
tipo de datos para impedir la inyección de código?

Y si tu respuesta es no, ¿podrias explicar (de manera convincente -y sabes
la clase de plaga esceptica que soy- ) por qué? ;-D

Salud y Gracias!

Leonardo
mvp vb


Respuesta Responder a este mensaje
#15 Yan Carlos
25/09/2004 - 15:41 | Informe spam
Hola Maxi... esa tabla ya estaba creada cuado llegue a trabajar por eso no
puedo hacer nada...

Ventas200409 = 09 es setiembre, pero con la funcion month() yo obtengo 9,
por eso quiero darle el formato de 09 y poner algo asi:
Ventas + Year(Getdate()) + format(Month(Getdate()),'00')


"MAXI" escribió en el mensaje
news:
mmm, sabes que ese diseño no me gusta :(, es muy dificil de mantener y


poder
hacer algo :(. Porque no hacerlo con los registros? no por columna?

De todas formas no entiendo porque el 09 en el formato :-s




Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)
Mail: Maxi_accotto[arroba]speedy.com.ar

Msn Messager:

"Yan Carlos" escribió en el mensaje
news:
> Hola Maxi... sabes que tengo que armar mi sql asi, porque tengo una


tabla
> (se que no es la mejor forma) que tiene estos campos:
>
> Venta200401=Venta del año 2004 del mes 01(Enero)
> Venta200402=Venta del año 2004 del mes 02(Febrero)...
> y asi creo una columna por mes...
> por eso es que tengo que concatenar y darle un formato 09 si quiero ver
> las
> ventas del mes de Julio...
>
> Alguna idea?
>
> "Maxi" escribió en el mensaje
> news:
>> Yan, esas cosas las deberias hacer en la capa de presentacion y no en


la
>> BDD.
>>
>>
>> Salu2
>> Maxi
>> Buenos Aires - Argentina
>> Desarrollador Microsoft 3 Estrellas .NET
>> Nunca consideres el estudio como una obligación sino como
>> una oportunidad para penetrar en el bello y maravillosos
>> mundo del saber.
>> - Albert Einstein
>>
>>
>>
>> "Yan Carlos" escribió en el


mensaje
>> news:%
>> > gracias por la rapidez de sus respuestas salio OK otra consulta
>> > como
>> le
>> > puedo dar un formato por ejemplo al numero 9 para que sea 09, algo


como
> el
>> > format en visual basic..
>> > Gracias
>> > "Ivan Mostacero" escribió en el mensaje
>> > news:
>> > > asi podria ser : Exec(@misql)
>> > > saludos.
>> > > "Yan Carlos" wrote in message
>> > > news:
>> > > > Hola necesito la ayuda de Uds por favor...
>> > > > Estoy armando una sentencia SQL y concatenandola en una variable
>> hasta
>> > > que
>> > > > tenga la estructura adecuada... una vez que tengo toda la


sentencia
>> como
>> > > la
>> > > > ejecuto... algo asi
>> > > > Set @misql = 'SELECT * '
>> > > > Set @misql=@misql + 'FROM Tabla'
>> > > > Como veo el resultado de la consulta que tiene @misql
>> > > > Muchas gracias, espero su pronta respuesta...
>> > > >
>> > > > Saludos
>> > > > YAN
>> > > >
>> > > >
>> > >
>> > >
>> >
>> >
>>
>>
>>
>> Outgoing mail is certified Virus Free.
>> Checked by AVG anti-virus system (http://www.grisoft.com).
>> Version: 6.0.764 / Virus Database: 511 - Release Date: 15/09/2004
>>
>>
>
>


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida