Segnaposto per cshtml - ASP.NET

4

Sto imparando la sicurezza delle applicazioni e tutorial come www.asp.net discutono dell'aggiornamento dei database con i segnaposto invece di utilizzare direttamente l'input dell'utente

@{
    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");
       }
    }
}

Sono confuso. Non stai ancora acquisendo userdata? Sto cercando di trovare un esempio di codice non sicuro che non utilizzi segnaposto, ma tutto ciò che ottengo è "convalida l'input dell'utente"

Qualche idea?

    
posta Glowie 17.11.2014 - 18:41
fonte

2 risposte

7

Un termine più comune per questo è "SQL parametrizzato". Stai ancora acquisendo dati utente, come hai sottolineato, ma la sicurezza sta nel fatto che l'applicazione conosce quali sono i dati e cosa è eseguibile.

Quando si crea un'istruzione SQL come una stringa e la si trasmette nel suo insieme completo al database, l'applicazione deve semplicemente fidarsi del fatto che il comando SQL che si sta eseguendo è ciò che si intendeva e che non è stato modificato malevolmente dai dati dell'utente durante costruzione.

Quando i dati dell'utente vengono trasmessi separatamente dall'istruzione SQL come parametri e valori dei parametri, il comando SQL non può essere modificato direttamente dall'input dell'utente ... È separato. L'applicazione può dire in modo assoluto ciò che dovrebbe essere eseguibile e che nulla nei valori dei parametri dovrebbe essere ... Sono tutti dati e solo dati.

    
risposta data 17.11.2014 - 19:05
fonte
5

Per espandere la risposta di Xander - quando si utilizza una query con parametri i parametri non vengono mai inseriti direttamente nell'istruzione. Invece, la query stessa insieme a tutti i parametri vengono passati a una stored procedure chiamata sp_executesql . Quando vengono eseguiti in questo modo, i parametri vengono trattati come dati anziché essere analizzati come parte di un'istruzione SQL, quindi Injection non è possibile (a meno che non si utilizzi SQL dinamico o qualcosa del genere).

Questo ti dà anche il vantaggio di utilizzare piani di esecuzione memorizzati nella cache che possono aiutarti con le prestazioni.

Se stai cercando esempi di SQL non sicuri, il codice qui sotto è un esempio:

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

In questo esempio, puoi inserire la variabile title .

    
risposta data 17.11.2014 - 19:32
fonte

Leggi altre domande sui tag