ASP.NET’te SQL injection Saldırılarını Önlemek.

Yazının türü, uzunluğu, biçimi ve aralığı için ASP.NET uygulamanızın tüm girdilerini doğrulamanız gerekir. Veri erişim sorgunuzda kullanılan girdiyi sınırlandırarak, uygulamalarınızı SQL enjeksiyonundan koruyabilirsiniz.

ASP.NET Web sayfalarınız için sunucu tarafı kodundaki girdileri kısıtlayarak başlayın. İstemci tarafında yapılan doğrulamalara güvenmeyin, çünkü kolayca atlanabilir. İstemci tarafındaki doğrulamaları yalnızca gidişatları azaltmak ve kullanıcı deneyimini geliştirmek için kullanın.

Kod örneğinde SSN değeri bir ASP.NET TextBox denetimi tarafından yakalanırsa , girişini aşağıdaki gibi bir RegularExpressionValidator denetimi kullanarak sınırlandırabilirsiniz .

ok

 

 

 

 

 

 

 

<%@ language="C#" %>
<form id="form1" runat="server">
    <asp:TextBox ID="SSN" runat="server"/>
    <asp:RegularExpressionValidator ID="regexpSSN" runat="server"         
                                    ErrorMessage="Incorrect SSN Number" 
                                    ControlToValidate="SSN"         
                                    ValidationExpression="^d{3}-d{2}-d{4}$" />
</form>

SSN girdileri HTML denetimi, sorgu dizesi parametreleri veya çerez gibi başka bir kaynaktan geliyorsa, bunu System.Text.RegularExpressions ad alanlarındaki Regex sınıfını kullanarak sınırlandırabilirsiniz . Aşağıdaki örnek, girdinin bir tanımlama bilgisinden elde edildiğini varsaymaktadır.

System.Text.RegularExpressions kullanarak;

if (Regex.IsMatch(Request.Cookies["SSN"], "^d{3}-d{2}-d{4}$"))
{
    // access the databases
}
else
{
    // handle the bad inputs
}

Veri Erişim Kodlarındaki Girişin Sınırlandırılması

Bazı benzer durumlarda belki de ASP.NET sayfa düzeyi doğrulamalarınıza ek olarak veri erişim kodlarında doğrulama sağlamanız gerekir. Veri erişim kodlarınızda doğrulama yapmanız gereken iki yaygın durum:

Güvensiz kullanıcılar. Veriler güvenilmeyen bir kaynaktan gelebilir veya verilerin ne kadar iyi onaylandığını ve kısıtlandığını garanti edemezseniz, girdiyi veri erişim yordamlarına sınırlayan doğrulama mantığı ekleyin.
Kütüphane kodu. Veri erişim kodları çoklu uygulamalar tarafından kullanılmak üzere tasarlanmış bir kitaplık olarak paketlenmişse, veri erişim kodunuz kendi doğrulamalarını gerçekleştirmelidir çünkü istemci uygulaması hakkında güvenli bir varsayım yapamazsınız.
Aşağıdaki örnek, veri erişim yordamlarının, bir SQL deyimindeki parametreleri kullanmadan önce normal ifadeler kullanarak giriş parametrelerini doğrulayabileceğini göstermektedir.

using System;
using System.Text.RegularExpressions;

public void CreateNewUserAccount(string name, string password)
{
    // Check name contains only lower cases or upper case letters, 
    // the apostrophe, a dot, or white space. Also check it is 
    // between 1 and 40 character long
    if ( !Regex.IsMatch(userIDTxt.Text, @"^[a-zA-Z'./s]{1,40}$"))
      throw new FormatException("Invalid name format");

    if ( !Regex.IsMatch(passwordTxt.Text, 
                      @"^(?=.*d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$" ))
      throw new FormatException("Invalid password format");

 }

Aşağıdaki kod, bir saklı yordamı çağırırken SqlParameterCollection nasıl kullanılacağını gösterir .

using System.Data;
using System.Data.SqlClient;

using (SqlConnection connection = new SqlConnection(connectionString))
{
  DataSet userDataset = new DataSet();
  SqlDataAdapter myCommand = new SqlDataAdapter( 
             "LoginStoredProcedure", connection);
  myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
  myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11);
  myCommand.SelectCommand.Parameters["@au_id"].Value = SSN.Text;

  myCommand.Fill(userDataset);
}

Bu durumda, @au_id parametreleri çalıştırılabilir bir kod değil , gerçek değer olarak kabul edilir. Ayrıca, parametrenin türü ve uzunlukları kontrol edilir. Önceki kod örneğinde, giriş değeri 11 karakterden uzun olamaz. Veriler, parametre tarafından tanımlanan türe veya uzunluğa uymazsa, SqlParameter sınıfı bir özel durum oluşturur.

Parametre Taburesi Kullanımı

Ortak bir yanılgı, tek bir gidiş dönüşte sunucuya bir grup deyim göndermek için birkaç SQL deyimini birleştirdiyseniz, parametreyi kullanamazsınız. Ancak, parametre adlarının tekrarlanmadığından emin olmanız durumunda bu tekniği kullanabilirsiniz. Burada gösterildiği gibi, SQL metin birleştirmesi sırasında eşsiz parametre adları kullandığınızdan emin olarak bunu kolayca yapabilirsiniz.

using System.Data;
using System.Data.SqlClient;
. . .
using (SqlConnection connection = new SqlConnection(connectionString))
{
  SqlDataAdapter dataAdapter = new SqlDataAdapter(
       "SELECT CustomerID INTO #Temp1 FROM Customers " +
       "WHERE CustomerID > @custIDParm; SELECT CompanyName FROM Customers " +
       "WHERE Country = @countryParm and CustomerID IN " +
       "(SELECT CustomerID FROM #Temp1);",
       connection);
  SqlParameter custIDParm = dataAdapter.SelectCommand.Parameters.Add(
                                          "@custIDParm", SqlDbType.NChar, 5);
  custIDParm.Value = customerID.Text;

  SqlParameter countryParm = dataAdapter.SelectCommand.Parameters.Add(
                                      "@countryParm", SqlDbType.NVarChar, 15);
  countryParm.Value = country.Text;

  connection.Open();
  DataSet dataSet = new DataSet();
  dataAdapter.Fill(dataSet);
}

Yorum yapın