IHS Telekom Test Sonuçları

İki yıllık bir IHS kullanıcısı olarak, IHS’yi test etmek anca aklıma geldi.

Testler WatchMouse sayesinde, dünyanın pek çok noktasından eş zamanlı olarak yapıldı. Ayrıca test aşaması hala devam etmekte, aylık rapor gelince onuda paylaşacağım. Örneğin bugün tam 50 dakika boyunca http, imap, pop3 ve smtp kapalı kaldı. Bunun uptime oranlarında ki karşılığını görmek istiyorum. Tüm raporu şuradan inceleyebilirsiniz.

Uptime Oranları Tablo Görünüm

(Test sonuçları 23-29 Mayıs tarih aralığına aittir.)

nr name type uptime checks 1. serhatdundar.com - browser browser 99.74% 771, 2 failed 3. serhatdundar.com - http http 100.00% 791 4. serhatdundar.com - imap imap 99.87% 795, 1 failed 6. serhatdundar.com - pop3 pop3 99.75% 796, 2 failed 8. serhatdundar.com - smtp smtp 96.71% 791, 26 failed 

Uptime Oranları Grafiksel Görünüm

Hata Kayıtları – Tablo Görünümü

Hata Kayıtları Grafik Görünümü

Bu başarısı ile IHS bir kez daha farkını ortaya koyuyor. Teşekkürler IHS.

Åžimdilik bu kadar.

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;

mysql> SELECT INET_ATON("88.254.195.158");
+-----------------------------+
| INET_ATON("88.254.195.158") |
+-----------------------------+
|                  1493091230 |
+-----------------------------+
1 row in set (0.02 sec)

mysql> SELECT INET_NTOA("1493091230");
+-------------------------+
| INET_NTOA("1493091230") |
+-------------------------+
| 88.254.195.158          |
+-------------------------+
1 row in set (0.05 sec)

mysql>

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 ;

echo long2ip("1493091230");

veya işlemi tam tersten uygulamak için ;

echo ip2long("88.254.195.158");

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;

echo var_dump(ip2long("88.254.195.158"));
echo var_dump(long2ip("1493091230"));

## 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

mysql> SELECT SHA1("serhat");
+------------------------------------------+
| SHA1("serhat")                           |
+------------------------------------------+
| de30e5ef68d3ea5e7eb1de8d922e499cd6bc775e |
+------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT MD5("serhat");
+----------------------------------+
| MD5("serhat")                    |
+----------------------------------+
| 4aa6d74604cad605ccb43b94aa5a7b94 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> SELECT ENCRYPT("serhat");
+-------------------+
| ENCRYPT("serhat") |
+-------------------+
| NULL              |
+-------------------+
1 row in set (0.00 sec)

mysql> SELECT PASSWORD("serhat");
+-------------------------------------------+
| PASSWORD("serhat")                        |
+-------------------------------------------+
| *7B8566BBEC5FD8336D43CDDB7DD13EB891F43CA2 |
+-------------------------------------------+
1 row in set (0.00 sec)

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 ;

mysql> SELECT SHA1("serhat");
+------------------------------------------+
| SHA1("serhat")                           |
+------------------------------------------+
| de30e5ef68d3ea5e7eb1de8d922e499cd6bc775e |
+------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT SHA("serhat");
+------------------------------------------+
| SHA("serhat")                            |
+------------------------------------------+
| de30e5ef68d3ea5e7eb1de8d922e499cd6bc775e |
+------------------------------------------+
1 row in set (0.00 sec)

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 ;

mysql> create table user_md5 (user_name VARCHAR(16), password VARCHAR(32));
mysql> INSERT INTO user_md5 VALUES ('member1',MD5('secretpassword') );
mysql> INSERT INTO clientinfo.serhat VALUES("12345678", MD5("serhat"));
Query OK, 1 row affected (0.01 sec)

Åžimdi ise test edelim ;

mysql> select * from clientinfo.serhat where ogrencino="12345678" AND sifre=MD5(
"serhat");
+-----------+----------------------------------+
| ogrencino | sifre                            |
+-----------+----------------------------------+
|  12345678 | 4aa6d74604cad605ccb43b94aa5a7b94 |
+-----------+----------------------------------+
1 row in set (0.00 sec)

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;

mysql> UPDATE clientinfo.ikibindokuz
-> SET passwd = md5(passwd)
-> ;
Query OK, 3943 rows affected, 3943 warnings (0.10 sec)
Rows matched: 3943  Changed: 3943  Warnings: 3943

mysql> UPDATE clientinfo.ikibinon
-> SET passwd = md5(passwd);
Query OK, 3032 rows affected, 3032 warnings (0.13 sec)
Rows matched: 3032  Changed: 3032  Warnings: 3032

mysql> UPDATE clientinfo.ikibinonbir
-> SET passwd = md5(passwd);
Query OK, 733 rows affected, 733 warnings (0.04 sec)
Rows matched: 733  Changed: 733  Warnings: 733

Åž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;

 <?php

 define('HASH_TIMES', 1000);
 define('HASH_DATA', 'The quick brown fox jumped over!'); // 32 bytes

 header('Content-Type: text/plain');
 echo 'Testing ' . strlen(HASH_DATA) . ' bytes of data over ' . HASH_TIMES . " iterations:\n";

 foreach (hash_algos() as $algo) {
 $time = microtime(1);
 for ($i = 0; $i < HASH_TIMES; $i++) hash($algo, HASH_DATA);
 $results[$algo] = microtime(1) - $time;
 }

 $time = microtime(1); for ($i = 0; $i < HASH_TIMES; $i++) crc32(HASH_DATA); $results['crc32()'] = microtime(1) - $time;
 $time = microtime(1); for ($i = 0; $i < HASH_TIMES; $i++) md5(HASH_DATA); $results['md5()'] = microtime(1) - $time;
 $time = microtime(1); for ($i = 0; $i < HASH_TIMES; $i++) sha1(HASH_DATA); $results['sha1()'] = microtime(1) - $time;

 asort($results, SORT_NUMERIC);
 foreach ($results as $algo => $time) echo "\n$time\t$algo";

 ?>

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…)

0.00058913230895996	crc32()
0.0009300708770752	md5()
0.0010159015655518	crc32
0.0010371208190918	crc32b
0.0010850429534912	sha1()
0.0011179447174072	md5
0.001121997833252	md4
0.0013129711151123	sha1
0.0013148784637451	adler32
0.0015969276428223	salsa20
0.0016100406646729	tiger128,3
0.0016219615936279	tiger192,3
0.001629114151001	salsa10
0.001716136932373	tiger160,3
0.0017518997192383	tiger128,4
0.0017580986022949	tiger192,4
0.0017728805541992	tiger160,4
0.001849889755249	ripemd128
0.0019888877868652	sha256
0.0020010471343994	sha224
0.0020439624786377	ripemd320
0.0020489692687988	haval128,3
0.0020759105682373	haval192,3
0.0020990371704102	haval224,3
0.0021038055419922	haval160,3
0.0021359920501709	haval256,3
0.0022099018096924	ripemd256
0.0023119449615479	haval128,4
0.002345085144043	haval160,4
0.0023760795593262	haval192,4
0.002439022064209	haval256,4
0.0025219917297363	haval160,5
0.0025811195373535	haval128,5
0.0026021003723145	haval192,5
0.0026168823242188	haval224,5
0.0026481151580811	haval256,5
0.0026988983154297	ripemd160
0.0028259754180908	haval224,4
0.0033509731292725	gost
0.0042660236358643	snefru
0.0042967796325684	snefru256
0.0048680305480957	sha384
0.0053589344024658	sha512
0.0060269832611084	whirlpool
0.050267934799194	md2

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 ;

string trim ( string $str [, string $charlist ] )

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 (0×20)), an ordinary space.
  • “\t” (ASCII9 (0×09)), a tab.
  • “\n” (ASCII10 (0x0A)), a new line (line feed).
  • “\r” (ASCII13 (0x0D)), a carriage return.
  • “\0″ (ASCII0 (0×00)), the NUL-byte.
  • “\x0B” (ASCII11 (0x0B)), a vertical tab.

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

$deger = "==serhat==";
$temiz_deger = trim($deger, "=");

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 ;

string addslashes ( string $str )

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.

string stripslashes ( string $str )

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) => &amp;
  • ” (double quote) => &quot;
  • ‘ (single quote) => &#039;
  • < (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.