2010-10-25 17 views
9

Ho questo codicePrevenire SQL Injection in ASP.Net

UPDATE OPENQUERY (db,'SELECT * FROM table WHERE ref = ''"+ Ref +"'' AND bookno = ''"+ Session("number") +"'' ') 

Come dovrei evitare che l'iniezione SQL su questo?

UPDATE

Ecco quello che sto cercando

SqlCommand cmd = new SqlCommand("Select * from Table where [email protected]", con); 
cmd.Parameters.AddWithValue("@ref", 34); 

Per qualche ragione tutto quello che provo e aggiungo che non sembra funzionare continuo a ricevere SQL Command di seguito indicate.

L'errore è questo

'SqlCommand' is a type and cannot be used as an expression 

sto prendendo più di qualcun altro lavoro quindi questo è tutto nuovo per me e vorrei fare le cose nel modo giusto quindi se qualcuno può fornire più aiuto su come fare la mia domanda sopra al sicuro da iniezioni SQL, quindi si prega di fare.

UPDATE NO 2

ho aggiunto nel codice come detto VasilP come questo

Dim dbQuery As [String] = "SELECT * FROM table WHERE ref = '" & Tools.SQLSafeString(Ref) & "' AND bookno = '" & Tools.SQLSafeString(Session("number")) & "'" 

ma ottengo un errore di Tools is not declared ho bisogno per specificare un determinato spazio dei nomi per farlo funzionare?

UPDATE

Chiunque ha ottenuto delle idee sul migliore di ottenere la mia domanda al sicuro da SQL injection, senza gli errori che sto vivendo?

UPDATE

ora ho esso in modo da funzionare senza i parametri bit Ecco il mio codice sorgente aggiornato idea del perché non aggiungerà il valore del parametro?

Dim conn As SqlConnection = New SqlConnection("server='server1'; user id='w'; password='w'; database='w'; pooling='false'") 
    conn.Open() 


Dim query As New SqlCommand("Select * from openquery (db, 'Select * from table where investor = @investor ') ", conn) 
query.Parameters.AddWithValue("@investor", 69836) 

dgBookings.DataSource = query.ExecuteReader 
dgBookings.DataBind() 

funziona così

Dim conn As SqlConnection = New SqlConnection("server='server1'; user id='w'; password='w'; database='w'; pooling='false'") 
    conn.Open() 


Dim query As New SqlCommand("Select * from openquery (db, 'Select * from table where investor = 69836') ", conn) 

dgBookings.DataSource = query.ExecuteReader 
dgBookings.DataBind() 

l'errore che sto ottenendo è questo

An error occurred while preparing a query for execution against OLE DB provider 'MSDASQL'. 

Ed è perché non va a sostituire il @investor con l'69836

Qualche idea?

SOLUZIONE

Ecco come ho risolto il mio problema

Dim conn As SqlConnection = New SqlConnection("server='h'; user id='w'; password='w'; database='w'; pooling='false'") 

conn.Open() 

Dim query As New SqlCommand("DECLARE @investor varchar(10), @sql varchar(1000) Select @investor = 69836 select @sql = 'SELECT * FROM OPENQUERY(db,''SELECT * FROM table WHERE investor = ''''' + @investor + ''''''')' EXEC(@sql)", conn) 

dgBookings.DataSource = query.ExecuteReader 
dgBookings.DataBind() 

Adesso posso scrivere query senza la preoccupazione di SQL injection

risposta

19

Provare a usare un parameterized query Questo è il link http://www.aspnet101.com/2007/03/parameterized-queries-in-asp-net/

Inoltre, non utilizzare OpenQuery ... utilizzare questo per l'esecuzione Seleziona

SELECT * FROM db...table WHERE ref = @ref AND bookno = @bookno 

Altri articoli che descrivono alcune delle vostre opzioni:

http://support.microsoft.com/kb/314520

What is the T-SQL syntax to connect to another SQL Server?


cura

Nota: la domanda originale era relativa alle query distribuite e ai server collegati. Questa nuova istruzione non fa riferimento a una query distribuita. Posso solo supporre che tu ti stia connettendo direttamente al database ora. Ecco un esempio che dovrebbe funzionare. Ecco un altro sito di riferimento per l'utilizzo di SqlCommand.Parameters

SqlCommand cmd = new SqlCommand("Select * from Table where [email protected]", con); 
cmd.Parameters.Add("@ref", SqlDbType.Int); 
cmd.Parameters["@ref"] = 34; 

Modificato:

Ok Jamie Taylor cercherò di rispondere alla tua domanda di nuovo.

Si utilizza ApriQuery becuase probabilmente si sta utilizzando un legato DB

In sostanza il problema è il metodo ApriQuery prende una stringa non è possibile passare una variabile come parte della stringa che hai inviato a OpenQuery.

È possibile formattare la query in questo modo. La notazione segue servername.databasename.schemaname.tablename. Se si utilizza un server collegato tramite ODBC poi omettere databasename e schemaname, come illustrato di seguito

Dim conn As SqlConnection = New SqlConnection("your SQL Connection String") 
    Dim cmd As SqlCommand = conn.CreateCommand() 
    cmd.CommandText = "Select * db...table where investor = @investor" 
    Dim parameter As SqlParameter = cmd.CreateParameter() 
    parameter.DbType = SqlDbType.Int 
    parameter.ParameterName = "@investor" 
    parameter.Direction = ParameterDirection.Input 
    parameter.Value = 34 
+0

mi sembra di essere sempre gli errori quando si cerca di mettere tutto questo nella mia pagina –

+0

@Jamie Taylor ... avrà bisogno di un po 'più in dettaglio di "Mi sembra di essere sempre gli errori ..." in-fine di aiutare sei fuori. –

+0

Continua a ricevere ''SqlCommand' è un tipo e non può essere usato come espressione' –

5

parametri d'uso, invece di concatenare la query SQL.

Supponendo che il proprio motore di database sia SQL Server, ecco un pezzo di codice che spero possa essere d'aiuto.

Using connection As SqlConnection = new SqlConnection("connectionString") 
    connection.Open() 

    Using command As SqlCommand = connection.CreateCommand() 
     string sqlStatement = "select * from table where ref = @ref and bookno = @bookno"; 
     command.CommandText = sqlStatement 
     command.CommandType = CommandType.Text 

     Dim refParam As SqlDataParameter = command.CreateParameter() 
     refParam.Direction = ParameterDirection.Input 
     refParam.Name = "@ref" 
     refParam.Value = Ref 

     Dim booknoParam As SqlDataParameter = command.CreateParameter() 
     booknoParam.Direction = ParameterDirection.Input 
     booknoParam.Name = "@bookno" 
     booknoParam.Value = Session("number") 

     Try 
      Dim reader As SqlDataReader = command.ExecuteQuery() 
      ' Do your reading job here...' 
     Finally 
      command.Dispose() 
      connection.Dispose() 
     End Try 
    End Using 
End Using 

Per riassumere il tutto, evitare di SQL dichiarazione concatenazione a tutti i costi, e utilizzare quesries parametrizzate!

Ecco un link interessante che vi porta attraverso la risoluzione dei problemi di SQL iniezione su MSDN:

How To: Protect From SQL Injection in ASP.NET

4

uso sqlparameters come:

SqlCommand cmd = new SqlCommand("Select * from Table where [email protected]", con); 
cmd.Parameters.AddWithValue("@id", 34); 
+2

+1 per il metodo 'AddWithValue()'. –

+0

Ho provato questo metodo ma mi ha dato un errore ''SqlCommand' è un tipo e non può essere usato come espressione' –

1

utilizzare LINQ. Parametrizza automaticamente le query.

2
SqlCommand cmd = new SqlCommand("Select * from Table where [email protected]", con); 
cmd.Parameters.AddWithValue("@ref", 34); 

non funziona perché è scritto in C#, non VB.

provare qualcosa di simile

Dim cmd As New SqlCommand("Select * from Table where [email protected]", con) 
cmd.Parameters.AddWithValue("ref", 34) 
+0

Grazie ho aggiunto questo, ma ora sto ottenendo un errore diverso' Impossibile trovare il server 'Sistema' in sysservers . Eseguire sp_addlinkedserver per aggiungere il server a sysservers 'non ha idea di cosa significhi? –

+1

Si dovrebbe verificare la stringa di connessione, è un errore di database ora, non ASP.NET. –

1

Partenza ORM in alternativa (molto buona strada da percorrere se si sta costruendo qualcosa di medie o grandi). Ci vuole un po 'di tempo per configurarlo, ma poi lo sviluppo diventa MOLTO veloce. Puoi scegliere il nativo, Linq to SQL o Entity Framework, OPPURE, provare any other ORM che funziona con .NET.

Problemi correlati