Estoy tratando de encontrar una manera de explotar mi procedimiento almacenado para probar problemas de seguridad, específicamente he estado probando la inyección basada en el truncamiento de SQL, pero no tuve éxito hasta ahora; No creo que sea necesariamente porque el código es inmune a la inyección de SQL, pero tal vez porque mis casos de prueba no fueron exhaustivos, ¿es este código explotable? Ejemplo?
USE [MyDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[sp_mySP]
@Myfirst nvarchar(10),
@Mysecond nvarchar(400)
AS
BEGIN
DECLARE @SQLString nvarchar(MAX);
DECLARE @ParmDefinition nvarchar(MAX);
SET NOCOUNT ON;
SET @SQLString = N'insert into MyTable (Myfirst, Mysecond) values (@first,@second)';
SET @ParmDefinition = N'@first nvarchar(10),@second nvarchar(400)';
exec sp_executesql
@SQLString,@ParmDefinition,
@first = @Myfirst,
@second = @Mysecond;
END
Para el registro, aquí está el código .NET que accede a la base de datos, sin embargo, quiero que el procedimiento almacenado sea seguro por sí mismo sin suposiciones sobre la función de llamada.
cmd = new SqlCommand("sp_mySP", Con); //The SQL Command
cmd.CommandType = CommandType.StoredProcedure;
//Parameters
SqlParameter first = new SqlParameter("@Myfirst", SqlDbType.NVarChar, 10);
SqlParameter second= new SqlParameter("@Mysecond", SqlDbType.NVarChar, 400);
first.Value = "value-here";// <-- Definitely not the test cases I used
second.Value = "value-here";
cmd.Parameters.Add(first);
cmd.Parameters.Add(second);
Con.Open();
cmd.ExecuteScalar();