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) fonksiyonuyla uyumlu çalışmıyor. 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ı 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 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ı indirebilirsiniz. ~4KB
Yazan: Tankado