none
C# SQL VERİ TABANI RESİM GÖSTERME RRS feed

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.


    13 Ağustos 2020 Perşembe 10:48
    Yanıtlayıcı

Tüm Yanıtlar

  • pictureBox'ın DataBindings > Image ine BindingSource daki alanı göstermen yeterli

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    11 Ağustos 2020 Salı 11:22
    Moderatör
  • 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();
    11 Ağustos 2020 Salı 12:59
  • önay hocam yanıtınız için teşekkür ederim biraz daha açabilir misiniz rica etsem
    11 Ağustos 2020 Salı 14:31
  • önay hocam yanıtınız için teşekkür ederim biraz daha açabilir misiniz rica etsem
    11 Ağustos 2020 Salı 17:22
  • bunu yapamıyorsan, yazarak anlatmak zor. anydesk id göndermelisin.


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    11 Ağustos 2020 Salı 19:27
    Moderatör
  • 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.



    12 Ağustos 2020 Çarşamba 13:59
    Yanıtlayıcı
  • 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 ?

    13 Ağustos 2020 Perşembe 04:42
  • 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

    13 Ağustos 2020 Perşembe 05:16
    Moderatör
  • 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.


    13 Ağustos 2020 Perşembe 10:48
    Yanıtlayıcı