INYECCION DE CODIGO

29/11/2005 - 01:59 por Isaias | Informe spam
Para evitar la inyeccion de codigo, me han proporcionado esta funcion, ¿Algun
comentario?

CREATE FUNCTION dbo.fn_validatebadcode(
@variable nvarchar(4000)) RETURNS nvarchar(4000) AS
BEGIN
DECLARE @return_string nvarchar(4000)
DECLARE @badChars nvarchar(40)
DECLARE @badChar varchar(10), @Pos int

SET @badChars = 'select,drop,;,--,insert,delete,xp_,'
comas
SET @return_string = @variable
SET @Pos = CHARINDEX(',', @badChars, 1)

IF REPLACE(@badChars, ',', '') <> ''
BEGIN
WHILE @Pos > 0
BEGIN
SET @badChar = LTRIM(RTRIM(LEFT(@badChars, @Pos - 1)))
IF @badChar <> ''
BEGIN
SELECT @return_string = REPLACE(@return_string,@badChar,'')
END

SET @badChars = RIGHT(@badChars, LEN(@badChars) - @Pos)
SET @Pos = CHARINDEX(',', @badChars, 1)
END
END
RETURN @return_string
END


Saludos
IIslas

Preguntas similare

Leer las respuestas

#6 Carlos Sacristán
29/11/2005 - 17:51 | Informe spam
Pues si además de intentar quitarte el sql dinámico, intentas evitar
usar xp_cmdshell, tu aplicación será mucho más segura. Te lo digo porque no
sé qué es más peligroso... Dejar abierto ese procedimiento almacenado es un
agujero de seguridad tremendo


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"Isaias" escribió en el mensaje
news:
Maxi / Gus

Gracias por sus comentarios

Si, en todos los stores donde ejecuto codigo SQL, siempre uso


SP_EXECUTESQL,
el problema vino cuando ejecuto XP_CMDSHELL, ya que necesito crear algunas
carpetas y eliminar algunos archivos DOS.

Tomare muy en cuenta sus comentarios.


Saludos
IIslas


"Alejandro Mesa" escribió:

> Isaias,
>
> > 1.- No usar SQL Dinamico
> > R= Casi imposible en nuestros aplicativos
>
> Si vas a usar sql dinamico, te recomiendo que uses siempre sp_executesql


y
> que lo emplees correctamente. Cuando decimos sql dinamico, nos referimos
> principalmente a la concatenacion de cadenas, unas fijas y otras


entradas por
> el usuario. Fijate en este ejemplo:
>
> use northwind
> go
>
> select top 1 orderid into dbo.t1 from dbo.orders
> go
>
> create procedure dbo.p1
> @p1 nvarchar(40)
> as
> set nocount on
>
> declare @sql nvarchar(4000)
>
> set @sql = N'select * from dbo.customers where companyname = N''' + @p1


+ ''''
>
> exec sp_executesql @sql
>
> return @@error
> go
>
> create procedure dbo.p2
> @p1 nvarchar(40)
> as
> set nocount on
>
> declare @sql nvarchar(4000)
>
> set @sql = N'select * from dbo.customers where companyname = @p1'
>
> exec sp_executesql @sql, N'@p1 nvarchar(40)', @p1
>
> return @@error
> go
>
> exec dbo.p2 N''';drop table dbo.t1;select '''
> go
>
> exec dbo.p1 N''';drop table dbo.t1;select '''
> go
>
> select * from dbo.t1
> go
>
> drop procedure dbo.p1, dbo.p2
> go
>
> Fijate que al ejecutar dbo.p2, sql server no devuelve ninguna fila ya


que no
> existe ningun customer donde companyname sea igual a N''';drop table
> dbo.t1;select '''. Pero en cambio, cuando ejecutamos dbo.p1, sql server


no
> retorna ninguna fila porque no existe un customer donde companyname sea


igual
> a cadena vacia '' pero ademas ejecuta "drop table dbo.t1" y la sentencia
> "select ''".
>
> La funcion que te pasaron es util si todas las aplicaciones la usan,


pero
> recuerda que se puede accesar a una base de datos usando otras


aplicaciones,
> no solo las que ustedes crearon y esto hace que la db quede abierta a
> inyeccion de codigo.
>
>
> AMB
>
> "Isaias" wrote:
>
> > Hola Maxi
> >
> > Pues mira, quien me dio la función fue gente de SEGURIDAD EN


INFORMATICA de
> > mi empresa, en realidad, para cuidar la inyeccion de codigo en mis


bases de
> > datos, simplemente hacia un:
> >
> > SET @MyParametroVarchar = REPLACE(@MyParametroVarchar, CHAR(39), '')
> >
> > Y esta funcionando.
> >
> > 1.- No usar SQL Dinamico
> > R= Casi imposible en nuestros aplicativos
> > 2.- Controlar comillas
> > R= Ya lo hago
> > 3.- Manejar PARAMETROS y no EXEC SP's
> > R= Lo voy a comentar con mi area de construccion
> >
> > ¿Como pretenden que lo use?
> >
> > SET @MyParametroVarchar = fn_validatebadcode(@MyParametroVarchar)
> >
> > En donde quiera que reciba un parametro de cadena.
> >
> > Saludos
> > IIslas
> >
> >
> > "Maxi [MVP]" escribió:
> >
> > > Hola, y como la usarias? yo creo que lo mejor en lo que respecta a


seguridad
> > > es no dejar la injection de codigo, para ello:
> > >
> > > -Evitar sql dinamico
> > > -Controlar las comillas
> > > -Manejar desde la aplicacion parametros y no EXEC SP's
> > >
> > >
> > > Salu2
> > > -
> > > [MVP] SQL Server
> > > Orador para Culminis Latam
> > > www.sqlgurus.org
> > >
> > >
> > >
> > > "Isaias" escribió en el mensaje
> > > news:
> > > > Para evitar la inyeccion de codigo, me han proporcionado esta


funcion,
> > > > ¿Algun
> > > > comentario?
> > > >
> > > > CREATE FUNCTION dbo.fn_validatebadcode(
> > > > @variable nvarchar(4000)) RETURNS nvarchar(4000) AS
> > > > BEGIN
> > > > DECLARE @return_string nvarchar(4000)
> > > > DECLARE @badChars nvarchar(40)
> > > > DECLARE @badChar varchar(10), @Pos int
> > > >
> > > > SET @badChars = 'select,drop,;,--,insert,delete,xp_,'


delimitada por
> > > > comas
> > > > SET @return_string = @variable
> > > > SET @Pos = CHARINDEX(',', @badChars, 1)
> > > >
> > > > IF REPLACE(@badChars, ',', '') <> ''
> > > > BEGIN
> > > > WHILE @Pos > 0
> > > > BEGIN
> > > > SET @badChar = LTRIM(RTRIM(LEFT(@badChars, @Pos - 1)))
> > > > IF @badChar <> ''
> > > > BEGIN
> > > > SELECT @return_string REPLACE(@return_string,@badChar,'')
> > > > END
> > > >
> > > > SET @badChars = RIGHT(@badChars, LEN(@badChars) - @Pos)
> > > > SET @Pos = CHARINDEX(',', @badChars, 1)
> > > > END
> > > > END
> > > > RETURN @return_string
> > > > END
> > > >
> > > >
> > > > Saludos
> > > > IIslas
> > >
> > >
> > >
Respuesta Responder a este mensaje
#7 Maxi
29/11/2005 - 18:25 | Informe spam
Exacto!! es mas, en sql2005 lo debes habilitar porque por default no viene
;-)


Salu2
Maxi [MVP SQL SERVER]


"Carlos Sacristán" <csacristanARROBAmvpsPUNTOorg> escribió en el mensaje
news:%
Pues si además de intentar quitarte el sql dinámico, intentas evitar
usar xp_cmdshell, tu aplicación será mucho más segura. Te lo digo porque
no
sé qué es más peligroso... Dejar abierto ese procedimiento almacenado es
un
agujero de seguridad tremendo


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"Isaias" escribió en el mensaje
news:
Maxi / Gus

Gracias por sus comentarios

Si, en todos los stores donde ejecuto codigo SQL, siempre uso


SP_EXECUTESQL,
el problema vino cuando ejecuto XP_CMDSHELL, ya que necesito crear
algunas
carpetas y eliminar algunos archivos DOS.

Tomare muy en cuenta sus comentarios.


Saludos
IIslas


"Alejandro Mesa" escribió:

> Isaias,
>
> > 1.- No usar SQL Dinamico
> > R= Casi imposible en nuestros aplicativos
>
> Si vas a usar sql dinamico, te recomiendo que uses siempre
> sp_executesql


y
> que lo emplees correctamente. Cuando decimos sql dinamico, nos
> referimos
> principalmente a la concatenacion de cadenas, unas fijas y otras


entradas por
> el usuario. Fijate en este ejemplo:
>
> use northwind
> go
>
> select top 1 orderid into dbo.t1 from dbo.orders
> go
>
> create procedure dbo.p1
> @p1 nvarchar(40)
> as
> set nocount on
>
> declare @sql nvarchar(4000)
>
> set @sql = N'select * from dbo.customers where companyname = N''' + @p1


+ ''''
>
> exec sp_executesql @sql
>
> return @@error
> go
>
> create procedure dbo.p2
> @p1 nvarchar(40)
> as
> set nocount on
>
> declare @sql nvarchar(4000)
>
> set @sql = N'select * from dbo.customers where companyname = @p1'
>
> exec sp_executesql @sql, N'@p1 nvarchar(40)', @p1
>
> return @@error
> go
>
> exec dbo.p2 N''';drop table dbo.t1;select '''
> go
>
> exec dbo.p1 N''';drop table dbo.t1;select '''
> go
>
> select * from dbo.t1
> go
>
> drop procedure dbo.p1, dbo.p2
> go
>
> Fijate que al ejecutar dbo.p2, sql server no devuelve ninguna fila ya


que no
> existe ningun customer donde companyname sea igual a N''';drop table
> dbo.t1;select '''. Pero en cambio, cuando ejecutamos dbo.p1, sql server


no
> retorna ninguna fila porque no existe un customer donde companyname sea


igual
> a cadena vacia '' pero ademas ejecuta "drop table dbo.t1" y la
> sentencia
> "select ''".
>
> La funcion que te pasaron es util si todas las aplicaciones la usan,


pero
> recuerda que se puede accesar a una base de datos usando otras


aplicaciones,
> no solo las que ustedes crearon y esto hace que la db quede abierta a
> inyeccion de codigo.
>
>
> AMB
>
> "Isaias" wrote:
>
> > Hola Maxi
> >
> > Pues mira, quien me dio la función fue gente de SEGURIDAD EN


INFORMATICA de
> > mi empresa, en realidad, para cuidar la inyeccion de codigo en mis


bases de
> > datos, simplemente hacia un:
> >
> > SET @MyParametroVarchar = REPLACE(@MyParametroVarchar, CHAR(39), '')
> >
> > Y esta funcionando.
> >
> > 1.- No usar SQL Dinamico
> > R= Casi imposible en nuestros aplicativos
> > 2.- Controlar comillas
> > R= Ya lo hago
> > 3.- Manejar PARAMETROS y no EXEC SP's
> > R= Lo voy a comentar con mi area de construccion
> >
> > ¿Como pretenden que lo use?
> >
> > SET @MyParametroVarchar = fn_validatebadcode(@MyParametroVarchar)
> >
> > En donde quiera que reciba un parametro de cadena.
> >
> > Saludos
> > IIslas
> >
> >
> > "Maxi [MVP]" escribió:
> >
> > > Hola, y como la usarias? yo creo que lo mejor en lo que respecta a


seguridad
> > > es no dejar la injection de codigo, para ello:
> > >
> > > -Evitar sql dinamico
> > > -Controlar las comillas
> > > -Manejar desde la aplicacion parametros y no EXEC SP's
> > >
> > >
> > > Salu2
> > > -
> > > [MVP] SQL Server
> > > Orador para Culminis Latam
> > > www.sqlgurus.org
> > >
> > >
> > >
> > > "Isaias" escribió en el mensaje
> > > news:
> > > > Para evitar la inyeccion de codigo, me han proporcionado esta


funcion,
> > > > ¿Algun
> > > > comentario?
> > > >
> > > > CREATE FUNCTION dbo.fn_validatebadcode(
> > > > @variable nvarchar(4000)) RETURNS nvarchar(4000) AS
> > > > BEGIN
> > > > DECLARE @return_string nvarchar(4000)
> > > > DECLARE @badChars nvarchar(40)
> > > > DECLARE @badChar varchar(10), @Pos int
> > > >
> > > > SET @badChars = 'select,drop,;,--,insert,delete,xp_,'


delimitada por
> > > > comas
> > > > SET @return_string = @variable
> > > > SET @Pos = CHARINDEX(',', @badChars, 1)
> > > >
> > > > IF REPLACE(@badChars, ',', '') <> ''
> > > > BEGIN
> > > > WHILE @Pos > 0
> > > > BEGIN
> > > > SET @badChar = LTRIM(RTRIM(LEFT(@badChars, @Pos - 1)))
> > > > IF @badChar <> ''
> > > > BEGIN
> > > > SELECT @return_string > REPLACE(@return_string,@badChar,'')
> > > > END
> > > >
> > > > SET @badChars = RIGHT(@badChars, LEN(@badChars) - @Pos)
> > > > SET @Pos = CHARINDEX(',', @badChars, 1)
> > > > END
> > > > END
> > > > RETURN @return_string
> > > > END
> > > >
> > > >
> > > > Saludos
> > > > IIslas
> > >
> > >
> > >




Respuesta Responder a este mensaje
#8 Isaias
29/11/2005 - 22:52 | Informe spam
Bien, entonces, cambio mi pregunta:

¿Como crear carpetas o ejecutar comandos de DOS desde SQL Server?

Ejemplo:

DIR *.*
DEL \\Server\CarpetaMyArchivo.txt
COPY \\Server\CarpetaMyArchivo.txt \\OtroServer\Carpeta2\*.*

Etc.

Saludos
IIslas


"Maxi" escribió:

Exacto!! es mas, en sql2005 lo debes habilitar porque por default no viene
;-)


Salu2
Maxi [MVP SQL SERVER]


"Carlos Sacristán" <csacristanARROBAmvpsPUNTOorg> escribió en el mensaje
news:%
> Pues si además de intentar quitarte el sql dinámico, intentas evitar
> usar xp_cmdshell, tu aplicación será mucho más segura. Te lo digo porque
> no
> sé qué es más peligroso... Dejar abierto ese procedimiento almacenado es
> un
> agujero de seguridad tremendo
>
>
> Un saludo
>
> -
> "Sólo sé que no sé nada. " (Sócrates)
>
> "Isaias" escribió en el mensaje
> news:
>> Maxi / Gus
>>
>> Gracias por sus comentarios
>>
>> Si, en todos los stores donde ejecuto codigo SQL, siempre uso
> SP_EXECUTESQL,
>> el problema vino cuando ejecuto XP_CMDSHELL, ya que necesito crear
>> algunas
>> carpetas y eliminar algunos archivos DOS.
>>
>> Tomare muy en cuenta sus comentarios.
>>
>>
>> Saludos
>> IIslas
>>
>>
>> "Alejandro Mesa" escribió:
>>
>> > Isaias,
>> >
>> > > 1.- No usar SQL Dinamico
>> > > R= Casi imposible en nuestros aplicativos
>> >
>> > Si vas a usar sql dinamico, te recomiendo que uses siempre
>> > sp_executesql
> y
>> > que lo emplees correctamente. Cuando decimos sql dinamico, nos
>> > referimos
>> > principalmente a la concatenacion de cadenas, unas fijas y otras
> entradas por
>> > el usuario. Fijate en este ejemplo:
>> >
>> > use northwind
>> > go
>> >
>> > select top 1 orderid into dbo.t1 from dbo.orders
>> > go
>> >
>> > create procedure dbo.p1
>> > @p1 nvarchar(40)
>> > as
>> > set nocount on
>> >
>> > declare @sql nvarchar(4000)
>> >
>> > set @sql = N'select * from dbo.customers where companyname = N''' + @p1
> + ''''
>> >
>> > exec sp_executesql @sql
>> >
>> > return @@error
>> > go
>> >
>> > create procedure dbo.p2
>> > @p1 nvarchar(40)
>> > as
>> > set nocount on
>> >
>> > declare @sql nvarchar(4000)
>> >
>> > set @sql = N'select * from dbo.customers where companyname = @p1'
>> >
>> > exec sp_executesql @sql, N'@p1 nvarchar(40)', @p1
>> >
>> > return @@error
>> > go
>> >
>> > exec dbo.p2 N''';drop table dbo.t1;select '''
>> > go
>> >
>> > exec dbo.p1 N''';drop table dbo.t1;select '''
>> > go
>> >
>> > select * from dbo.t1
>> > go
>> >
>> > drop procedure dbo.p1, dbo.p2
>> > go
>> >
>> > Fijate que al ejecutar dbo.p2, sql server no devuelve ninguna fila ya
> que no
>> > existe ningun customer donde companyname sea igual a N''';drop table
>> > dbo.t1;select '''. Pero en cambio, cuando ejecutamos dbo.p1, sql server
> no
>> > retorna ninguna fila porque no existe un customer donde companyname sea
> igual
>> > a cadena vacia '' pero ademas ejecuta "drop table dbo.t1" y la
>> > sentencia
>> > "select ''".
>> >
>> > La funcion que te pasaron es util si todas las aplicaciones la usan,
> pero
>> > recuerda que se puede accesar a una base de datos usando otras
> aplicaciones,
>> > no solo las que ustedes crearon y esto hace que la db quede abierta a
>> > inyeccion de codigo.
>> >
>> >
>> > AMB
>> >
>> > "Isaias" wrote:
>> >
>> > > Hola Maxi
>> > >
>> > > Pues mira, quien me dio la función fue gente de SEGURIDAD EN
> INFORMATICA de
>> > > mi empresa, en realidad, para cuidar la inyeccion de codigo en mis
> bases de
>> > > datos, simplemente hacia un:
>> > >
>> > > SET @MyParametroVarchar = REPLACE(@MyParametroVarchar, CHAR(39), '')
>> > >
>> > > Y esta funcionando.
>> > >
>> > > 1.- No usar SQL Dinamico
>> > > R= Casi imposible en nuestros aplicativos
>> > > 2.- Controlar comillas
>> > > R= Ya lo hago
>> > > 3.- Manejar PARAMETROS y no EXEC SP's
>> > > R= Lo voy a comentar con mi area de construccion
>> > >
>> > > ¿Como pretenden que lo use?
>> > >
>> > > SET @MyParametroVarchar = fn_validatebadcode(@MyParametroVarchar)
>> > >
>> > > En donde quiera que reciba un parametro de cadena.
>> > >
>> > > Saludos
>> > > IIslas
>> > >
>> > >
>> > > "Maxi [MVP]" escribió:
>> > >
>> > > > Hola, y como la usarias? yo creo que lo mejor en lo que respecta a
> seguridad
>> > > > es no dejar la injection de codigo, para ello:
>> > > >
>> > > > -Evitar sql dinamico
>> > > > -Controlar las comillas
>> > > > -Manejar desde la aplicacion parametros y no EXEC SP's
>> > > >
>> > > >
>> > > > Salu2
>> > > > -
>> > > > [MVP] SQL Server
>> > > > Orador para Culminis Latam
>> > > > www.sqlgurus.org
>> > > >
>> > > >
>> > > >
>> > > > "Isaias" escribió en el mensaje
>> > > > news:
>> > > > > Para evitar la inyeccion de codigo, me han proporcionado esta
> funcion,
>> > > > > ¿Algun
>> > > > > comentario?
>> > > > >
>> > > > > CREATE FUNCTION dbo.fn_validatebadcode(
>> > > > > @variable nvarchar(4000)) RETURNS nvarchar(4000) AS
>> > > > > BEGIN
>> > > > > DECLARE @return_string nvarchar(4000)
>> > > > > DECLARE @badChars nvarchar(40)
>> > > > > DECLARE @badChar varchar(10), @Pos int
>> > > > >
>> > > > > SET @badChars = 'select,drop,;,--,insert,delete,xp_,'
> delimitada por
>> > > > > comas
>> > > > > SET @return_string = @variable
>> > > > > SET @Pos = CHARINDEX(',', @badChars, 1)
>> > > > >
>> > > > > IF REPLACE(@badChars, ',', '') <> ''
>> > > > > BEGIN
>> > > > > WHILE @Pos > 0
>> > > > > BEGIN
>> > > > > SET @badChar = LTRIM(RTRIM(LEFT(@badChars, @Pos - 1)))
>> > > > > IF @badChar <> ''
>> > > > > BEGIN
>> > > > > SELECT @return_string > > REPLACE(@return_string,@badChar,'')
>> > > > > END
>> > > > >
>> > > > > SET @badChars = RIGHT(@badChars, LEN(@badChars) - @Pos)
>> > > > > SET @Pos = CHARINDEX(',', @badChars, 1)
>> > > > > END
>> > > > > END
>> > > > > RETURN @return_string
>> > > > > END
>> > > > >
>> > > > >
>> > > > > Saludos
>> > > > > IIslas
>> > > >
>> > > >
>> > > >
>
>



Respuesta Responder a este mensaje
#9 Maxi [MVP]
30/11/2005 - 01:06 | Informe spam
Hola, no lo haria!! no es una funcion del motor de BDD andar creando
carpetas y estas cosas!! Has que cada parte de la aplicacion haga lo que
tiene que hacer y no quieras usar un destornillador para poner clavos ;-)


Salu2
-
[MVP] SQL Server
Orador para Culminis Latam
www.sqlgurus.org



"Isaias" escribió en el mensaje
news:
Bien, entonces, cambio mi pregunta:

¿Como crear carpetas o ejecutar comandos de DOS desde SQL Server?

Ejemplo:

DIR *.*
DEL \\Server\CarpetaMyArchivo.txt
COPY \\Server\CarpetaMyArchivo.txt \\OtroServer\Carpeta2\*.*

Etc.

Saludos
IIslas


"Maxi" escribió:

Exacto!! es mas, en sql2005 lo debes habilitar porque por default no
viene
;-)


Salu2
Maxi [MVP SQL SERVER]


"Carlos Sacristán" <csacristanARROBAmvpsPUNTOorg> escribió en el mensaje
news:%
> Pues si además de intentar quitarte el sql dinámico, intentas evitar
> usar xp_cmdshell, tu aplicación será mucho más segura. Te lo digo
> porque
> no
> sé qué es más peligroso... Dejar abierto ese procedimiento almacenado
> es
> un
> agujero de seguridad tremendo
>
>
> Un saludo
>
> -
> "Sólo sé que no sé nada. " (Sócrates)
>
> "Isaias" escribió en el mensaje
> news:
>> Maxi / Gus
>>
>> Gracias por sus comentarios
>>
>> Si, en todos los stores donde ejecuto codigo SQL, siempre uso
> SP_EXECUTESQL,
>> el problema vino cuando ejecuto XP_CMDSHELL, ya que necesito crear
>> algunas
>> carpetas y eliminar algunos archivos DOS.
>>
>> Tomare muy en cuenta sus comentarios.
>>
>>
>> Saludos
>> IIslas
>>
>>
>> "Alejandro Mesa" escribió:
>>
>> > Isaias,
>> >
>> > > 1.- No usar SQL Dinamico
>> > > R= Casi imposible en nuestros aplicativos
>> >
>> > Si vas a usar sql dinamico, te recomiendo que uses siempre
>> > sp_executesql
> y
>> > que lo emplees correctamente. Cuando decimos sql dinamico, nos
>> > referimos
>> > principalmente a la concatenacion de cadenas, unas fijas y otras
> entradas por
>> > el usuario. Fijate en este ejemplo:
>> >
>> > use northwind
>> > go
>> >
>> > select top 1 orderid into dbo.t1 from dbo.orders
>> > go
>> >
>> > create procedure dbo.p1
>> > @p1 nvarchar(40)
>> > as
>> > set nocount on
>> >
>> > declare @sql nvarchar(4000)
>> >
>> > set @sql = N'select * from dbo.customers where companyname = N''' +
>> > @p1
> + ''''
>> >
>> > exec sp_executesql @sql
>> >
>> > return @@error
>> > go
>> >
>> > create procedure dbo.p2
>> > @p1 nvarchar(40)
>> > as
>> > set nocount on
>> >
>> > declare @sql nvarchar(4000)
>> >
>> > set @sql = N'select * from dbo.customers where companyname = @p1'
>> >
>> > exec sp_executesql @sql, N'@p1 nvarchar(40)', @p1
>> >
>> > return @@error
>> > go
>> >
>> > exec dbo.p2 N''';drop table dbo.t1;select '''
>> > go
>> >
>> > exec dbo.p1 N''';drop table dbo.t1;select '''
>> > go
>> >
>> > select * from dbo.t1
>> > go
>> >
>> > drop procedure dbo.p1, dbo.p2
>> > go
>> >
>> > Fijate que al ejecutar dbo.p2, sql server no devuelve ninguna fila
>> > ya
> que no
>> > existe ningun customer donde companyname sea igual a N''';drop table
>> > dbo.t1;select '''. Pero en cambio, cuando ejecutamos dbo.p1, sql
>> > server
> no
>> > retorna ninguna fila porque no existe un customer donde companyname
>> > sea
> igual
>> > a cadena vacia '' pero ademas ejecuta "drop table dbo.t1" y la
>> > sentencia
>> > "select ''".
>> >
>> > La funcion que te pasaron es util si todas las aplicaciones la usan,
> pero
>> > recuerda que se puede accesar a una base de datos usando otras
> aplicaciones,
>> > no solo las que ustedes crearon y esto hace que la db quede abierta
>> > a
>> > inyeccion de codigo.
>> >
>> >
>> > AMB
>> >
>> > "Isaias" wrote:
>> >
>> > > Hola Maxi
>> > >
>> > > Pues mira, quien me dio la función fue gente de SEGURIDAD EN
> INFORMATICA de
>> > > mi empresa, en realidad, para cuidar la inyeccion de codigo en mis
> bases de
>> > > datos, simplemente hacia un:
>> > >
>> > > SET @MyParametroVarchar = REPLACE(@MyParametroVarchar, CHAR(39),
>> > > '')
>> > >
>> > > Y esta funcionando.
>> > >
>> > > 1.- No usar SQL Dinamico
>> > > R= Casi imposible en nuestros aplicativos
>> > > 2.- Controlar comillas
>> > > R= Ya lo hago
>> > > 3.- Manejar PARAMETROS y no EXEC SP's
>> > > R= Lo voy a comentar con mi area de construccion
>> > >
>> > > ¿Como pretenden que lo use?
>> > >
>> > > SET @MyParametroVarchar = fn_validatebadcode(@MyParametroVarchar)
>> > >
>> > > En donde quiera que reciba un parametro de cadena.
>> > >
>> > > Saludos
>> > > IIslas
>> > >
>> > >
>> > > "Maxi [MVP]" escribió:
>> > >
>> > > > Hola, y como la usarias? yo creo que lo mejor en lo que respecta
>> > > > a
> seguridad
>> > > > es no dejar la injection de codigo, para ello:
>> > > >
>> > > > -Evitar sql dinamico
>> > > > -Controlar las comillas
>> > > > -Manejar desde la aplicacion parametros y no EXEC SP's
>> > > >
>> > > >
>> > > > Salu2
>> > > > -
>> > > > [MVP] SQL Server
>> > > > Orador para Culminis Latam
>> > > > www.sqlgurus.org
>> > > >
>> > > >
>> > > >
>> > > > "Isaias" escribió en el
>> > > > mensaje
>> > > > news:
>> > > > > Para evitar la inyeccion de codigo, me han proporcionado esta
> funcion,
>> > > > > ¿Algun
>> > > > > comentario?
>> > > > >
>> > > > > CREATE FUNCTION dbo.fn_validatebadcode(
>> > > > > @variable nvarchar(4000)) RETURNS nvarchar(4000) AS
>> > > > > BEGIN
>> > > > > DECLARE @return_string nvarchar(4000)
>> > > > > DECLARE @badChars nvarchar(40)
>> > > > > DECLARE @badChar varchar(10), @Pos int
>> > > > >
>> > > > > SET @badChars = 'select,drop,;,--,insert,delete,xp_,'
> delimitada por
>> > > > > comas
>> > > > > SET @return_string = @variable
>> > > > > SET @Pos = CHARINDEX(',', @badChars, 1)
>> > > > >
>> > > > > IF REPLACE(@badChars, ',', '') <> ''
>> > > > > BEGIN
>> > > > > WHILE @Pos > 0
>> > > > > BEGIN
>> > > > > SET @badChar = LTRIM(RTRIM(LEFT(@badChars, @Pos - 1)))
>> > > > > IF @badChar <> ''
>> > > > > BEGIN
>> > > > > SELECT @return_string >> > REPLACE(@return_string,@badChar,'')
>> > > > > END
>> > > > >
>> > > > > SET @badChars = RIGHT(@badChars, LEN(@badChars) - @Pos)
>> > > > > SET @Pos = CHARINDEX(',', @badChars, 1)
>> > > > > END
>> > > > > END
>> > > > > RETURN @return_string
>> > > > > END
>> > > > >
>> > > > >
>> > > > > Saludos
>> > > > > IIslas
>> > > >
>> > > >
>> > > >
>
>



Respuesta Responder a este mensaje
#10 Carlos Sacristán
30/11/2005 - 08:16 | Informe spam
Isaías, estoy de acuerdo con lo que dice Maxi. El que el motor te
permita ejecutar comandos del sistema operativo no significa que ese sea el
propósito para el que se creó. Es lo mismo que pasará con SQL Server 2005
con la integración del CLR: habrá muchísimas preguntas que se harán en el
grupo sobre cómo se hace tal o cual programa, cuando ese no es la finalidad
por la cual se ha integrado.

Yo me replantearía cómo se están haciendo las cosas en esa aplicación y
dejar a cada parte el cometido para el que fue pensada...


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"Isaias" escribió en el mensaje
news:
Bien, entonces, cambio mi pregunta:

¿Como crear carpetas o ejecutar comandos de DOS desde SQL Server?

Ejemplo:

DIR *.*
DEL \\Server\CarpetaMyArchivo.txt
COPY \\Server\CarpetaMyArchivo.txt \\OtroServer\Carpeta2\*.*

Etc.

Saludos
IIslas


"Maxi" escribió:

> Exacto!! es mas, en sql2005 lo debes habilitar porque por default no


viene
> ;-)
>
>
> Salu2
> Maxi [MVP SQL SERVER]
>
>
> "Carlos Sacristán" <csacristanARROBAmvpsPUNTOorg> escribió en el mensaje
> news:%
> > Pues si además de intentar quitarte el sql dinámico, intentas


evitar
> > usar xp_cmdshell, tu aplicación será mucho más segura. Te lo digo


porque
> > no
> > sé qué es más peligroso... Dejar abierto ese procedimiento almacenado


es
> > un
> > agujero de seguridad tremendo
> >
> >
> > Un saludo
> >
> > -
> > "Sólo sé que no sé nada. " (Sócrates)
> >
> > "Isaias" escribió en el mensaje
> > news:
> >> Maxi / Gus
> >>
> >> Gracias por sus comentarios
> >>
> >> Si, en todos los stores donde ejecuto codigo SQL, siempre uso
> > SP_EXECUTESQL,
> >> el problema vino cuando ejecuto XP_CMDSHELL, ya que necesito crear
> >> algunas
> >> carpetas y eliminar algunos archivos DOS.
> >>
> >> Tomare muy en cuenta sus comentarios.
> >>
> >>
> >> Saludos
> >> IIslas
> >>
> >>
> >> "Alejandro Mesa" escribió:
> >>
> >> > Isaias,
> >> >
> >> > > 1.- No usar SQL Dinamico
> >> > > R= Casi imposible en nuestros aplicativos
> >> >
> >> > Si vas a usar sql dinamico, te recomiendo que uses siempre
> >> > sp_executesql
> > y
> >> > que lo emplees correctamente. Cuando decimos sql dinamico, nos
> >> > referimos
> >> > principalmente a la concatenacion de cadenas, unas fijas y otras
> > entradas por
> >> > el usuario. Fijate en este ejemplo:
> >> >
> >> > use northwind
> >> > go
> >> >
> >> > select top 1 orderid into dbo.t1 from dbo.orders
> >> > go
> >> >
> >> > create procedure dbo.p1
> >> > @p1 nvarchar(40)
> >> > as
> >> > set nocount on
> >> >
> >> > declare @sql nvarchar(4000)
> >> >
> >> > set @sql = N'select * from dbo.customers where companyname = N''' +


@p1
> > + ''''
> >> >
> >> > exec sp_executesql @sql
> >> >
> >> > return @@error
> >> > go
> >> >
> >> > create procedure dbo.p2
> >> > @p1 nvarchar(40)
> >> > as
> >> > set nocount on
> >> >
> >> > declare @sql nvarchar(4000)
> >> >
> >> > set @sql = N'select * from dbo.customers where companyname = @p1'
> >> >
> >> > exec sp_executesql @sql, N'@p1 nvarchar(40)', @p1
> >> >
> >> > return @@error
> >> > go
> >> >
> >> > exec dbo.p2 N''';drop table dbo.t1;select '''
> >> > go
> >> >
> >> > exec dbo.p1 N''';drop table dbo.t1;select '''
> >> > go
> >> >
> >> > select * from dbo.t1
> >> > go
> >> >
> >> > drop procedure dbo.p1, dbo.p2
> >> > go
> >> >
> >> > Fijate que al ejecutar dbo.p2, sql server no devuelve ninguna fila


ya
> > que no
> >> > existe ningun customer donde companyname sea igual a N''';drop


table
> >> > dbo.t1;select '''. Pero en cambio, cuando ejecutamos dbo.p1, sql


server
> > no
> >> > retorna ninguna fila porque no existe un customer donde companyname


sea
> > igual
> >> > a cadena vacia '' pero ademas ejecuta "drop table dbo.t1" y la
> >> > sentencia
> >> > "select ''".
> >> >
> >> > La funcion que te pasaron es util si todas las aplicaciones la


usan,
> > pero
> >> > recuerda que se puede accesar a una base de datos usando otras
> > aplicaciones,
> >> > no solo las que ustedes crearon y esto hace que la db quede abierta


a
> >> > inyeccion de codigo.
> >> >
> >> >
> >> > AMB
> >> >
> >> > "Isaias" wrote:
> >> >
> >> > > Hola Maxi
> >> > >
> >> > > Pues mira, quien me dio la función fue gente de SEGURIDAD EN
> > INFORMATICA de
> >> > > mi empresa, en realidad, para cuidar la inyeccion de codigo en


mis
> > bases de
> >> > > datos, simplemente hacia un:
> >> > >
> >> > > SET @MyParametroVarchar = REPLACE(@MyParametroVarchar, CHAR(39),


'')
> >> > >
> >> > > Y esta funcionando.
> >> > >
> >> > > 1.- No usar SQL Dinamico
> >> > > R= Casi imposible en nuestros aplicativos
> >> > > 2.- Controlar comillas
> >> > > R= Ya lo hago
> >> > > 3.- Manejar PARAMETROS y no EXEC SP's
> >> > > R= Lo voy a comentar con mi area de construccion
> >> > >
> >> > > ¿Como pretenden que lo use?
> >> > >
> >> > > SET @MyParametroVarchar fn_validatebadcode(@MyParametroVarchar)
> >> > >
> >> > > En donde quiera que reciba un parametro de cadena.
> >> > >
> >> > > Saludos
> >> > > IIslas
> >> > >
> >> > >
> >> > > "Maxi [MVP]" escribió:
> >> > >
> >> > > > Hola, y como la usarias? yo creo que lo mejor en lo que


respecta a
> > seguridad
> >> > > > es no dejar la injection de codigo, para ello:
> >> > > >
> >> > > > -Evitar sql dinamico
> >> > > > -Controlar las comillas
> >> > > > -Manejar desde la aplicacion parametros y no EXEC SP's
> >> > > >
> >> > > >
> >> > > > Salu2
> >> > > > -
> >> > > > [MVP] SQL Server
> >> > > > Orador para Culminis Latam
> >> > > > www.sqlgurus.org
> >> > > >
> >> > > >
> >> > > >
> >> > > > "Isaias" escribió en el


mensaje
> >> > > > news:
> >> > > > > Para evitar la inyeccion de codigo, me han proporcionado esta
> > funcion,
> >> > > > > ¿Algun
> >> > > > > comentario?
> >> > > > >
> >> > > > > CREATE FUNCTION dbo.fn_validatebadcode(
> >> > > > > @variable nvarchar(4000)) RETURNS nvarchar(4000) AS
> >> > > > > BEGIN
> >> > > > > DECLARE @return_string nvarchar(4000)
> >> > > > > DECLARE @badChars nvarchar(40)
> >> > > > > DECLARE @badChar varchar(10), @Pos int
> >> > > > >
> >> > > > > SET @badChars = 'select,drop,;,--,insert,delete,xp_,'
> > delimitada por
> >> > > > > comas
> >> > > > > SET @return_string = @variable
> >> > > > > SET @Pos = CHARINDEX(',', @badChars, 1)
> >> > > > >
> >> > > > > IF REPLACE(@badChars, ',', '') <> ''
> >> > > > > BEGIN
> >> > > > > WHILE @Pos > 0
> >> > > > > BEGIN
> >> > > > > SET @badChar = LTRIM(RTRIM(LEFT(@badChars, @Pos - 1)))
> >> > > > > IF @badChar <> ''
> >> > > > > BEGIN
> >> > > > > SELECT @return_string > > > REPLACE(@return_string,@badChar,'')
> >> > > > > END
> >> > > > >
> >> > > > > SET @badChars = RIGHT(@badChars, LEN(@badChars) -


@Pos)
> >> > > > > SET @Pos = CHARINDEX(',', @badChars, 1)
> >> > > > > END
> >> > > > > END
> >> > > > > RETURN @return_string
> >> > > > > END
> >> > > > >
> >> > > > >
> >> > > > > Saludos
> >> > > > > IIslas
> >> > > >
> >> > > >
> >> > > >
> >
> >
>
>
>
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida