16 Temmuz Pazartesi ´12   —   6 Yorum
Türkçesini çok bulamadığım hash kelimesini anahtar olarak kullanacağım. Burada aslında bahsettiğim anahtar herhangi bir veri grubunuza atadığınız, sayısal olmayan kimliklerden bahsediyorum. Yani rasgele üretilmiş belirli bir uzunlukta olan kimlikleri her yerde kullanıyoruz.

Neden sayısal bir kimlik kullanmak yerine bu anahtarlara ihtiyaç duyacağınızı en açık şekilde şöyle anlatabilirim. Mesela tahmin ederek erişilmesini istemeyeceğiniz ama şifre veya kullanıcı girişi gibi herhangi bir sınırlama koyamayacağınız bir sayfanız var, örnek veriyorum yapılacak işler listesi veritabanı oluşturuyorsunuz ve her kayıt bir yapılacak iş listesi. Veritabanında sayısal bir kimliğe yani numaraya sahip bu kayıtlar. Hazırladığınız bir php sayfası da liste numarasına göre yapılacak iş listesinin detayını ekrana döküyor.

Eğer liste_detay.php?no=145 gibi basit bir şekilde tutarsanız url'i oynayarak başkalarının listelerine erişebilir, sadece erişmek değil sistemdeki tüm listeleri basit bir script ile tahmin edebilir veya tarayıp kaydedebiliriz. Böyle bir durumda listelerinizi sadece sayısal değil, tahmin edilemeyecek bir anahtar ile (örneğin: t34de6gx) tanımlamak istiyorsunuz.

Bu noktada rastgele bir anahtar üretebilirsiniz, bunu yapmak çok zor değil. PHP'deki rasgele sayı üretme fonksiyonunu kullanarak ve bir karakter dizisinden rastgele elemanlar çekerek bir kelime üretebilirsiniz.

Bunu daha pratik bir şekilde tek satırda bile yapabilirsiniz:
$anahtar = substr(str_shuffle('abcdefghklmnoprstuvyzqxw1234567890'), 0, 6);
Bu satır size 6 karakterlik bir kelime üretecektir. Basitçe str_shuffle fonksiyonu ile özel karakter içermeyen ve rakamlarında dahil olduğu bir alfabeyi karıştırıyor ve başındaki ilk 6 karakteri alıyoruz.

Şimdi bu, işin basit kısmı. Eğer veritabanındaki bir veri set için bu anahtarı oluşturuyorsanız üretilen anahtarın veri setinde daha önce kullanılıp kullanılmadığını test etmek zorundasınız. Sonuçta tekil bir anahtar oluşturuyorsunuz. Bu arada veri setiniz mysql veya bir sql veritabanında olmak zorunda değil, bir xml, csv veya txt dosyasında saklı olan bir set için de benzer şeyi uygulayabilirsiniz.

Veritabanındaki veriyi test ederek bir anahtar oluşturmanın en kısa ve basit kodu şöyle:
do {
    $anahtar = substr(str_shuffle('abcdefghklmnoprstuvyzqxw1234567890'), 0, 6);

    $query = mysql_query("SELECT no FROM listeler 
        WHERE anahtar LIKE '" . $anahtar . "'");
} while (mysql_num_rows($query) > 0);

print $anahtar;
Bu kod, veritabanında olmayan bir anahtar üretmenizi sağlayacaktır. Sonra verinizi hazırlayıp tablonuza yeni kayıdınızı ekleyebilirsiniz.


Hazırlayan: Mehmet Fatih YILDIZ
9 Ağustos Salı ´11   —   1 Yorum

Gorsel olarak hicbir degisiklik gormesenizde kodda inanilmaz bir degisiklige gittigim mfyz.com altyapisinda cok buyuk bir yapilanma var. 4-5 yil once olsa siteyi tekrar kodlama gibi bir yontemi secerdim, aynen daha once 7 kere yaptigim gibi.

Fakat son birkac yildir icinde bulundugum projelerde kodu yeniden yazmadan gelistirmenin her zaman icin en iyi yontem olduguna karar verdim. Konuyla ilgili joel'in blogunda yazdigi cok guzel bir yazi var aslinda. Kesinlikle refactoring her zaman en dogru cozum.

http://www.joelonsoftware.com/articles/fog0000000069.html
18 Şubat Pazartesi ´08   —   17 Yorum

Böyle birşeye neden ihtiyaç duyarsınız?

En büyük nedeni, tek dosyadan oluşan bir script yazıyor olabilirsiniz (konuyla ilgili olarak PHP ile tek dosyadan oluşan proje üretmek dökümanını okuyabilirsiniz). Ya da yazdığınız projede kullandığınız ufacık ikonların bir sürü dosya şeklinde durmasını istemiyor olabilirsiniz. Başka bir tercih de dosyalarınızı bir veritabanında tutuyormuşcasına tek dosyada depolamak isteyebilirsiniz. Çok küçük boyutlu resimler için bahsettiğim konu daha yaygın kullanılır.

Yani yazdığınız betik kendi içindeki css kuralları ile şekillendirilmiş, ikonlarla da güçlendilirmişse ve ikonlar için ek dosyalar koymak istemiyorsanız bu yöntemi kullanabilirsiniz.

Teknik

Aslında yapılan iş oldukça basit. Öncelikle dosyalarımızı php dosyamızın içine nasıl gömeceğiz? PHP dosyalarımız ascii dosyalar, binary içeriği alabilmek ve saklayabilmek için base64 ile şifreleyeceğiz. Sonuçta ortaya çıkacak olan şey bir ascii şifre olacaktır. Dosya boyutuna göre bu şifrenin uzunluğu artacaktır. Unutmayın ki bu anlattığım yöntem tamamen ufak dosyaları gömmek içindir 100kb üzeri dosyaları php dosyanıza gömerseniz, ya da php dosyanızın boyutu megabyte'ları aştığı zaman işlenmesi zorlaşacaktır. Birkaç ufak dosya için kullandığınız sürece verimli olacaktır.

Dosyalarımız encode etmek için bir kod kullanacağız. Bu işlemi başka bir php dosyası oluşturarak yapın.
<?php

$dosya = 'resim.gif';

// dosya icerigini okuyalim
$dosya_binary = fopen($dosya, "r");
$icerik_binary = fread($dosya_binary, filesize($dosya));
fclose($dosya_binary);

// binary icerigi ascii'ye base64 ile cevirelim
$icerik_ascii = base64_encode($icerik_binary);

print $icerik_ascii;

?>
Bu kod resim.gif dosyasını ekrana ascii karakterlerle şifrelenmiş şekilde uzun bir metin şeklinde basacaktır. Bu metini kopyalayarak kullanacağız ve orjinal proje dosyamız şöyle olacak
// dosyalar
$dosyalar["resim.gif"] = "R0lGODlhEAAQAMQAAGZmZsbGxaSko4OEgxl4ueT//3G59ejo6Lu7u9zd3".
                         "DOMxXp6eqjU/5mZmX+RmdPU1LKzsfb29v///3u75a2tpY6OjczMzDqPz6".
                         "ysq////wAAAAAAAAAAAAAAAAAAAAAAACH5BAUUABkALAAAAAAQABAAAAW".
                         "JYIaNJDlNWZpiUuu2U4GqrHPd+MTItHQZEoPQoNvNWISkkjBROBUpgQQT".
                         "qVojj6wgOg0IAAEAQBBgbTMNiSCRALDDCWkjlRYcDoBD+C5PVSQNCAgAg".
                         "wKCaRV+gBZfYWIWiCkDEhVslpZ/AykLlBCen55/C5sSAw2nqKeToxmcL6".
                         "8trAuztLW1GSEAOw==";
Yukarıda gördüğünüz şey aslında çok uzun bir string. Yani o satırlar yan yana bitişik fakat ben bu dökümanda açıkca görülebilmesi için bu hale getirdim. Bu gördüğünüz string 258 byte'lık 16x16'lık bir ikonun base64 şifresidir. 258 byte'ın bu kadar sürdüğünü düşünürseniz 10-20kb'lık bir dosyanın ne kadar uzun süreceğini tahmin edebilirsiniz. Onun için büyük dosyalarınızı php dosyanıza gömmeyin.

Yukarıdaki şekilde tüm dosyalarınızı base64_encode'dan geçirip $dosyalar dizisine dosyanın adını taşıyan indiste yazın.
Unutmayın bu dizi proje dosyanızın en üstünde tanımlanmalı. Yani proje dosyanızın içinde her türlü işlemi yapıyor olabilirsiniz ama bu teknikteki kodlar dosyanın en üstünde durmalı.

Neyse, dosyalarınızı $dosyalar dizisine kendi adları indis olacak şekilde kaydettiniz. php dosyanızın boyutu kabardı farkındaysanız (kontrol ediniz). Şimdi bu tanımların ardına ufak bir kod ile işlemi bitireceğiz.
if( $_GET["islem"] == 'dosya' ){
  if( array_key_exists($_GET["dosya"], $dosyalar) ){
    die( base64_decode( $dosyalar[ $_GET["dosya"] ] ) );
  }else{
    die("Dosya bulunamadı!");
  }
}

// projenizin normal işlemlerini bu satırdan sonra
// yapabilirsiniz.
Eğer get methodu ile islem değişkeni dosya olarak gelmişse ve get methodu ile dosya değişkeninin içeriği bizim $dosyalar dizisinde indis olarak varsa $dosyalar dizisindeki o elemanın içeriğini base64_decode edip ekrana basıyoruz. Yoksa dosya bulunamadı hatası verip duruyoruz.

Nasıl kullanacaksınız?

Projenin devamındaki bir kısımda
<img src="index.php?islem=dosya&dosya=resim.gif" ...>
şeklinde kullandığınızda dosyanız resim olarak görüntülenecektir. Aynı şeyi bir arşiv dosyası için de yapabilirsiniz.
<a href="index.php?islem=dosya&dosya=kurulum_dokumani.pdf">Dosyayı indirmek için tıklayın</a>
gibi.

Dosya deposu

Yukarıdaki kodları ayrı bir dosya olarak kaydedip dosyalarınızı tek parça hale getirdiğiniz bir veritabanı gibi düşünebiliriz. Yani
<?php
// dosyalar
$dosyalar["..."] = "....";
$dosyalar["..."] = "....";

// gosterelim
if( array_key_exists($_GET["dosya"], $dosyalar) ){
  die( base64_decode( $dosyalar[ $_GET["dosya"] ] ) );
}else{
  die("Dosya bulunamadı!");
}

?>
Bu dosyaya goster.php, resimler.php veya indir.php diyebilirsiniz. Kullanırken yukarıda index.php olarak gösterdiğimiz yola dosyanızın adını yazın. Ayrıca islem=dosya parametresine de gerek kalmadı çünkü bu dosya zaten sadece bu işi yapıyor :-)


Çok fazla işinize yarar mı bilmiyorum ama yine de bazı yerlerde kullanılan bir teknik olduğu için paylaşma gereği duydum. Umarım faydası dokunur.


Hazırlayan : Mehmet Fatih YILDIZ

Popüler Etiketler

facebook opengraph api optimization fql apple laptop notebook javascript js linux konsol login mail newsletter subscription cookie subdomain startups music kontrol yapıları if while örnek kod switch css3 css html kitap wordpress blog cms www redirect crossdomain cache htaccess apache social media sosyal lisans license support php kurulum tebrik connect ie internet explorer html5 jquery link plugin framework ios iphone ipad app store store in-app purchase purchase verification storekit itunes connect itunes session browsers phpstorm jetbrains mysql pgsql sql mssql ide editor medya twitter wanda digital route router mod_rewrite export tool macosx app pharma hack coding spam firefox date tarih table lifestream rss mfyz proje meta share screen ui ux icons google seo code development less language style xml nedir bootstrap radio button ipucu form input textarea select chart osx applications free mobile sitemap dokuman portfolio player deployment version control svn git compile compiler windows on-the-fly wireless logo url assets server gimp job developer auth terminal network icon ikon grafik download banner calendar fstab ntfs search kampanya mootools object widget db database service optimizasyon pear mdb2 prepare execute injection ajax xmlhttprequest diff zaman doritos tytz howto nasıl regex ubuntu workspace query box istatistik subversion web app open source iOS analyse procedure xhtml webkit imza signature parse http statistics graph integration browser ruffles design oyun insanlar generator internet