Parametre Bağlama: Ne başlık altında olur?

oy
6

Çeşitli dilinde .NET, Java ve diğer üst düzey veritabanı API en sık düz metin gönderme Veritabanı sunucusuna komutlar aksine bağlayıcı hazırlanmış tablolar ve parametre olarak bilinen teknikler sağlar. Ne bilmek istiyorum böyle bir ifade yürütmek böyle olur:

SqlCommand cmd = new SqlCommand(GetMemberByID);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter param = new SqlParameter(@ID, memberID);
para.DbType = DbType.Integer;
cmd.Parameters.Add(param);

Bunun en iyi yöntem olduğunu biliyorum. SQL enjeksiyon saldırıları bu şekilde en aza indirilmiştir. Eğer bu ifadeler yürütmek Ama tam olarak ne başlık altında olur? Sonuçta hala bir SQL güvenli dize var mı? Değilse, sonuç nedir? Ve bu SQL enjeksiyon saldırıları önlemek için yeterli mi?

Oluştur 18/08/2008 saat 16:11
kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
5

MySQL manuel sayfa hazırlanan tablolarda (başka RDBMS'e uygulamalıdır) bilgiler sunmaktadır.

Temelde, senin beyanı çözümlenir ve vaktinden işlenir ve parametreleri SQL kodu ile birlikte işlenen yerine ayrı ayrı gönderilir. Parametreler bile belirlenmeden önce, SQL ayrıştırılır çünkü bu SQL enjeksiyon saldırıları ortadan kaldırır.

Cevap 18/08/2008 saat 16:18
kaynak kullanıcı

oy
0

MS SQL kullanıyorsanız, profil oluşturucu yüklemek ve size Parametrelenmiş sorguları kullandığınızda oluşturulan hangi SQL ifadeleri göreceksiniz. İşte bir örnek (Enterprise Kitaplığına 3.1 kullanıyorum, ancak sonuç Doğrudan aynı kullanarak SqlParameters vardır) SQL Server 2005 aykırıdır:

string sql = "SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did";
Database db = DatabaseFactory.CreateDatabase();
using(DbCommand cmd = db.GetSqlStringCommand(sql))
{
  db.AddInParameter(cmd, "DomName", DbType.String, "xxxxx.net");
  db.AddInParameter(cmd, "Did", DbType.Int32, 500204);

  DataSet ds = db.ExecuteDataSet(cmd);
}

Bu oluşturur:

exec sp[underscore]executesql N'SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did',
  N'@DomName nvarchar(9),
  @Did int',
  @DomName=N'xxxxx.net',
  @Did=500204

tırnak karakterleri parametre olarak geçirilmesi halinde Ayrıca buradan görebilirsiniz, buna göre öncelenir:

db.AddInParameter(cmd, "DomName", DbType.String, "'xxxxx.net");

exec sp[underscore]executesql N'SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did',
  N'@DomName nvarchar(10),
  @Did int',
  @DomName=N'''xxxxx.net',
  @Did=500204
Cevap 18/08/2008 saat 16:48
kaynak kullanıcı

oy
0

anlaşılır şekilde: Bir hazır deyimi gönderilirse Varsa sonra DB bir plan kullanacağız, bu bir planını bu sorgu üzerinden gönderilen ancak params yalnızca değerleri değişti her zaman yeniden oluşturmak zorunda değildir gelmez. Bu nasıl Yordamlara işin çok benzer, procs ile ek bir yararı sen hiç değil sadece temel tablolar için procs aracılığıyla izin verebilir olmasıdır

Cevap 18/08/2008 saat 16:53
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more