Prevenzione dell'iniezione SQL sostituendo 'con' '[duplicato]

2

Sto lavorando a un'applicazione web vulnerabile all'iniezione SQL nella sua casella di ricerca. Utilizza ASP.Net (C #) e Microsoft SQL Server.

Nella casella di ricerca richiede:

Select Column1 from TBL where Column2 = N'  Here The Search box Content  ';

Come puoi vedere il codice sopra è completamente vulnerabile a SQLi. Quello che ho fatto per mitigare questo è stato solo creando un metodo per sostituire tutto ' con '' che in SQL Server significa che è una singola citazione.

Quindi, se un utente inserisce qualcosa come ' order by -- nella casella di testo, la funzione di sostituzione la sostituirà con Replace("'","''"); e SQL Server non eseguirà mai l'SQL iniettato dell'aggressore.

Quindi voglio solo sapere che sono completamente al sicuro da SQLi? O c'è un modo per aggirare la mia protezione dell'iniezione?

    
posta ᔕIᑎᗩ KᗩᖇᐯᗩᑎᗪI 06.07.2016 - 14:22
fonte

1 risposta

1

No, non è affatto sicuro.

Sostituire virgolette singole con virgolette o viceversa ti terrà al sicuro da un solo tipo di iniezione. Inoltre, cosa succede se l'utente finale ha la necessità legittima di inserire un marchio di virgolette singole?

Come è stato sottolineato nei commenti, dovresti utilizzare Istruzioni preparate .

Di seguito è riportato un esempio tratto da Documentazione Microsoft .

Tuttavia, la tecnica non è esclusiva di Microsoft. Ogni database serio supporta dichiarazioni preparate.

SqlCommand command = new SqlCommand(null, connection);

// Create and prepare an SQL statement.
command.CommandText =
    "INSERT INTO Region (RegionID, RegionDescription) " +
    "VALUES (@id, @desc)";
SqlParameter idParam = new SqlParameter("@id", SqlDbType.Int, 0);
SqlParameter descParam = 
        new SqlParameter("@desc", SqlDbType.Text, 100);
idParam.Value = 20;
descParam.Value = "First Region";
command.Parameters.Add(idParam);
command.Parameters.Add(descParam);

// Call Prepare after setting the Commandtext and Parameters.
command.Prepare();
command.ExecuteNonQuery();
    
risposta data 06.07.2016 - 14:38
fonte

Leggi altre domande sui tag