2012-12-12 16 views
5

Yeni bir ASP.NET geliştiricisiyim ve birçok seçeneğe sahip bir menü çubuğu bulunan web tabanlı bir uygulama geliştiriyorum. Bu seçeneklerden bazıları yalnızca Yönetici’ye gösterilecektir. Kullanıcının yönetici olup olmadığını kontrol etmek için sistemin arkasında bir mantık vardır. Evet ise, seçenekler görüntülenecektir. Yöntemi yazdım ama bir sql injectiom var ve onu kaldırmak istiyorum. BilginBu sorgudan sql enjeksiyonu nasıl kaldırılır ve iyi çalışır?

, aşağıdaki veritabanı yapısı vardır:

  • Kullanıcılar tablo: NetID, Name, Title
  • Yöneticiler tablo:

    : Burada ID, NetID

C# yöntemi var

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; 
      } 
     } 
    } 

değişiyorum üçüncü çizgiyi için yaparak değiştirmeye çalıştım:

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

Ama şu hata var ve neden bilmiyorum:

Must declare the scalar variable "@NetID".

Lütfen yardımcı olur Bunu çözerken ben mi?

* * GÜNCELLEME:

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; 
      } 
     } 
    } 

aşağıdaki hata var:

yanlış sözdizimi yakın ')'.

Bu sorun nasıl çözülür?

+0

Ayrıca, SQL Stored Procedures düşünebilirsiniz kullanmak. –

+0

Sorununuzu düzeltin, düzenlemeye bakın :) SQL enjeksiyonu kaldırmak için +1;) – whosrdaddy

+0

Hala aynı sorunla karşılaşıyorum ve şu hatayı alıyorum: 'SqlDataReader reader = cmd.ExecuteReader();' –

cevap

1

bu

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

Yardımlarınız için teşekkür ederiz. Gerçekten onu takdir ederim. Mantıkta bir hatam olduğunu düşünüyorum. Çünkü veritabanı tasarımımda gördüğünüz gibi NetID, Admins Tablosundan Kullanıcı Tablosuna gelen yabancı bir anahtardır, bu yüzden NetID sütununun ID'sini okumam gerektiğini düşünüyorum, doğru mu? Bu konuda bana yardımcı olabilir misiniz? –

+0

Kimlik ve NetId sütunlarına ne kaydedilir? –

+0

Kimlik, otomatik olarak artırılmış bir birincil anahtardır. NetID, Kullanıcı Tablosundaki birincil anahtara yabancı anahtar olan kullanıcının kullanıcı adıdır. –

8

Sen @NetID parametre için bir değer geçmesi gerekiyor: Eğer yardımcı olacağını daha IsAdmin yönteminde parametre olarak NetID kullanırsanız

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

Yardımlarınız için çok teşekkür ederim. –

+0

Güncellenmiş kodumu görebilir misiniz? –

+0

@TechnologyLover, güncellenmiş kodu derledim ve herhangi bir hata almadım. 'Whosrdaddy' kodunu kullanın ve hatayı düzeltin. Bu projeyle ilgili daha fazla yardıma ihtiyacınız varsa lütfen bana bildirin. Mutlu kodlar! – RePierre

0

deneyin

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; 
    } 
} 

}

Daha iyi
0

Onun

cmd.Parameters.Add("@netid",SqlBdType.Int).Value=NetID; 
İlgili konular