[VB 2005 Express] Query sicura?

sabato 09 maggio 2009 - 19.23

alexmed Profilo | Guru

Ciao a tutti,
Per aumentare le potenzialità di ricerca su una tabella mi sono inventato questa procedura:
Questo consente di inserire più nomi nella casella di ricerca, separati da una virgola, da caricare poi su una DataGridView.

Dim cmdString As String = "SELECT * FROM Anagrafica WHERE " & Me.cmbColonna.Text & " = '"

Dim txt() As String = Me.txtTEXT.Text.Split(",")

cmdString &= txt(0).Trim() & "'"

If UBound(txt) > 0 Then
For index As Integer = 1 To UBound(txt)
cmdString &= " Or " & Me.cmbColonna.Text & " = '" & txt(index).Trim() & "'"
Next
End If

Ora mi chiedo:
Esiste un'altro metodo per ottenere lo stesso risultato?
Così come viene creata la query, incorrerei in problemi di sicurezza (SQL Injection)?

Grazie e ciao
alexmed

e.disanto Profilo | Junior Member

Ciao,
dal codice mi è sembrato di capire che hai una combo in cui selezioni il campo su cui vuoi effettuare il filtro, e nella textbox inserisci i valori da ricercare per quel campo (separati da virgola), giusto?
Guarda, io per prima cosa farei un replace del carattere ' (apice singolo) con un '' (non è un doppio apice, ma due apici singoli) sui valori che l'utente inserisce nella textbox, così sei sicuro che almeno non vada in errore in caso di inserimento di valori con l'apice, e poi elimini già una gran parte di possibili attacchi di SQL Injection

Ernesto di Santo

alx_81 Profilo | Guru

>Ciao a tutti,
Ciao

>Ora mi chiedo:
>Esiste un'altro metodo per ottenere lo stesso risultato?
Sì, tramite stored procedure o con query parametriche, evitando la concatenazione delle stringhe SQL perchè, come giustamente dici tu, puoi incorrere in attacchi SQL Injection.
Leggi qui per maggiori info: http://www.dotnethell.it/articles/SQL-Injection-Tutorial-Security.aspx

Quoto inoltre e. disanto che dice che una replace rimuove di molto gli attacchi sql injection.

Con le stored procedure puoi creare dinamicamente l'sql al loro interno e poi lanciarlo con sp_executesql
http://msdn.microsoft.com/it-it/library/ms188001.aspx

oppure sia con le query parametriche sia con le stored procedure puoi usare la seguente logica (non molto performante, ma efficace con poche righe):
SELECT <campi> FROM <tabella> WHERE @parametro1 IS NULL OR campo1 = @parametro AND @parametro2 IS NULL OR campo2 = @parametro ...

>Grazie e ciao
>alexmed

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

alexmed Profilo | Guru

Ciao Ernesto, ciao Alessandro
Grazie delle risposte!

Il dubbio mi è venuto proprio leggendo l'articolo citato da e di Alessandro.

Non mi resta che studiarmi la paginetta relativa a sp_executesql e fare un pò di prove.

Ciao

alexmed

alx_81 Profilo | Guru

facci sapere
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5