XML yada AJAX ile sunucu tarafına güvenli bir şekilde veri göndermek gerektiğinde bazı özel durumları da düşünmek ve kodda ekstra bazı eklemeler yapmak gerekiyor. Kullanmış olanlar bilirler, XMLHTTP nesnesi kullanıldığında, gönderilecek veri open üye fonksiyonuna parametre olarak verilir. Örneğin:
http.open(‘POST’, VERI, true);
veya
http.open(‘GET’, VERI, true);
Yukarıdaki veri değişkeni her iki gönderim metodunda da (GET ve POST) aynı şekilde ve formatta kullanılır. Veri isimli değişkenin formatı şu şekildedir:
degisken1=veri1°isken2=veri2°isken3=veri3
Aslında güvenli aktarımdaki bir sıkıntı da tam burada oluşuyor. Verilerden birinin muhteviyatında &, n veya + (ve özel amaçlı yazdırılamaz karakterler) karekterleri bulunduğunda, veriler sunucu tarafındaki script’te düzgün olarak ayrıştırılamıyor veya aktarılamıyor . Bu sorunun üstesinden gelmek için veri kısmıdaki zararlı karakterklerin ayıklanarak URL’i bozmayacak şekilde kodlanması gerekiyor. Base64, veriyi kendi karakter tablosunu kullanarak (64 adet karakterden oluşur) kodlayan bir algoritma. Web’de base64 encoder ve decoder olarak birçok javascript fonksiyonu bulmanız mümkün. Ancak bunların hepsi PHP’nin (sunucu tarafında php script kullanıldığını varsaydım) base64_decoder fonksiyonuyla uyumlu çalışmıyor. Webtoolkit sitesindeki kodlayıcı ve çözücü fonksiyonlar php.net sitesinde de belirtildiği gibi PHP’nin base64 kodlama ve kod çözme fonksiyonlarıyla uyumlu çalışıyor.
Gönderilecek veriyi base64 ile kodlamak ve karşı tarafta çözmek tek başına sağlam bir veri aktarımı yapmak için yeterli değil. Base64 esasında ikili veriyi yazdırılabilir formattaki karakterlere çevirmeye yarıyor. Bu sayede içerisinde veri taşıyıcısını etkileme ihtimali olan zararlı karakterler güvenli bir formata çevrilmiş oluyor. Base64 algoritması içerisinde (A-Za-z0-9+/) karakterlerinin yer aldığı 64 adet karakteri kullanarak kodlanmış çıktıyı oluştururuyor . (Base64 algoritmasının çalışmasını çok güzel bir şekilde açıklayan bir PDF dosyasını buradan indirip okuyabilirsiniz. ~46KB)
Sanırım çıktı karakter kümesinde yer alan + ve / karakterleri dikkatinizi çekmiştir. Bu karakterlerin XMLHTTP
nesnesine verilen veri isimli parametrede yer alması aktarım açısından sorun oluşturmuyor. Benim farkettiğim tek sorun + karakterinin Apache+PHP ikilsinin çalıştığı sunucu tarafında otomatik olarak boşluk karakterine çevrilmesi.Yani + karakterleri boşluk olarak aktarılıyor. + işaretinin yok olması (yani boşluk karakterine çevrilmesi) base64 verisinin orjinalliğini bozduğu için base64_decoder’ın ürettiği çözülmüş veri de bambaşka birşey olarak çıkıyor. Bu nedenle base64 ile kodlanmış veriyi göndermeden önce içerisindeki + karakterini bir javascript fonksiyonu olan encodeURIComponent ile kodlamak gerekiyor. Bu kodlamadan sonra + karakteri %3B URL koduna çevriliyor. PHP tarafında base64_decode’dan önce encodeURIComponent’in yaptığının tersini yapacak bir kod kullanmaya gerek yok. Nitekim, web sunucu URL karatker kodlarıyla gelen %20, %FB ve %3B gibi verileri otomatik olarak orjinal haline zaten çeviriyor. Yani %3B olan kod +’ya istek PHP ye ulaşmadan çevrilmiş oluyor.
Hazır bol bol karakter kodlamaya dalmışken son bir gerekli kodlamadan ve gerekliliğinden de bahsetmek istiyorum. Latin karakter kümesi dışında bir veri girişi söz konusu olduğunda muhtemelen sunucu tarafında yada veri tabanında karakter kodlama sorunları yaşayacaksınız. Bu sorun esasında verinin sunucu veya istemci tarafında ele alınış şeklindeki farklılıktan kaynaklanır. Verinin sahip olduğu mutlak sayısal değerler farklı kodlama tablolarında farklı karakterler ile yorumlanırlar. Gönderilen veride yer alan karakterler, kullanmakta olduğunuz tabloda yer alıyorsa ve sunucu tarafında da (katar ve veritabanı işlemlerinde) aynı karakter tablosunua göre ele alınıyorsa hiçbir sorun yaşamazsınız. Özet olarak istemci ve sunucu tarafında aynı kodlama standardının kullanılması gereklidir. Burada tüm karakter kodlama tablolarını içeren ve destekleyen UTF kodlamasının kullanılması gerekiyor. UTF 2 byte’lık unicode adı verilen karakterleden oluşur. Latin alfabesi dışında arapça, çince veya japonca gibi dillerde kullanılan karakterleri de kapsar ve destekler. Verimizi XMLHTTP nesnesi ile göndermeden önce, UTF olarak kodlamamızda, verinin selameti açısından büyük fayda var.
Buraya kadar anlattıklarımı özetleyen kod parçası aslında şöyle:
function encode(input) {
input = WebToolKit.utf8.encode(input);
input = WebToolKit.base64.encode(input);
return encodeURIComponent(input);
}
Dilerseniz kodun tamamını buradan indirebilirsiniz. ~4KB
Yazan: Tankado