En iyi yanıtlayıcılar
C# SQL VERİ TABANI RESİM GÖSTERME

Soru
-
Yanıtlar
-
Merhaba,
Kıymetli uyarılarınız için çok teşekkür ederim.
Siz kodun tamamı için mi ASLA ve ASLA diyorsunuz yoksa sadece " "..." + xx + " ..." SQL cumlesi yazimi "
kısmı için mi ?
Kodun tamamina bakmadim acikcasi. SQL cumlesinin yazimi icin dedim, cunku bence o SQL kullanan programlarda yapilabilecek en buyuk hata. Neden derseniz, Önay söylemiş, ben biraz daha açayım:
1) En buyuk tehlike "SQL Injection attack" olarak bilinen saldiri. O sekilde yazarsaniz, xx olan yere (sizin kodda b ), eger b degeri kullanici girisinden geliyorsa (ornegin var b = txtID.Text ), o zaman bir hacker istedigi gibi duzenleyerek, database baglanan kisinin yetkisi dahilinde istedigini yapabilir. Tabloyu silebilir, diski formatlayabilir, gizli bilgileri yurutebilir ... artik akliniza ne geliyorsa. Kulaginiza kupe olsun diye bir sey daha ekleyeyim, bircok yerde buna karsi SQL cumlesini gozden geciren ("sanitize") kodlarla koruma saglaniyor, ancak bu bir koruma degil o islemden gecmesi cok kolay aslinda (tabii hackerlara yardim olsun diye bir forumda nasil yapildigini soylemem:)
2) Deger son derece guvenli bir yerden gelebilir ve kesinlikle SQL injection attack tehlikesi olmayabilir. Bu sefer de ikinci zarari b'ye gelebilecek degerin dogru sekilde formatlanmasi. Buna ornekler:
a) b degeri bir tarih ise string olarak gonderildiginde, ODBC canonical format ve ISO 8601 formatlari disinda kalan formatlar sunucunun ayarlarina tabidir. Tarihin her zaman yanlis gonderilme ihtimali mevcuttur. Ornegin, sunucu ABD ayarlarinda ise:
15/01/2020
ile hata verir (iyi bir sey hata vermesi).
01/02/2020
ile hicbir hata vermez ve sessiz sedasiz kaydeder (ya da arama icin kullanildiysa aramayi yapar). Sorun su ki, bu tarih o sunucu icin 2 Ocak 2020 anlaminda. Kullanan kisi ise 1 Subat 2020 demek istemis olabilir.
b degeri duz metin olabilir. O zaman sanki bir sorun yok gibi gorunse de, bu metinin icerisine tek\cift tirnak gibi ozel karakterler ozel sekilde eklenmelidir. Girisi yapan bunu bilemeyeceginden hata verir. Ornegin:
Ahmet'in yeri
aslinda
Ahmet''in yeri
seklinde yazilmali.
Bununla da bitmiyor tabii, sayilarda bile problem var. Giriste kullanilan virgul ve noktalar tamamen server ayarlarina bagli seyler (stringe cevirilip gonderiliyorsa).
Yukaridaki problemlerin cozumu ise son derece basit, parametre kullanmak. Parametre kullanilinca, degerler gercek tipleriyle gonderilir, aradaki suruculer dogru sekilde formatlayi ustlenir.
NOT: Tarih formatlasinda cok daha ileri gidersek, MS SQL server'in hangi surumlerinde oldugunu hatrilamiyorum ama bazilarinda hata vardi ve o sunucuda kullanilan dil ayarlarina da bagli olarak, ODBC canonical format da yetersiz kaliyordu dogru bir sekilde stringe cevirmek icin ve dogru olan tek yol arada ayraclar olmadan:
yyyyMMdd
seklindeki tarihlerdi. Benim kodlarimda da dikkat ederseniz tarihleri hep 20200101 gibi buna uyacak sekilde yaziyorum. Nedeni bu:)
Bu konuyu gostermek cok zor ama cok eski konulardan birisinde buradaki forum sorularindan birisinde bir arkadas hatayi farketmisti, hatayi ve cozumunu gosteren kodlari gondermistim (SET LANGUAGE TURKISH ile cikiyordu hata).
Blog
How to create a Minimal, Reproducible Example
The way to Go.
World's most advanced open source (object-) relational Database.
Flutter (for mobile, for web & desktop.
Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.- Düzenleyen CetinBasozEditor 13 Ağustos 2020 Perşembe 10:54
- Yanıt Olarak İşaretleyen Kyamuran SalibryamMicrosoft contingent staff, Moderator 8 Eylül 2020 Salı 13:06
Tüm Yanıtlar
-
pictureBox'ın DataBindings > Image ine BindingSource daki alanı göstermen yeterli
e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
- Yanıt Olarak Öneren CetinBasozEditor 11 Ağustos 2020 Salı 15:45
-
baglanti.Open();
pictureBox1.Image = null;
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
int b = Convert.ToInt32(listView1.SelectedItems[0].SubItems[1].Text);
SqlDataAdapter datadapter = new SqlDataAdapter(new SqlCommand("Select * from fotograflar WHERE fotokod like '%" + b + "%'", baglanti));
DataSet dataset = new DataSet();
datadapter.Fill(dataset);
if (dataset.Tables[0].Rows.Count==1)
{
byte[] data = new byte [0];
data = (byte[])(dataset.Tables[0].Rows[0]["BILGI"]);
MemoryStream mem = new MemoryStream(data);
pictureBox1.Image = Image.FromStream(mem);
}
baglanti.Close(); -
-
-
-
baglanti.Open();
pictureBox1.Image = null;
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
int b = Convert.ToInt32(listView1.SelectedItems[0].SubItems[1].Text);
SqlDataAdapter datadapter = new SqlDataAdapter(new SqlCommand("Select * from fotograflar WHERE fotokod like '%" + b + "%'", baglanti));
DataSet dataset = new DataSet();
datadapter.Fill(dataset);
if (dataset.Tables[0].Rows.Count==1)
{
byte[] data = new byte [0];
data = (byte[])(dataset.Tables[0].Rows[0]["BILGI"]);
MemoryStream mem = new MemoryStream(data);
pictureBox1.Image = Image.FromStream(mem);
}
baglanti.Close();Nasil olsa bir gun, birisinin size soylemesi gerekecek. ASLA ve ASLA boyle kodu ne kendiniz icin yaziniz, ne de baskasina oneriniz.
new SqlCommand("Select * from fotograflar WHERE fotokod like '%" + b + "%'", baglanti))
Bu sekilde "..." + xx + " ..." SQL cumlesi yazimi ASLA ve ASLA kullanilmamasi gereken bir sekildir. Bunun yerine MUTLAKA parametre kullaniniz.
Bu sekilde gosteren kaynaklar var ise, onlari takip etmeyiniz, kitap ise cope atiniz.
Blog
How to create a Minimal, Reproducible Example
The way to Go.
World's most advanced open source (object-) relational Database.
Flutter (for mobile, for web & desktop.
Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.
- Düzenleyen CetinBasozEditor 12 Ağustos 2020 Çarşamba 14:00
-
-
Merhaba,
Kıymetli uyarılarınız için çok teşekkür ederim.
Siz kodun tamamı için mi ASLA ve ASLA diyorsunuz yoksa sadece " "..." + xx + " ..." SQL cumlesi yazimi "
kısmı için mi ?
Öncelikle o kısım için. O üç noktaların yerine gelebilecek değeri herzaman kontrol edemezsiniz, bu da sorgunun bozuk olma ihtimalini doğurur. Örneğin içine gelebilecek ' işareti sorguyu bozacak. Hacker olma heveslileri de bu açığı kullanıp içine şunu yazabilir:
;delete from TabloAdıKoda gelince o open ile açtığınız connectionlar ilerde başa bela olacaktır, hele async işler varsa.
e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
-
Merhaba,
Kıymetli uyarılarınız için çok teşekkür ederim.
Siz kodun tamamı için mi ASLA ve ASLA diyorsunuz yoksa sadece " "..." + xx + " ..." SQL cumlesi yazimi "
kısmı için mi ?
Kodun tamamina bakmadim acikcasi. SQL cumlesinin yazimi icin dedim, cunku bence o SQL kullanan programlarda yapilabilecek en buyuk hata. Neden derseniz, Önay söylemiş, ben biraz daha açayım:
1) En buyuk tehlike "SQL Injection attack" olarak bilinen saldiri. O sekilde yazarsaniz, xx olan yere (sizin kodda b ), eger b degeri kullanici girisinden geliyorsa (ornegin var b = txtID.Text ), o zaman bir hacker istedigi gibi duzenleyerek, database baglanan kisinin yetkisi dahilinde istedigini yapabilir. Tabloyu silebilir, diski formatlayabilir, gizli bilgileri yurutebilir ... artik akliniza ne geliyorsa. Kulaginiza kupe olsun diye bir sey daha ekleyeyim, bircok yerde buna karsi SQL cumlesini gozden geciren ("sanitize") kodlarla koruma saglaniyor, ancak bu bir koruma degil o islemden gecmesi cok kolay aslinda (tabii hackerlara yardim olsun diye bir forumda nasil yapildigini soylemem:)
2) Deger son derece guvenli bir yerden gelebilir ve kesinlikle SQL injection attack tehlikesi olmayabilir. Bu sefer de ikinci zarari b'ye gelebilecek degerin dogru sekilde formatlanmasi. Buna ornekler:
a) b degeri bir tarih ise string olarak gonderildiginde, ODBC canonical format ve ISO 8601 formatlari disinda kalan formatlar sunucunun ayarlarina tabidir. Tarihin her zaman yanlis gonderilme ihtimali mevcuttur. Ornegin, sunucu ABD ayarlarinda ise:
15/01/2020
ile hata verir (iyi bir sey hata vermesi).
01/02/2020
ile hicbir hata vermez ve sessiz sedasiz kaydeder (ya da arama icin kullanildiysa aramayi yapar). Sorun su ki, bu tarih o sunucu icin 2 Ocak 2020 anlaminda. Kullanan kisi ise 1 Subat 2020 demek istemis olabilir.
b degeri duz metin olabilir. O zaman sanki bir sorun yok gibi gorunse de, bu metinin icerisine tek\cift tirnak gibi ozel karakterler ozel sekilde eklenmelidir. Girisi yapan bunu bilemeyeceginden hata verir. Ornegin:
Ahmet'in yeri
aslinda
Ahmet''in yeri
seklinde yazilmali.
Bununla da bitmiyor tabii, sayilarda bile problem var. Giriste kullanilan virgul ve noktalar tamamen server ayarlarina bagli seyler (stringe cevirilip gonderiliyorsa).
Yukaridaki problemlerin cozumu ise son derece basit, parametre kullanmak. Parametre kullanilinca, degerler gercek tipleriyle gonderilir, aradaki suruculer dogru sekilde formatlayi ustlenir.
NOT: Tarih formatlasinda cok daha ileri gidersek, MS SQL server'in hangi surumlerinde oldugunu hatrilamiyorum ama bazilarinda hata vardi ve o sunucuda kullanilan dil ayarlarina da bagli olarak, ODBC canonical format da yetersiz kaliyordu dogru bir sekilde stringe cevirmek icin ve dogru olan tek yol arada ayraclar olmadan:
yyyyMMdd
seklindeki tarihlerdi. Benim kodlarimda da dikkat ederseniz tarihleri hep 20200101 gibi buna uyacak sekilde yaziyorum. Nedeni bu:)
Bu konuyu gostermek cok zor ama cok eski konulardan birisinde buradaki forum sorularindan birisinde bir arkadas hatayi farketmisti, hatayi ve cozumunu gosteren kodlari gondermistim (SET LANGUAGE TURKISH ile cikiyordu hata).
Blog
How to create a Minimal, Reproducible Example
The way to Go.
World's most advanced open source (object-) relational Database.
Flutter (for mobile, for web & desktop.
Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.- Düzenleyen CetinBasozEditor 13 Ağustos 2020 Perşembe 10:54
- Yanıt Olarak İşaretleyen Kyamuran SalibryamMicrosoft contingent staff, Moderator 8 Eylül 2020 Salı 13:06