Come impedire la manomissione dei dati di invio dei moduli e la modifica dei dettagli per qualsiasi account?

1

Anche se questo è qualcosa che solo i dipendenti possono utilizzare, vorrei comunque evitare la manomissione. Non mi piace il codice non sicuro, e questo è terribilmente insicuro.

Ecco un link di esempio:

<a href="#' + j.id + '" onclick="LoadThis(\'Test.aspx?id=' + obj.id + '\', \'post\', null, null);">Edit User #' + j.id + '.</a>

L'ho inviato al lato client usando jQuery:

$.ajax({
    url: "Test.aspx/RemoveUsernameByID",
    type: "POST",
    data: 1,
    beforeSend: function (before) { /* do stuff */ },
    success: function (success) { /* do stuff */ },
    error: function (error) { /* do stuff */ }
});

... e assicurati di utilizzare SqlCommand.Parameters.Add() per evitare cose brutte:

    [WebMethod]
    public static void RemoveUsernameByID(int derp)
    {
        string ConnectionString = "Data Source=herp;Initial Catalog=derp;Integrated Security=True";
        string QueryString = @"DELETE FROM [Herp] where [uid] = @derp";


        using (SqlConnection con = new SqlConnection(ConnectionString))
        using (SqlCommand cmd = new SqlCommand(QueryString, con)) 
        {
            con.Open();
            cmd.Parameters.Add("@derp", SqlDbType.Int).Value = derp;
            cmd.ExecuteNonQuery();
        }
    }

Ora, come puoi vedere, questo è esilarantemente cattivo. Sono in grado di manomettere l'id in data: 1 e di inviare qualsiasi numero al server Web per rimuovere qualsiasi utente che desidero, tramite il loro ID. Quando uso questo tipo di codice, posso farmi amministratore, eliminare qualsiasi utente che desidero, raccogliere informazioni che non dovrei essere in grado, ecc.

Ho pensato di richiedere e inviare un sacco di informazioni extra, come il nome e il cognome dell'utente, o un guid unico, ma tutto ciò che qualcuno deve fare è annusare queste informazioni - che ho appena fatto ! - e raccoglierlo in modo che possano continuare a fare quello che vogliono.

Che cosa dovrei fare?

    
posta heh 13.02.2015 - 19:39
fonte

1 risposta

1

Sembra più una vulnerabilità Direct Object Reference che una vulnerabilità di SQL Injection.

Il modo corretto per garantire ciò sarebbe verificare che la sessione corrente disponga delle autorizzazioni per eseguire l'azione richiesta sul lato server. I dettagli su come questo potrebbe essere inattivo dipendono dal modo in cui hai implementato l'autorizzazione nella tua applicazione, ma leggere la sezione di prevenzione del link che ho fornito dovrebbe essere un buon inizio.

    
risposta data 13.02.2015 - 19:46
fonte

Leggi altre domande sui tag