2012-12-12 14 views
5

Sono un nuovo sviluppatore di ASP.NET e sto sviluppando un'applicazione basata sul Web in cui è presente una barra dei menu con molte opzioni. Alcune di queste opzioni verranno visualizzate solo per l'amministratore. C'è una logica dietro il sistema per verificare se l'utente è un amministratore o meno. Se sì, verranno visualizzate le opzioni. Ho scritto il metodo ma ho un injectiom di sql e voglio rimuoverlo.Come rimuovere l'iniezione sql da questa query e renderla funzionante?

Per vostra informazione, ho il seguente progettazione di database:

  • Utenti tavolo: NetID, Name, Title
  • amministratori tavolo: ID, NetID

Ecco il metodo C#:

private bool isAdmin(string username) 
{ 
     string connString = "Data Source=appSever\\sqlexpress;Initial Catalog=TestDB;Integrated Security=True"; 
     string cmdText = "SELECT ID, NetID FROM dbo.Admins WHERE NetID = '" + NetID + "')"; 
     using (SqlConnection conn = new SqlConnection(connString)) 
     { 
      conn.Open(); 
      // Open DB connection. 
      using (SqlCommand cmd = new SqlCommand(cmdText, conn)) 
      { 
       SqlDataReader reader = cmd.ExecuteReader(); 
       if (reader != null) 
        if (reader.Read()) 
         if (reader["ID"].Equals(1)) 
          return true; 
       return false; 
      } 
     } 
    } 

Ho provato a cambiare facendo quanto cambiando la terza linea a:

string cmdText = "SELECT ID, NetID FROM dbo.Admins WHERE NetID = @NetID)"; 

ma ho ottenuto il seguente errore e io non so perché:

Must declare the scalar variable "@NetID".

la prego di aiutare io nel risolvere questo?

* * UPDATE:

After updating the code to the following: 
    private bool isAdmin(string username) 
    { 
     string NetID = username; 
     string connString = "Data Source=appServer\\sqlexpress;Initial Catalog=TestDB;Integrated Security=True"; 
     string cmdText = "SELECT ID, NetID FROM dbo.Admins WHERE NetID = @NetID"; 
     using (SqlConnection conn = new SqlConnection(connString)) 
     { 
      conn.Open(); 
      // Open DB connection. 
      using (SqlCommand cmd = new SqlCommand(cmdText, conn)) 
      { 
       cmd.Parameters.AddWithValue("@NetID", NetID); 
       SqlDataReader reader = cmd.ExecuteReader(); 
       if (reader != null) 
        if (reader.Read()) 
         if (reader["NetID"] == username) 
          return true; 
       return false; 
      } 
     } 
    } 

ho ottenuto il seguente errore:

la sintassi non corretta in prossimità ')'.

Come risolvere questo problema?

+0

si potrebbe anche prendere in considerazione SQL stored procedure. –

+0

Corretto il problema, vedere la mia modifica :) +1 per rimuovere SQL injection;) – whosrdaddy

+0

Sto ancora affrontando lo stesso problema e ottenendo quell'errore con il seguente: 'SqlDataReader reader = cmd.ExecuteReader();' –

risposta

1

Prova questa

private bool isAdmin(string username) 
{ 
    string connString = "Data Source=appSever\\sqlexpress;Initial Catalog=TestDB;Integrated Security=True"; 
    string cmdText = "SELECT ID, NetID FROM dbo.Admins WHERE NetID = @NetID)"; 
    using (SqlConnection conn = new SqlConnection(connString)) 
    { 
     conn.Open(); 
     // Open DB connection. 
     using (SqlCommand cmd = new SqlCommand(cmdText, conn)) 
     { 
      cmd.Parameters.AddWithValue("@NetID", NetID); 
      SqlDataReader reader = cmd.ExecuteReader(); 
      if (reader != null) 
       if (reader.Read()) 
        if (reader["ID"].Equals(1)) 
         return true; 
      return false; 
     } 
    } 
} 
+0

Grazie per il vostro aiuto. Lo apprezzo molto. Penso di avere un errore nella logica. Perché come vedi nella mia progettazione di database nella domanda NetID è una chiave esterna dalla tabella degli amministratori alla tabella degli utenti, quindi penso che dovrei leggere la colonna NetID non l'ID, giusto? Potresti per favore aiutarmi con questo? –

+0

Cosa viene salvato nelle colonne Id e NetId? –

+0

ID è una chiave primaria con incremento automatico. NetID è il nome utente dell'utente che è una chiave esterna della chiave primaria nella tabella utenti –

8

È necessario passare un valore per il vostro @NetID parametro:

cmd.Parameters.AddWithValue("@NetID", NetID); 
+0

Grazie mille per il vostro aiuto. –

+0

Potresti vedere il mio codice aggiornato? –

+0

@TechnologyLover, ho compilato il codice aggiornato e non ho ricevuto alcun errore. Usa 'whosrdaddy' ha modificato il codice e corretto l'errore. Se hai bisogno di più aiuto su questo progetto, fammi sapere. Buona programmazione! – RePierre

0

Se si utilizza NetID come parametro nel metodo IsAdmin di quanto non lo avrebbe aiutato

private bool isAdmin(string NetID) 
{ 
string connString = "Data Source=appSever\\sqlexpress;Initial Catalog=TestDB;Integrated Security=True"; 
string cmdText = "SELECT ID, NetID FROM dbo.Admins WHERE NetID = @NetID)"; 
using (SqlConnection conn = new SqlConnection(connString)) 
{ 
    conn.Open(); 
    // Open DB connection. 
    using (SqlCommand cmd = new SqlCommand(cmdText, conn)) 
    { 
     cmd.Parameters.AddWithValue("@NetID", NetID); 
     string value = cmd.ExecuteScalar().tostring(); 
     if (value != null) 
      return true; 
     else 
      return false; 
    } 
} 

}

0

è più opportuno utilizzare

cmd.Parameters.Add("@netid",SqlBdType.Int).Value=NetID; 
Problemi correlati