2016-04-14 30 views
1

stackoverflow bana her zaman sorularıma doğru cevaplar vererek kodlama kariyerimde çok yardımcı oldu. Ancak bu soru biraz spesifik olabilir ve umarım siteye ilk gönderdiğimden dolayı sert yanıtlar almaz.SQL Server 2012'de SQL Enjeksiyonu

Kullanıcıların çeşitli sütunları aramalarına izin veren bir SQL Server 2012 saklı yordamını oluşturmakla ilgileniyorum. Beklediğim şeyi yapan saklı bir proc ürettiğime inanıyorum ama SQL Injection girişimleriyle ilgili endişelerim var. Tüm mevcut üsleri SQL Injection ile aklımda mı tutuyorsunuz? Değilse, lütfen benim örnek kaydedilen proc'umu engelleme yolları konusunda beni eğitin. Lütfen Dikkat: Şirketin veri yapısını korumak için not edilen değişiklik yapılmıştır.

Saklı Prosedür:

CREATE PROCEDURE [dbo].[spSearch] 
(  
    @searchTerm varchar(50) = NULL 
) 
AS 

set @searchTerm = LTRIM(RTRIM(@searchTerm)); 

select a.ID 
     ,a.Col1 
     ,a.Col2 
     ,a.Col3 
     ,a.Col4 
     ,a.Col5 
     ,b.Col1 
from table1 a 
left join table2 b on a.ID = b.ID 
where (a.Col1 like '%' + @searchTerm + '%' 
    or a.Col2 like '%' + @searchTerm + '%' 
    or a.Col3 like '%' + @searchTerm + '%' 
    or a.Col4 like '%' + @searchTerm + '%' 
    or b.Col1 like '%' + @searchTerm + '%' 
    or b.Col2 like '%' + @searchTerm + '%' 
    or b.Col3 like '%' + @searchTerm + '%' 
    or b.Col4 like '%' + @searchTerm + '%' 
    or b.Col5 like '%' + @searchTerm + '%' 
    or b.Col6 like '%' + @searchTerm + '%') 
GO 

Benim asıl sorun 50 karakterlik varchar parametresine komutları ve nerede hükümlerin gibi çeşitli hiçbirinde yürütmek zorunda düşmanca SQL geçme olasılık olduğunu.

+1

SQL enjeksiyon saldırısını parametre kullanarak ele aldınız. Düşman komutları, bir "host" komutu dizisi arıyormuşsunuz gibi düz bir "arama metni" olarak görülecektir. –

+1

Bu, bu düzeyde bir sorun değil. Bu zaten parametrelendirilmiş, bu yüzden parametrenin değeri üzerinde bir arama yapmış gibi davranacaktır. – Siyual

+0

BTW, bu parametreyi aldığınız ve SQL sunucusuna göndereceğiniz noktada hala SQL enjeksiyon saldırı deliğini tanıtabilirsiniz. –

cevap

0

Gerçekten SP'den kodu nasıl aradığınıza bağlı olarak değişir. Stored Procedure, kendini sql enjeksiyonundan güvenli değildir. Parametreli fonksiyonlar kullanırken muhtemelen iyi. Sql sorgularını dize olarak gönderirken, hala bir sql enjeksiyon sorununuz var. Ana sorun, kodunuzdaki dizgi birleşimidir. Güvenilmeyen bir kaynaktan gelen parametreleriniz varsa, dizge birleştirmeleri asla güvende olmaz. Do Stored Procedures Protect Against SQL Injection?

Temel ders, herhangi bir dizgi birleştirme olmadan Depolanmış Yordamları yazmaktır.

+0

Teşekkürler, Peter! Bu saklanmış proc'u çağırmak için string birleştirme kullanmam için hiçbir planım yok, bu yüzden oldukça güvenli bir şekilde saklanmış bir proc olmaktan gurur duyuyorum. – Wadeo

+0

Sp: '%' + @searchTerm + '%' dosyasında dize birleştirme yapıyorsunuz. Yani sp o kendine güvende değil. Sp'yi arama yönteminizin kullanımı güvenli hale getiriyor gibi görünüyor. – Peter