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
 

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



Preguntas similares