IP Adreslerini MySQL'de Barındırmak

MySQL içerisinde IP adresleri nasıl barındırmalıyız?

Öncelikle şurada ki güzel yazıyı okumanızı tavsiye ederim. Ciddi bir benchmark testi uygulanmış.

MySQL kendi içerisinde IP adresi barındırmak için kullanabileceğimiz iki güzel fonksiyonla gelir. Bunlar;

INET_ATON() ve INET_NTOA() fonksiyonlarıdır. INET_ATON() fonksiyonu string olan IP adresini, 32bitlik UNSIGNED INTEGER biçimine çevirir. INET_NTOA() ise bu işlemin tem tersini yapar.

Hemen test edelim;

3 kısımdan oluşan, günlük olarak kullandığımız IP adresleri aslında bu işleme tabi tutulmuş adreslerdir. Yani normalde “88.254.195.158” olarak andığımız bir IP adresinin bilgisayar dilinde ki ifadesi “1493091230”dır.

varchar(15) olarak bu barındırma işlemini yaptığımızda, 4 byte’lık INT_UNSIGNED türüne göre her adres için ciddi anlamda kardayız.

Yazı başında paylaştığım bağlantıya göre performansta ki fark %9 ila %12 arasında.

Peki veritabanında bu şekilde barınan 4 BYTE’lık veriyi PHP ile çağırmak istesem ve yine biz normal insanların okuyabileceği formata çevirmek istesem ne yaparım?

Çok kolay ;

veya işlemi tam tersten uygulamak için ;

Test ettiğinizde MySQL fonksiyonları ile bu fonksiyonların aynı sonuçları verdiğini göreceksiniz.

var_dump() fonksiyonu da ekleyebilirsiniz – tür ve uzunluk bilgisini de basarsınız böylece;

## string ‘88.254.195.158’ (length=14)

Eğer IP adresi geçerli bir adres değil ise, ip2long() fonksiyonu “NULL” döndürecektir. IP adreslerinin geçerliliğini sınamak için kolay bir yol olabilir.

Ben her detayı öğrenmek istiyorum diyorsanız şu yazıyı okuyunuz.

Hoşgeldin IPv6

Bu yazının tamamı IpV4 standartlarına göre yazılmıştır. Ve burada ki yöntemler yalnızca Ipv4 için geçerlidir. Peki ya IpV6 standartları ne olacak? Onları çeviremez miyiz? Çeviririz tabi ki. Bu konu hakkında kaynak yok denebilecek kadar az, bu yüzden şuan okuduğunuz satırlar çok değerli ((:

IpV6;’nın hayatımıza girmesiyle birlikte, PHP5’te sonra bu teknolojiye yönelik geliştirmeleri de kendisine dahil etti.

Aslında demin bahsettiğim konu içinde hayati bir önem taşıyor Ipv6 durumu. IP adreslerinin 32bit olmasından ve bundan tasarruf etmekten bahsetmiştim. Düşünsenize Ipv6 adresler ise 128 bit ! Yani tam 4 kat daha fazla veri demek veritabanlarınız için.

Dikkat ! Bu fonksiyonlar Linux üzerinde PHP’nin 5.1.0’sürümünden, Windows üzerinde ise 5.3.0 sürümünden önce çalışmayacaktır !

PHP’ye yeni eklenen inet_ntop() ve inet_pton() fonksiyonları bu işi yapmakta. Örnekleri Php manual sayfalarında bulabilirsiniz. Zaten 2 tane örnek var, bütün internette onlar dolaşıyor, daha tam net bilgiler yok bu konu hakkında.

Burada n => network, p => presentation veya printable kelimelerini temsil ediyor. Yani ntop => network to printable, pton => printable to network anlamına gelmekte.

Peki MySQL kanadında işler nasıl? MySQL şuan resmi olarak INET_ATON ve INET_NTOA gibi bir fonksiyon geliştirmedi. Bu işi yapmak için 3.parti bileşenlere ihtiyacımız var.

3.parti bileşen => http://bitbucket.org/watchmouse/mysql-udf-ipv6/get/tip.tar.gz

Şimdilik bu kadar. Daha sonra MySQL üzerinde Ipv6’ya daha detaylı değineceğim.

MySQL Veri Şifreleme Fonksiyonları

Merhaba,

Öncelikle şu sayfa elinizin altında bulunsun; http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html

MySQL temel olarak 5 tane hazır şifreleme fonksiyonu ile gelir. Bunlar password(), encrypt(), md5, aes_encrypt() ve sha1()’dir.

Sahi birde sha() vardı, ne oldu ona? Birazdan…

MySQL konsolunu açarak hemen bir kaç deneme yapabilir

Sorulması gereken güzel soru : Hepsi tamam da, neden Encrypt fonksiyonu “NULL” döndürdü?

Çünkü bu fonksiyon yalnızca Unix üzerinde çalışmaktadır, eğer benim gibi Windows bir makine de denerseniz devamlı NULL sonucu döndürür (:

Peki bu neden önemli? Eğer web uygulamaları üzerinde bu fonksiyonlardan faydalanacaksanız, windows bir sunucu üzerinde bu fonksiyonu çalıştıramazsınız anlamına gelir.

Diğer bir önemli nokta ise Encrypt() fonksiyonu 2 karakterden daha az string ifadeler için işlem yapmaz, yine NULL döndürür.

Şimdi birde başta hatırladığım SHA’ya bakalım, hatta SHA1 ile karşılaştıralım ;

Dikkatlice karşılaştırırsanız her iki hash’in de aynı olduğunu görebilirsiniz. Çünkü uzun bir süredir, SHA artık SHA1 olarak anılıyor. Aslında durum tam olarak böyle değil, fakat şimdilik böyle yazmam yeterli, lafı uzatmayacağım.

Şimdi bir tablo oluşturalım ve içerisine MD5 ile kriptolanmış bir veriyi gönderelim ;

Şimdi ise test edelim ;

Gördüğünüz gibi hash olarak sonucumuzu görüntüledik.

Diğer fonksiyonlarıda kendiniz deneyebilirsiniz, aynı adımlar ile işlemekteler.

Şimdi clientinfo isimli veritabanımın varolan üç adet tablosunu MD5 ile crypt edeceğim;

Şimdilik bu kadar.

Şifreleme Algoritmaları için Benchmark Testi

Merhaba,

Veritabanında plain-text olarak veri tutmak tehlikelidir, bu yüzden verilerimizi MD5-SHA gibi şifreleme yöntemleri ile şifrelememiz gerekebilir. Bu aşamada seçeceğimiz şifreleme metoduna karar vermek açısından bir performans testi yapmak gerektiğini düşündüm.

Öncelikle şu sayfayı güzelce bir inceleyin, elimizin altında bulunsun; http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html

Elinizde ki stringin, çeşitli kriptolama yöntemlerinde ortaya çıkarttığı hash hakkında bir ön görüşünüz olması için şu ufak uygulamayı inceleyebilirsiniz; http://www.serhatdundar.com/projeler/string-hash-generator.php

Uygulamayı incelemek ve indirmek için; https://gist.github.com/979613

Ufak bir kaç benchmark testi yapalım. Bunun için aşağıda ki uygulamayı kullanabilirsiniz;

Bu testten alacağımız sonuçlara göre en hızlı çalışan ve en yavaş çalışan metodları göreceğiz. Dolayısıyla hangi şifreleme algoritmasını kullanacağımıza karar vermemizde önemli bir rol oynayan performans etkenini kafamızda netleştireceğiz.

(Bu test 32 byte’lık veri için, 1000 kez tekrarlanmıştır…)

Sonuçlara göre md2-whirlpool-sha512 ve sha384 hala en yavaş çalışan kripto metodları olarak görünüyor. En popüler yöntemlere göz atacak olursak MD5 en hızlı olarak değerlendirebileceğimiz 2.sırada, SHA1 ise 5.sıradan yerini alıyor.

MD5 ve SHA1 algoritmaları uzun zaman önce çözüldü, 512bit’lik (64byte) ve 384bit’lik SHA algoritması ise hala çözülebilmiş değil.

Whirlpool algoritmasını da son zamanlarda oldukça duymaya başladık. AES tabanında geliştirilen bu algoritma tahtını kimseye bırakmıyor ancak kullanışlılık yönünden puanı oldukça düşük. Performans yönünden bu denli zayıf olması web uygulamaları altında kullanımı önünde büyük bir engel, bu durum ise popülerliğini düşürüyor.

PHP'de Gelen Veri Kontrolü

Merhaba,

Formlardan gelen verileri, php’nin bazı metodları ile süzgeçleyebilir-kontrol edebiliriz. Bu sayede daha güvenli form işlemleri sürdürebiliriz.

1) trim() fonksiyonu

trim() fonksiyonu, parametresiz kullanımda stringler üzerinde whitespace var ise, bunları tespit eder ve devre dışı bırakır. trim() fonksiyonu str ve charlist olmak üzere 2 parametre alabilir. Whitespace içerisine neler girer peki?

Kullanımı şu şekildedir ;

Bildiğiniz üzere burada ilk parametre zorunlu, ikinci parametre ise opsiyoneldir. İkinci parametre Php 4.1.0 sürümünde opsiyonel olarak eklenmiştir.

İkinci parametre olmadan kullanıldığı taktirde, aşağıda listelenmiş olan karakterleri string içerisinden çıkartır.

  • ” ” (ASCII32 (0x20)), an ordinary space.
  • “\t” (ASCII9 (0x09)), a tab.
  • “\n” (ASCII10 (0x0A)), a new line (line feed).
  • “\r” (ASCII13 (0x0D)), a carriage return.
  • “\0” (ASCII0 (0x00)), the NUL-byte.
  • “\x0B” (ASCII11 (0x0B)), a vertical tab.

trim() fonksiyonunun parametreli kullanımı ise şu şekildedir ;

Bu örnekte, text içerisinden “=” karakteri temizlenecektir.

trim’e benzeyen ltrim() ve rtrim() fonksiyonları ise aynı işlemi soldan veya sağdan olmak üzere işletir. Başlarında ki “l” ve “r” harfi left-right ikilisini sembolize ediyor.

2) addslashes() fonksiyonu

Veritabanı işlemlerinde tek ve çift tırnakların sıkıntı yarattığını bilmeyen yoktur sanırım (bknz: Sql injection)

addslashes() fonksiyonu tek ve çift tırnak karakterleri için kaçış işlemi uygular.

Kullanımı ise ;

Kullanıcı tek veya çift tırnak içeren bir veriyi göndermiş ise, başına bir tane “/” ekleyerek, kaçış işlemi gerçekleştirir.

3) stripslashes() fonksiyonu

addslashes() ile kaçış işlemi gerçekleştirilmiş olan stringi bastırmak istediğimizde, “/” karakterlerini temizlemek için kullanırız.

Oldukça basit kullanımı olan bir fonksiyon olduğu için, kısaca geçiyorum.

4) htmlspecialchars() fonksiyonu

Özel html karakterlerini, öz değerlerlerine döndürür.

Örneğin ;

  • & (ampersand) => &
  • ” (double quote) => "
  • ‘ (single quote) => '
  • < (less than) => &lt;
  • > (greater than) => &gt;

Biri mecburi, ikisi opsiyonel olan üç parametre ile çalışır. Bunlar string, flags ve charset parametreleridir.

string => Fonksiyonun üzerinde çalışacağı string değerini belirtir.

flags => Bu parametre, tek ve çift tırnaklara karşı uygulanacak muameleyi belirler. Default olarak ENT_COMPAT çalışır, bu durumda yalnızca çift tırnaklar dönüştürülür. ENT_QUOTES durumunda ise hem tek tırnaklar hem çift tırnaklar dönüştürülür. ENT_NOQUOTES durumunda ise tek veya çift tırnaklar üzerinde herhangi bir dönüştürme uygulanmaz.

charset => Dönüştürme işleminde kullanılacak olan karakter setini belirler.

Uygulayabileceğiniz karakter setleri;

ISO-8859-1 ISO8859-1 Western European, Latin-1
ISO-8859-15 ISO8859-15 Western European, Latin-9. Adds the Euro sign, French and Finnish letters missing in Latin-1(ISO-8859-1).
UTF-8 ASCII compatible multi-byte 8-bit Unicode.
cp866 ibm866, 866 DOS-specific Cyrillic charset. This charset is supported in 4.3.2.
cp1251 Windows-1251, win-1251, 1251 Windows-specific Cyrillic charset. This charset is supported in 4.3.2.
cp1252 Windows-1252, 1252 Windows specific charset for Western European.
KOI8-R koi8-ru, koi8r Russian. This charset is supported in 4.3.2.
BIG5 950 Traditional Chinese, mainly used in Taiwan.
GB2312 936 Simplified Chinese, national standard character set.
BIG5-HKSCS Big5 with Hong Kong extensions, Traditional Chinese.
Shift_JIS SJIS, 932 Japanese
EUC-JP EUCJP Japanese

Şimdilik bu kadar.

Excel'den MySQL'e Veri Import Etmek

Merhaba,

Şöyle bir excel tablo yapımız olduğunu ve bunu mysql’e import etmek istediğimizi düşünelim;

CSV dosya formatı bu iş için biçilmiş kaftandır. CSV yani comma-seperated values formatında excel tablomuzu kaydedelim.

* Birden çok CSV kaydetme alternatifi görebilirsiniz, “Virgülle ayrılmış CSV” seçeneği ile ilgileniyoruz şuanda. Zaten yalnızca CSV dosya tipine mahkumda değiliz tabi ki .txt .xml gibi başka formatlarda da benzer adımlarla import edebiliriz.

** CSV olarak kaydetme işlemi tek bir sayfa için çalışmaktadır, çoklu sayfalar içeren veri tablolarınızı ayrı excel dosyaları haline getirip CSV’ye çevirin.

*** Referanslı veri hücrelerini de CSV’ye çevirebilirsiniz, ancak bu pek tavsiye edilen bir yöntem değil, plain text olarak veri barındıran hücrelerden bu işlemin yapılması öngörülüyor.

Kaydettiğiniz CSV dosyasını herhangi bir text editörü ile açın ve kolon isimlerini (id-names-edu) silin-kaydedin.

Artık elimizde şöyle bir CSV dosyası olması gerekiyor ;

Sütun başlıklarınızı artık mysql’de oluşturabiliriz. Ben en basit ve pratik yöntem olan PhpMyAdmin üzerinden bu işlemi yapacağım. Sorgu çalıştırarakta pekala yapılabilecek bir işlem.

Madem sorgudan bahsettim, yazayım ki içimde kalmasın ;

PhpMyAdmin imkanı olmayanlarda nasiplenmiş olsun (:

“serhat” isimli veritabanıma 3 alandan oluşan “mustafa” isimli bir tablo oluşturuyorum, bu alanları şu şekilde düzenledim, siz ihtiyaca göre değiştirebilirsiniz;

Üst menüden “İçeri Aktar” seçeneğini, eğer İngilizce kurulu ise “Import” seçeneğini ve ardından CSV dosyamızı seçelim ;

“Kısmi içeri aktarma” başlığı altında uyguladığım değeri siz es geçebilirsiniz, buna takılmayın şimdilik, o konuya sonra değineceğim.

Lokal’de çalışıyorsanız sorun yok ancak sanal hosting üzerinden bu işlemi yapıyorsanız veri-sorgu boyutuna göre, hosting firmanızın “php.ini” dosyası üzerinde belirlediği sınırlar ile yetinmek zorundasınız.

php.ini dosyanız içerisinde ki;

“upload_max_filesize” değerini arttırarak, import edilebilecek dosya boyutunu da arttırmış olursunuz.

Eski MS Office sürümlerinde gördüğüm bir şeyi belirteyim, bizim CVS dosyamız noktalı virgül (;) işaretini ayraç olarak kullanıyor, ancak eski Office sürümlerinde bunun sadece virgül (,) olduğunu görmüştüm. Bu durumda “Seçenekler” başlığında ki “Alanı sonlandıran değer” girdisini virgül (,) ile değiştirmeniz gerekiyor.

Tüm bunları uyguladıktan sonra import etme işleminiz başarıyla gerçekleşmiştir.

Eğer hatalı bir işlem yaptıysanız, tabloyu boşaltıp tekrar import edebilirsiniz. Sorgu olarak ise bunu ;

bu şekilde gerçekleştirebilirsiniz.

Kolay gelsin.