Inyeccion de codigo

17/03/2005 - 18:37 por Infoliber | Informe spam
Hola,
mirando el help me parecio que para que no me pudieran inyectar codigo
desde un campo de consulta era mejor poner storedprocedures.

He empezado una aplicacion en asp.net y todas las consultas las hago con
storedProcedures pero no veo el motivo por el cual se evita la inyeccion de
codigo, si yo le paso a un parametro una parte de codigo este se pasa al sql
server, lo veo igual que hacer la consulta sin los storedProcedures.

¿Como se puede evitar la inyeccion de codigo?

Gracias

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
17/03/2005 - 19:39 | Informe spam
Una forma de evitar inyeccion atraves de los sp es el tipo de dato de los
parametros. Si declaras @par1 como INT entonces que vas a inyectar?. Tambien
si el parametro es por ejemplo char(3), pues no podras inyectar mucho que
digamos. El problema estaria en aquellos sp que usan sql dinamico y esperan
parametros con tipo de datos char / nchar/ varchar / etc., y para poder
inyectar codigo habria que de alguna manera cerrar la cadena.

Ejemplo:

use northwind
go

alter procedure proc1
@par1 nvarchar(40)
as
set nocount on

declare @sql nvarchar(4000)

set @sql = N'
select *
from customers
where companyname = ''' + @par1 + ''''

print @sql
exec sp_executesql @sql
go

create table t(colA int)
go

exec proc1 N'''; drop table t; select 1 where '''' = '''
go

select * from t
go

Fijate en la sentencia que se armo dinamicamente.

Puedes hacer lo siguiente, si vas a usar sql dinamico. Usar sp_executesql y
no EXEC(), usar parametros en el procedimiento sp_executesql o duplicar todos
los apostrofes dentro del parametro pasado.

alter procedure proc1
@par1 nvarchar(40)
as
set nocount on

declare @sql nvarchar(4000)

set @sql = N'
select *
from customers
where companyname = ''' + replace(@par1, '''', '''''') + ''''

print @sql
exec sp_executesql @sql
go

create table t(colA int)
go

exec proc1 N'''; drop table t; select 1 where '''' = '''
go

select * from t
go

drop table t
go

alter procedure proc1
@par1 nvarchar(40)
as
set nocount on

declare @sql nvarchar(4000)

set @sql = N'
select *
from customers
where companyname = @par1'

print @sql
exec sp_executesql @sql, N'@par1 nvarchar(40)', @par1
go

create table t(colA int)
go

exec proc1 N'''; drop table t; select 1 where '''' = '''
go

select * from t
go

drop table t
go


AMB

"Infoliber" wrote:

Hola,
mirando el help me parecio que para que no me pudieran inyectar codigo
desde un campo de consulta era mejor poner storedprocedures.

He empezado una aplicacion en asp.net y todas las consultas las hago con
storedProcedures pero no veo el motivo por el cual se evita la inyeccion de
codigo, si yo le paso a un parametro una parte de codigo este se pasa al sql
server, lo veo igual que hacer la consulta sin los storedProcedures.

¿Como se puede evitar la inyeccion de codigo?

Gracias



Respuesta Responder a este mensaje
#2 Alejandro Mesa
17/03/2005 - 19:49 | Informe spam
Correccion, puse los enunciados en el script equivocado.

alter procedure proc1
@par1 nvarchar(40)
as
set nocount on

declare @sql nvarchar(4000)

set @sql = N'
select *
from customers
where companyname = ''' + replace(@par1, '''', '''''') + ''''

print @sql
exec sp_executesql @sql
go

create table t(colA int)
go

exec proc1 N'''; drop table t; select 1 where '''' = '''
go

select * from t
go

drop table t
go

alter procedure proc1
@par1 nvarchar(40)
as
set nocount on

declare @sql nvarchar(4000)

set @sql = N'
select *
from customers
where companyname = @par1'

print @sql
exec sp_executesql @sql, N'@par1 nvarchar(40)', @par1
go

create table t(colA int)
go

exec proc1 N'''; drop table t; select 1 where '''' = '''
go

select * from t
go

drop table t
go


AMB


"Alejandro Mesa" wrote:

Una forma de evitar inyeccion atraves de los sp es el tipo de dato de los
parametros. Si declaras @par1 como INT entonces que vas a inyectar?. Tambien
si el parametro es por ejemplo char(3), pues no podras inyectar mucho que
digamos. El problema estaria en aquellos sp que usan sql dinamico y esperan
parametros con tipo de datos char / nchar/ varchar / etc., y para poder
inyectar codigo habria que de alguna manera cerrar la cadena.

Ejemplo:

use northwind
go

alter procedure proc1
@par1 nvarchar(40)
as
set nocount on

declare @sql nvarchar(4000)

set @sql = N'
select *
from customers
where companyname = ''' + @par1 + ''''

print @sql
exec sp_executesql @sql
go

create table t(colA int)
go

exec proc1 N'''; drop table t; select 1 where '''' = '''
go

select * from t
go

Fijate en la sentencia que se armo dinamicamente.

Puedes hacer lo siguiente, si vas a usar sql dinamico. Usar sp_executesql y
no EXEC(), usar parametros en el procedimiento sp_executesql o duplicar todos
los apostrofes dentro del parametro pasado.

alter procedure proc1
@par1 nvarchar(40)
as
set nocount on

declare @sql nvarchar(4000)

set @sql = N'
select *
from customers
where companyname = ''' + replace(@par1, '''', '''''') + ''''

print @sql
exec sp_executesql @sql
go

create table t(colA int)
go

exec proc1 N'''; drop table t; select 1 where '''' = '''
go

select * from t
go

drop table t
go

alter procedure proc1
@par1 nvarchar(40)
as
set nocount on

declare @sql nvarchar(4000)

set @sql = N'
select *
from customers
where companyname = @par1'

print @sql
exec sp_executesql @sql, N'@par1 nvarchar(40)', @par1
go

create table t(colA int)
go

exec proc1 N'''; drop table t; select 1 where '''' = '''
go

select * from t
go

drop table t
go


AMB

"Infoliber" wrote:

> Hola,
> mirando el help me parecio que para que no me pudieran inyectar codigo
> desde un campo de consulta era mejor poner storedprocedures.
>
> He empezado una aplicacion en asp.net y todas las consultas las hago con
> storedProcedures pero no veo el motivo por el cual se evita la inyeccion de
> codigo, si yo le paso a un parametro una parte de codigo este se pasa al sql
> server, lo veo igual que hacer la consulta sin los storedProcedures.
>
> ¿Como se puede evitar la inyeccion de codigo?
>
> Gracias
>
>
>
Respuesta Responder a este mensaje
#3 Maxi
17/03/2005 - 21:26 | Informe spam
Ojo ALe, hay veces que un SP puede tener un param varcghar(300) y ya ahi
puedes injectar mucho codigo aunque no lo creas, y no es necesario usar
sql-dinamico para que esto suceda


Salu2
Maxi


"Alejandro Mesa" escribió en el
mensaje news:
Una forma de evitar inyeccion atraves de los sp es el tipo de dato de los
parametros. Si declaras @par1 como INT entonces que vas a inyectar?.
Tambien
si el parametro es por ejemplo char(3), pues no podras inyectar mucho que
digamos. El problema estaria en aquellos sp que usan sql dinamico y
esperan
parametros con tipo de datos char / nchar/ varchar / etc., y para poder
inyectar codigo habria que de alguna manera cerrar la cadena.

Ejemplo:

use northwind
go

alter procedure proc1
@par1 nvarchar(40)
as
set nocount on

declare @sql nvarchar(4000)

set @sql = N'
select *
from customers
where companyname = ''' + @par1 + ''''

print @sql
exec sp_executesql @sql
go

create table t(colA int)
go

exec proc1 N'''; drop table t; select 1 where '''' = '''
go

select * from t
go

Fijate en la sentencia que se armo dinamicamente.

Puedes hacer lo siguiente, si vas a usar sql dinamico. Usar sp_executesql
y
no EXEC(), usar parametros en el procedimiento sp_executesql o duplicar
todos
los apostrofes dentro del parametro pasado.

alter procedure proc1
@par1 nvarchar(40)
as
set nocount on

declare @sql nvarchar(4000)

set @sql = N'
select *
from customers
where companyname = ''' + replace(@par1, '''', '''''') + ''''

print @sql
exec sp_executesql @sql
go

create table t(colA int)
go

exec proc1 N'''; drop table t; select 1 where '''' = '''
go

select * from t
go

drop table t
go

alter procedure proc1
@par1 nvarchar(40)
as
set nocount on

declare @sql nvarchar(4000)

set @sql = N'
select *
from customers
where companyname = @par1'

print @sql
exec sp_executesql @sql, N'@par1 nvarchar(40)', @par1
go

create table t(colA int)
go

exec proc1 N'''; drop table t; select 1 where '''' = '''
go

select * from t
go

drop table t
go


AMB

"Infoliber" wrote:

Hola,
mirando el help me parecio que para que no me pudieran inyectar
codigo
desde un campo de consulta era mejor poner storedprocedures.

He empezado una aplicacion en asp.net y todas las consultas las hago con
storedProcedures pero no veo el motivo por el cual se evita la inyeccion
de
codigo, si yo le paso a un parametro una parte de codigo este se pasa al
sql
server, lo veo igual que hacer la consulta sin los storedProcedures.

¿Como se puede evitar la inyeccion de codigo?

Gracias



Respuesta Responder a este mensaje
#4 Alejandro Mesa
17/03/2005 - 21:45 | Informe spam
Hombre, donde has estado?

Ojo ALe, hay veces que un SP puede tener un param varcghar(300) y ya ahi
puedes injectar mucho codigo aunque no lo creas, y no es necesario usar
sql-dinamico para que esto suceda



No se me ocurre como, pudieras exponernos un ejemplo?


AMB




"Maxi" wrote:

Ojo ALe, hay veces que un SP puede tener un param varcghar(300) y ya ahi
puedes injectar mucho codigo aunque no lo creas, y no es necesario usar
sql-dinamico para que esto suceda


Salu2
Maxi


"Alejandro Mesa" escribió en el
mensaje news:
> Una forma de evitar inyeccion atraves de los sp es el tipo de dato de los
> parametros. Si declaras @par1 como INT entonces que vas a inyectar?.
> Tambien
> si el parametro es por ejemplo char(3), pues no podras inyectar mucho que
> digamos. El problema estaria en aquellos sp que usan sql dinamico y
> esperan
> parametros con tipo de datos char / nchar/ varchar / etc., y para poder
> inyectar codigo habria que de alguna manera cerrar la cadena.
>
> Ejemplo:
>
> use northwind
> go
>
> alter procedure proc1
> @par1 nvarchar(40)
> as
> set nocount on
>
> declare @sql nvarchar(4000)
>
> set @sql = N'
> select *
> from customers
> where companyname = ''' + @par1 + ''''
>
> print @sql
> exec sp_executesql @sql
> go
>
> create table t(colA int)
> go
>
> exec proc1 N'''; drop table t; select 1 where '''' = '''
> go
>
> select * from t
> go
>
> Fijate en la sentencia que se armo dinamicamente.
>
> Puedes hacer lo siguiente, si vas a usar sql dinamico. Usar sp_executesql
> y
> no EXEC(), usar parametros en el procedimiento sp_executesql o duplicar
> todos
> los apostrofes dentro del parametro pasado.
>
> alter procedure proc1
> @par1 nvarchar(40)
> as
> set nocount on
>
> declare @sql nvarchar(4000)
>
> set @sql = N'
> select *
> from customers
> where companyname = ''' + replace(@par1, '''', '''''') + ''''
>
> print @sql
> exec sp_executesql @sql
> go
>
> create table t(colA int)
> go
>
> exec proc1 N'''; drop table t; select 1 where '''' = '''
> go
>
> select * from t
> go
>
> drop table t
> go
>
> alter procedure proc1
> @par1 nvarchar(40)
> as
> set nocount on
>
> declare @sql nvarchar(4000)
>
> set @sql = N'
> select *
> from customers
> where companyname = @par1'
>
> print @sql
> exec sp_executesql @sql, N'@par1 nvarchar(40)', @par1
> go
>
> create table t(colA int)
> go
>
> exec proc1 N'''; drop table t; select 1 where '''' = '''
> go
>
> select * from t
> go
>
> drop table t
> go
>
>
> AMB
>
> "Infoliber" wrote:
>
>> Hola,
>> mirando el help me parecio que para que no me pudieran inyectar
>> codigo
>> desde un campo de consulta era mejor poner storedprocedures.
>>
>> He empezado una aplicacion en asp.net y todas las consultas las hago con
>> storedProcedures pero no veo el motivo por el cual se evita la inyeccion
>> de
>> codigo, si yo le paso a un parametro una parte de codigo este se pasa al
>> sql
>> server, lo veo igual que hacer la consulta sin los storedProcedures.
>>
>> ¿Como se puede evitar la inyeccion de codigo?
>>
>> Gracias
>>
>>
>>



Respuesta Responder a este mensaje
#5 Maxi
18/03/2005 - 15:43 | Informe spam
Hola mi amigo, te paso un articulo de Miguel Egea donde muestra algunas
cosas de las que te comente ;)

http://www.configuracionesintegrale...p?articulo4

prometo buscarte algo mas especifico en cuento a los parametros de los sp's
:-)


Salu2
Maxi


"Alejandro Mesa" escribió en el
mensaje news:
Hombre, donde has estado?

Ojo ALe, hay veces que un SP puede tener un param varcghar(300) y ya ahi
puedes injectar mucho codigo aunque no lo creas, y no es necesario usar
sql-dinamico para que esto suceda



No se me ocurre como, pudieras exponernos un ejemplo?


AMB




"Maxi" wrote:

Ojo ALe, hay veces que un SP puede tener un param varcghar(300) y ya ahi
puedes injectar mucho codigo aunque no lo creas, y no es necesario usar
sql-dinamico para que esto suceda


Salu2
Maxi


"Alejandro Mesa" escribió en el
mensaje news:
> Una forma de evitar inyeccion atraves de los sp es el tipo de dato de
> los
> parametros. Si declaras @par1 como INT entonces que vas a inyectar?.
> Tambien
> si el parametro es por ejemplo char(3), pues no podras inyectar mucho
> que
> digamos. El problema estaria en aquellos sp que usan sql dinamico y
> esperan
> parametros con tipo de datos char / nchar/ varchar / etc., y para poder
> inyectar codigo habria que de alguna manera cerrar la cadena.
>
> Ejemplo:
>
> use northwind
> go
>
> alter procedure proc1
> @par1 nvarchar(40)
> as
> set nocount on
>
> declare @sql nvarchar(4000)
>
> set @sql = N'
> select *
> from customers
> where companyname = ''' + @par1 + ''''
>
> print @sql
> exec sp_executesql @sql
> go
>
> create table t(colA int)
> go
>
> exec proc1 N'''; drop table t; select 1 where '''' = '''
> go
>
> select * from t
> go
>
> Fijate en la sentencia que se armo dinamicamente.
>
> Puedes hacer lo siguiente, si vas a usar sql dinamico. Usar
> sp_executesql
> y
> no EXEC(), usar parametros en el procedimiento sp_executesql o duplicar
> todos
> los apostrofes dentro del parametro pasado.
>
> alter procedure proc1
> @par1 nvarchar(40)
> as
> set nocount on
>
> declare @sql nvarchar(4000)
>
> set @sql = N'
> select *
> from customers
> where companyname = ''' + replace(@par1, '''', '''''') + ''''
>
> print @sql
> exec sp_executesql @sql
> go
>
> create table t(colA int)
> go
>
> exec proc1 N'''; drop table t; select 1 where '''' = '''
> go
>
> select * from t
> go
>
> drop table t
> go
>
> alter procedure proc1
> @par1 nvarchar(40)
> as
> set nocount on
>
> declare @sql nvarchar(4000)
>
> set @sql = N'
> select *
> from customers
> where companyname = @par1'
>
> print @sql
> exec sp_executesql @sql, N'@par1 nvarchar(40)', @par1
> go
>
> create table t(colA int)
> go
>
> exec proc1 N'''; drop table t; select 1 where '''' = '''
> go
>
> select * from t
> go
>
> drop table t
> go
>
>
> AMB
>
> "Infoliber" wrote:
>
>> Hola,
>> mirando el help me parecio que para que no me pudieran inyectar
>> codigo
>> desde un campo de consulta era mejor poner storedprocedures.
>>
>> He empezado una aplicacion en asp.net y todas las consultas las hago
>> con
>> storedProcedures pero no veo el motivo por el cual se evita la
>> inyeccion
>> de
>> codigo, si yo le paso a un parametro una parte de codigo este se pasa
>> al
>> sql
>> server, lo veo igual que hacer la consulta sin los storedProcedures.
>>
>> ¿Como se puede evitar la inyeccion de codigo?
>>
>> Gracias
>>
>>
>>



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