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

#1 Maxi [MVP]
29/11/2005 - 02:11 | Informe spam
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_,'
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
#2 Isaias
29/11/2005 - 02:27 | Informe spam
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_,'
> 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
#3 Maxi
29/11/2005 - 12:26 | Informe spam
Hola, bueno lo que estas haciendo es controlar la cadena, mal no esta pero
yo soy mas de la idea de buscar que directamente no se pueda enviar a la
cadena estas cosas, y eso lo controlas desde la aplicacion


Salu2
Maxi [MVP SQL SERVER]


"Isaias" escribió en el mensaje
news:
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_,'
> 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
#4 Alejandro Mesa
29/11/2005 - 16:30 | Informe spam
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_,'
> > 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
#5 Isaias
29/11/2005 - 17:35 | Informe spam
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_,'
> > > 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 Respuesta Tengo una respuesta
Search Busqueda sugerida