Uluslararası standart bir veritabanı sorgu ifadesi olarak, SQL ifadeleri çeşitli programlama ortamlarında yaygın olarak kullanılmıştır. Olgun ve istikrarlı bir sistem olarak, kullanıcı giriş ve şifre doğrulaması çok önemlidir. Günlük programlama çalışmalarımda, birçok programcının kullanıcı şifrelerini doğrulamak için SQL ifadesi kullandığını gördüm:
sql="Kullanıcı tablosundan * seç, burada name='"+name+"' ve password='"+password+"'"
İsim ve şifre, kullanıcı tarafından girilen kullanıcı adları ve şifreleridir ve yukarıdaki ifadeler, kullanıcı ile şifrenin meşru ve geçerli olup olmadığını doğrulamak için yürütülür. Ancak analiz sonucunda, yukarıdaki ifadelerde ölümcül boşluklar olduğu görülebilir. Kullanıcı adına şu diziyi girdiğimizde: 111'or'1=1, ardından şifreyi rahatça girdiğimizde, aaaa olarak ayarlıyoruz. Değişken değiştirildikten sonra, SQL ifadesi aşağıdaki dizeye dönüşür:
sql="Kullanıcı tablosundan * seç, burada isim='111' veya '1=1' ve password='aaaa'
Hepimiz biliyoruz ki, select ifadesi sorgu koşullarını değerlendirdiğinde, (ve) işlemlerle karşılaştığında aşağıdaki ve (ve) işlemleri görmezden gelir ve yukarıdaki ifadedeki 1=1 değeri her zaman doğrudur, yani şifreye hangi değer girilirse girsin, yukarıdaki şifre doğrulamasını geçebilir! Bu sorunun çözümü çok basittir ve birçok yöntem vardır; en yaygın kullanılanı, doğrulama yapmadan önce kullanıcının ve kullanıcının girdiği şifrenin meşruiyetini değerlendirmektir; ayrıca tek tırnak işareti ve eşit işaret gibi özel karakterler kullanılmaz.
Yukarıdaki sorunlar, basit görünse de, gerçekten de vardır. Örneğin, internetteki ünlü çevrimiçi oyun "Smiling Proud Jianghu"nun erken versiyonunda böyle bir sorun vardı ve yazar, bu oyunla ilgili güvenlik zafiyeti raporunu okuduktan sonra daha önce yazdığı bazı programları dikkatlice analiz etmiş, bu tür birçok boşluk vardı. Bu gerçekten dikkatimizi çekmeli. Bu aynı zamanda genç programcıların, yazar da dahil olmak üzere, programlama deneyimi ve güvenlik farkındalığı eksikliğini ortaya koyuyor. Aynı zamanda, programcıların programı tasarlarken güvenliğini tamamen göz önünde bulundurmaları gerektiğini, özensiz olmamaları gerektiğini ve görünüşte küçük bir eksikliğin ciddi sonuçlara yol açabileceğini hatırlatıyor.
|