Marcadores de posición para cshtml - ASP.NET

4

Estoy aprendiendo Seguridad de aplicaciones, y tutoriales como www.asp.net tratan sobre la actualización de bases de datos con marcadores de posición, en lugar de usar directamente la información del usuario

@{
    var title = "";
    var genre = "";
    var year = "";
    var movieId = "";

    if(IsPost){
        Validation.RequireField("title", "You must enter a title");
        Validation.RequireField("genre", "Genre is required");
        Validation.RequireField("year", "You haven't entered a year");
        Validation.RequireField("movieid", "No movie ID was submitted!");

        title = Request.Form["title"];
        genre = Request.Form["genre"];
        year = Request.Form["year"];
        movieId = Request.Form["movieId"];

        if(Validation.IsValid()){
            var db = Database.Open("WebPagesMovies");
            var updateCommand = "UPDATE Movies SET Title=@0, Genre=@1, Year=@2 WHERE Id=@3";
            db.Execute(updateCommand, title, genre, year, movieId);
            Response.Redirect("~/Movies");
       }
    }
}

Estoy confundido. ¿Todavía no estás tomando datos de usuario? Estoy tratando de encontrar un ejemplo de código no seguro que no use marcadores de posición, pero todo lo que obtengo es "validar la entrada del usuario"

¿Alguna idea?

    
pregunta Glowie 17.11.2014 - 18:41
fuente

2 respuestas

7

Un término más común para esto es "SQL parametrizado". Aún está tomando datos de usuario, como señaló, pero la seguridad radica en el hecho de que la aplicación sabe qué es información y qué es ejecutable.

Cuando creas una declaración SQL como una cadena y la pasas en su totalidad a la base de datos, la aplicación simplemente tiene que confiar en que el comando SQL que se está ejecutando es lo que pretendías, y los datos del usuario no lo han modificado maliciosamente durante construcción.

Cuando los datos del usuario se pasan por separado de la declaración SQL como parámetros y valores de parámetros, el comando SQL no puede ser modificado directamente por la entrada del usuario ... Es independiente. La aplicación puede decir absolutamente lo que se supone que es ejecutable, y que nada en los valores de los parámetros debería ser ... Es todos los datos, y solo los datos.

    
respondido por el Xander 17.11.2014 - 19:05
fuente
5

Para ampliar la respuesta de Xander: cuando utiliza una consulta parametrizada, los parámetros nunca se insertan directamente en la declaración. En su lugar, la consulta en sí, junto con todos los parámetros, se pasan a un procedimiento almacenado llamado sp_executesql . Cuando se ejecutan de esta manera, los parámetros se tratan como datos en lugar de ser analizados como parte de una declaración SQL, por lo que la inyección no es posible (a menos que esté utilizando sql dinámico o algo así).

Esto también le brinda la ventaja adicional de usar planes de ejecución en caché que pueden ayudar con el rendimiento.

Si busca ejemplos de SQL inseguro, el código a continuación es un ejemplo:

var updateCommand = "UPDATE Movies SET Title='" + title + "', Genre=@0, Year=@1 WHERE Id=@2";
db.Execute(updateComman, genre, year, movieId);

En este ejemplo, podría inyectar a través de la variable title .

    
respondido por el Abe Miessler 17.11.2014 - 19:32
fuente

Lea otras preguntas en las etiquetas