• 29-10-2021, 02:06:57
    #1
    Bölümde açılan konulardan yola çıkarak nacizane gördüğüm yanlışları ve temel kodlama mantığını açıklamak istedim.

    Burada verilen bilgiler; php kodlamaya başlamış ve orta derece bilgisi olanlar için.

    Madde 1:

    $_GET, $_POST, $_SESSION, $_SERVER v.b parametlerden değer alırken, bunları bir fonksiyona bağlamanız sizin yararınıza olur.

    Neden: 2 yıl sonra $_GET yerine ::GET kullanıldığında phpde tüm kodları değiştirmek yerine tek bir fonksiyonu değiştirirsiniz. Ayrıca bu parametlerden gelen verilere tek bir fonksiyon üzerinden müdahele edersiniz.

    Örnek:

    function r_get($name)
    {
    	if($_GET[$name])
    	{
    		// basit bir filtreleme.
    		return htmlspecialchars($_GET[$name]);
    		
    	}
    	else
    	{
    		return false;
    	}
    }

    Madde 2:

    $_GET, $_POST parametlerle aldığınız değerleri filtreden geçirin.

    Neden: Güvenlik açıklarını bir nebze engellemiş olursunuz.

    Örnek:

    function r_get($name)
    {
    	if($_GET[$name])
    	{
    		// basit bir filtreleme.
    		// PDO kullanılmıyorsa : return htmlspecialchars(strip_tags(mysql_real_escape_string($_GET[$name])));
    		
    		return htmlspecialchars($_GET[$name]);
    		
    	}
    	else
    	{
    		return false;
    	}
    }
    Madde 3:

    Yönlendirme yaparken mutlaka header fonksiyonundan sonra exit; kullanan.

    Neden: Aksi takdirde 301 yönlendirmesi deaktif edilerek sayfaya ulaşılabilir. ( Örneğin: Yönetim paneli sayfası )

    Örnek:

    function r_redirect($url)
    {
    	header('location: '.$url);
    	exit;
    }
    Madde 4:

    Düzenli çalışmak ve kodlamak bu işin altın kurallarından biri. Kendinize bir template sistemi oluşturun.

    Neden: Neyin nerde olduğunu daha hızlı çözebilirsiniz, daha hızlı düzenlemeler yapabilirsiniz, sizden başka biri kodları daha çabuk anlıyabilir ve iş yapabilir.


    Örnek ( En basit haliyle, MVC yapısıda kullanabilirsiniz )

    Link: site.com/sayfa/hakkimizda

    .htaccess

    Options +FollowSymLinks
    Options -Indexes
    RewriteEngine On
    
    
    RewriteRule ^sayfa/([0-9]+)$ index.php?page=page&sef=$1
    index.php

    switch($_GET['page'])
    {
    	case 'page':
    		include('theme/page.php');
    	break;
    	default:
    	include('theme/home.php');
    }
    home.php

    r_header(); // Bu isimde bir fonksiyon oluşturarak fonksiyon içerisinde header.php dosyasını include edebiliriz. Böylece her defasında header kodlarını tekrar tekrar yazmayız. Hatta fonksiyonu dinamik hale getirerek meta tag v.b şeyleri işleyebiliriz.
    
    content...
    
    r_footer(); // Header mantığı
    Madde 5:

    MySQL işlemlerinde direk mysql_query veya pdo classını kullanmak yerine bunları kendi oluşturduğunuz bir class içinde yaparsanız ileride syntax tarafında bir değişiklik olduğunda daha hızlı çözümler üretirsiniz.

    Madde 6:

    Kodlama yaparken değişkenlerde, dizilerde çift tırnak kullanmaktan kaçının.

    Neden: tek tırnak kullanılması performans açısından daha iyidir.

    Örnek:


    $_POST['page'] // hızlı
    $_POST["page"] // yavaş

    Madde 7:

    Döngü, if işlemlerinde süslü parantez yerine yeni syntaxları kullanın.

    Neden: Daha hızlılar ve ilk koda bakışta daha iyi çözümlenebilir.

    Örnek:


    // HIZLI
    
    foreach($cars as $car):
      echo $car.'<br>';
    endforeach;
    
    // YAVAŞ
    
    foreach($cars as $car)
    {
     echo $car.'<br>';
    }

    Madde 8:

    Upload işlemlerinde sadece uzantıya göre filtreleme yapmayın. Dosya tipinide denetleyin.

    Ayrıca upload edilen dosyaları kesinlikle kendi adı ile kaydetmeyin.

    Neden: Klasik güvenlik açıkları.

    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mime = finfo_file($finfo, $_FILES['dosya']['tmp_name']);
    if($mime=='image/png' or $mime=='image/jpeg')
    {
    	// Burada upload işlemi.
    }

    Madde 9:

    Genel gördüğüm yanlışlardan biride yönetim paneli yaparken, index.php dosyasında sadece yetki kontrolu yapılıyor include edilen alt dosyada yetki kontrolu bulunmuyor.

    Bu yüzden ilgili alt dosya kodlarında, ilgili dosyanın index.php tarafından include edildiğini doğrulayın.

    Örnek

    index.php

    define('ADMIN_INCLUDED', TRUE);
    include('x.php');
    x.php

    if(!defined('ADMIN_INCLUDED')) { exit; }
    Madde 10:

    Özetle kesinlikle düzenli kodlar yazın ve dosya düzenine önem verin. Nesne yönelimli programlamaya geçmediyseniz ilk adımı buradan atın. Eğer tercih etmiyorsanız yaptığınız işlemleri, fonksiyonlar haline getirin, bu sizin ileride yapacağınız düzenleme ve eklemelere olumlu katkı sağlayacaktır.

    Okuduğunuz için teşekkürler.
  • 29-10-2021, 02:13:09
    #2
    ellerine sağlık
  • 29-10-2021, 02:16:34
    #3
    Bir PHPsever olarak orta düzeyde bilgi sahibi olan coderlara ve developerlara yönelik çok güzel ipuçları içeren doküman olmuş. Elinize, emeğinize sağlık; kendi adıma teşekkür ederim.
  • 29-10-2021, 02:19:35
    #4
    Hocam elinize sağlık, güzel bir rehber olmuş
  • 29-10-2021, 04:02:57
    #5
    Bilgi için teşekkürler hocam saolun

    Madde 8:

    Upload işlemlerinde sadece uzantıya göre filtreleme yapmayın. Dosya tipinide denetleyin.


    Demişsiniz dosya tipini nasıl değerleme yapabiliriz bu konuda tam güvenlik açısından hazır fonsyon var mı elinizde

    Riga adlı üyeden alıntı: mesajı görüntüle
    Bölümde açılan konulardan yola çıkarak nacizane gördüğüm yanlışları ve temel kodlama mantığını açıklamak istedim.

    Burada verilen bilgiler; php kodlamaya başlamış ve orta derece bilgisi olanlar için.

    Madde 1:

    $_GET, $_POST, $_SESSION, $_SERVER v.b parametlerden değer alırken, bunları bir fonksiyona bağlamanız sizin yararınıza olur.

    Neden: 2 yıl sonra $_GET yerine ::GET kullanıldığında phpde tüm kodları değiştirmek yerine tek bir fonksiyonu değiştirirsiniz. Ayrıca bu parametlerden gelen verilere tek bir fonksiyon üzerinden müdahele edersiniz.

    Örnek:

    function r_get($name)
    {
        if($_GET[$name])
        {
            // basit bir filtreleme.
            return htmlspecialchars($_GET[$name]);
            
        }
        else
        {
            return false;
        }
    }
    Madde 2:

    $_GET, $_POST parametlerle aldığınız değerleri filtreden geçirin.

    Neden: Güvenlik açıklarını bir nebze engellemiş olursunuz.

    Örnek:

    function r_get($name)
    {
        if($_GET[$name])
        {
            // basit bir filtreleme.
            // PDO kullanılmıyorsa : return htmlspecialchars(strip_tags(mysql_real_escape_string($_GET[$name])));
            
            return htmlspecialchars($_GET[$name]);
            
        }
        else
        {
            return false;
        }
    }
    Madde 3:

    Yönlendirme yaparken mutlaka header fonksiyonundan sonra exit; kullanan.

    Neden: Aksi takdirde 301 yönlendirmesi deaktif edilerek sayfaya ulaşılabilir. ( Örneğin: Yönetim paneli sayfası )

    Örnek:

    function r_redirect($url)
    {
        header('location: '.$url);
        exit;
    }
    Madde 4:

    Düzenli çalışmak ve kodlamak bu işin altın kurallarından biri. Kendinize bir template sistemi oluşturun.

    Neden: Neyin nerde olduğunu daha hızlı çözebilirsiniz, daha hızlı düzenlemeler yapabilirsiniz, sizden başka biri kodları daha çabuk anlıyabilir ve iş yapabilir.


    Örnek ( En basit haliyle, MVC yapısıda kullanabilirsiniz )

    Link: site.com/sayfa/hakkimizda

    .htaccess

    Options +FollowSymLinks
    Options -Indexes
    RewriteEngine On
    
    
    RewriteRule ^sayfa/([0-9]+)$ index.php?page=page&sef=$1
    index.php

    switch($_GET['page'])
    {
        case 'page':
            include('theme/page.php');
        break;
        default:
        include('theme/home.php');
    }
    home.php

    r_header(); // Bu isimde bir fonksiyon oluşturarak fonksiyon içerisinde header.php dosyasını include edebiliriz. Böylece her defasında header kodlarını tekrar tekrar yazmayız. Hatta fonksiyonu dinamik hale getirerek meta tag v.b şeyleri işleyebiliriz.
    
    content...
    
    r_footer(); // Header mantığı
    Madde 5:

    MySQL işlemlerinde direk mysql_query veya pdo classını kullanmak yerine bunları kendi oluşturduğunuz bir class içinde yaparsanız ileride syntax tarafında bir değişiklik olduğunda daha hızlı çözümler üretirsiniz.

    Madde 6:

    Kodlama yaparken değişkenlerde, dizilerde çift tırnak kullanmaktan kaçının.

    Neden: tek tırnak kullanılması performans açısından daha iyidir.

    Örnek:


    $_POST['page'] // hızlı
    $_POST["page"] // yavaş
    Madde 7:

    Döngü, if işlemlerinde süslü parantez yerine yeni syntaxları kullanın.

    Neden: Daha hızlılar ve ilk koda bakışta daha iyi çözümlenebilir.

    Örnek:


    // HIZLI
    
    foreach($cars as $car):
      echo $car.'<br>';
    endforeach;
    
    // YAVAŞ
    
    foreach($cars as $car)
    {
     echo $car.'<br>';
    }
    Madde 8:

    Upload işlemlerinde sadece uzantıya göre filtreleme yapmayın. Dosya tipinide denetleyin.

    Ayrıca upload edilen dosyaları kesinlikle kendi adı ile kaydetmeyin.

    Neden: Klasik güvenlik açıkları.


    Madde 9:

    Genel gördüğüm yanlışlardan biride yönetim paneli yaparken, index.php dosyasında sadece yetki kontrolu yapılıyor include edilen alt dosyada yetki kontrolu bulunmuyor.

    Bu yüzden ilgili alt dosya kodlarında, ilgili dosyanın index.php tarafından include edildiğini doğrulayın.

    Örnek

    index.php

    define('ADMIN_INCLUDED', TRUE);
    include('x.php');
    x.php

    if(!defined('ADMIN_INCLUDED')) { exit; }
    Madde 10:

    Özetle kesinlikle düzenli kodlar yazın ve dosya düzenine önem verin. Nesne yönelimli programlamaya geçmediyseniz ilk adımı buradan atın. Eğer tercih etmiyorsanız yaptığınız işlemleri, fonksiyonlar haline getirin, bu sizin ileride yapacağınız düzenleme ve eklemelere olumlu katkı sağlayacaktır.

    Okuduğunuz için teşekkürler.
  • 02-11-2021, 02:48:52
    #6
    muglali20 adlı üyeden alıntı: mesajı görüntüle
    Bilgi için teşekkürler hocam saolun

    Madde 8:

    Upload işlemlerinde sadece uzantıya göre filtreleme yapmayın. Dosya tipinide denetleyin.


    Demişsiniz dosya tipini nasıl değerleme yapabiliriz bu konuda tam güvenlik açısından hazır fonsyon var mı elinizde
    Konuyada ekledim.

    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mime = finfo_file($finfo, $_FILES['dosya']['tmp_name']);
    if($mime=='image/png' or $mime=='image/jpeg')
    {
    	// Burada upload işlemi.
    }