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

#11 Mauro
30/11/2005 - 13:25 | Informe spam
con
master..xp_cmdshell 'dir *.exe'
pero es verdad, no es para abusar, solo para cosas muy especificas,
saludos

"Isaias" wrote in message
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
> >> > > >
> >> > > >
> >> > > >
> >
> >
>
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida