PHP ile Temel Ban Sistemi

codinger06

Üye
1 Mar 2023
161
5
136
127.0.0.1
Merhabalar. Bu konuda backend olarak sadece PHP ile temel ban sistemi yapımından söz edeceğim. Bu konu sadece sistemin mantığını kavramak içindir. Profesyonel sistemlere (MVC mimarileri gibi) bu anlatacağım ban sistemi olduğu gibi entegre edilemez. Sistemi anlattıktan sonra profesyonel mimarilere nasıl entegre edebiliriz sorusunun cevabını arayacağız.

Sistem : https://www.dosyaupload.com/1rbdg/KullanıcıBanSistemi.rar
VirusTotal : VirusTotal

Bu konuda tasarımla alakalı olan kısımlara değinmedim. Şu anda tek odak noktamız ban sistemi.



Şimdi konuya geçelim, öncelikle sistemde kullanacağımız küçük veritabanı :
kullanici_ban_sistemi >> `users`




Şimdi, çeşitli yerlerde kullanacağımız fonksiyonları barındıran bir sınıfımız var :

userfuncs.php

PHP:
class UserFuncs{
    public function __construct() {
        $this->db = new PDO("mysql:host=localhost;dbname=kullanici_ban_sistemi;charset=UTF8", "root", "");
    }

    function getId($username){

        $username = htmlspecialchars(trim($username), ENT_QUOTES);
        $user = $this->db->query("SELECT * FROM users WHERE username='$username'", PDO::FETCH_ASSOC);
        foreach ($user as $u) {
            return $u["id"];
        }
    }

    function getUsername($id){
        $id = htmlspecialchars(trim($id), ENT_QUOTES);
        $user = $this->db->query("SELECT * FROM users WHERE id='$id'", PDO::FETCH_ASSOC);
        foreach ($user as $u) {
            return $u["username"];
        }       
    }
    
    function listUsers(){
        $users = $this->db->query("SELECT * FROM users ORDER BY authority DESC", PDO::FETCH_ASSOC);
        foreach ($users as $u) {
            $id = $u["id"];
            $username = $u["username"];
            $authorityText = $this->getAuthorityText($id);
            $banned = $u["banned"];

            

            if($this->getAuth($this->getId($_SESSION["username"])) == 1){
                $banBtnDiv = "";
                $unbanBtnDiv = "";
            }else{
                $banBtnDiv = '<span class="ban"><a class="ban-btn" href="ban.php?id='.$id.'">Banla</a></span>';
                if($banned == 1){
                    $banBtnDiv = "<span style='color:darkred; font-weight:bolder;'>KULLANICI BANLI</span><span class='unban'><a class='ban-btn' style='background-color:darkgreen;' href='unban.php?id=".$id."'>Banı Kaldır</a></span>";
                }   
            }



            echo
            '
            <div class="user">
                <span class="username">'.$username.' - '.$authorityText.'</span>
                <span class="block"><button class="block-btn">Engelle</button></span>
                '.$banBtnDiv.'
            </div>

            ';
        }
    }


    function getAuth($id){
        $user = $this->db->query("SELECT * FROM users WHERE id='$id'", PDO::FETCH_ASSOC);
        foreach ($user as $u) {
            return $u["authority"];
        }

    }

    
    function getAuthorityText($id){
        $user = $this->db->query("SELECT * FROM users WHERE id='$id'", PDO::FETCH_ASSOC);
        foreach ($user as $u) {
            $authority = $u["authority"];
        }

        switch ($authority) {
            case 1:
                $authorityText = "<span>Normal Üye</span>";
                break;
            
            case 2:
                $authorityText = "<span style='color:darkblue;'>Yetkili Üye</span>";
                break;
            
            case 3:
                $authorityText = "<span style='color:red; font-weight:bolder;'>Üst Düzey Yetkili</span>";
                break;
        }

        return $authorityText;
    }
    
    function banUser($id, $reason, $byId){
        $banUser = $this->db->prepare("UPDATE users SET banned=1, ban_reason='$reason', banned_by='$byId' WHERE id='$id'");
        if($banUser->execute()){
            header("Location:home.php");
        }
    }

    function unban($id){
        $unbanUser = $this->db->prepare("UPDATE users SET banned=0, ban_reason='', banned_by=0");
        if($unbanUser->execute()){
            header("Location:home.php");
        }
    }

    function isBanned($id){
        $user = $this->db->query("SELECT * FROM users WHERE id='$id'", PDO::FETCH_ASSOC);
        foreach ($user as $u) {
            return $u["banned"] ? 1 : 0;
        }
    }

    function getBanInfo($id){
        $info = [];
        $user = $this->db->query("SELECT * FROM users WHERE id='$id'", PDO::FETCH_ASSOC);
        foreach ($user as $u) {
            $info["ban_reason"] = $u["ban_reason"];
            $info["banned_by"] = $this->getUsername($u["banned_by"]);
        }

        return $info;
    }
}




Fonksiyonların işlevleri :
  • getId($username) : Veri tabanına bağlanarak, kendisine verilen kullanıcı adına sahip sütunun ID'sini verir.
  • getUsername($id) : Kendisine verilen ID'ye sahip sütunun kullanıcı adını verir.
  • listUsers() : Kullanıcı bilgilerini alarak ekrana yazar.
Veritabanına bağlanarak tüm kullanıcıların dizisini çeker, ardından bu dizinin elemanları(kullanıcılar) foreach döngüsü yardımıyla elde edilir. Sonrasında, eğer bu fonksiyona istek gönderen kullanıcı yetkiliyse, dizideki kullanıcının ekrana yazdırıldığı yerin yanında ayrıca bir "Banla" butonu görür, ve halihazırda o kullanıcı banlanmışsa "KULLANICI BANLI" yazısını görür. Eğer istek atan kullanıcı yetkili değilse bu özelliklerden herhangi birisi gözükmez.

  • getAuth($id) : ID'si verilen kullanıcının yetki numarasını verir.
Yetki numaraları :
1 = Normal üye
2 = Yetkili üye
3 = Üst Düzey Yetkili

  • getAuthorityText($id) : ID'si verilen kullanıcının yetkisinin ne olduğunu CSS ile şekillendirilmiş bir şekilde verir.
  • banUser($id, $reason, $byId) : ID'si verilen kullanıcıyı, "verilen sebep" ve "banlayan kişi" parametreleriyle banlar.
  • isBanned($id) : ID'si verilen kullanıcı banlanmışsa 1, banlanmamışsa 0 değerini verir.
  • unban($id) : ID'si verilen kullanıcının banını kaldırır.
  • getBanInfo($id) : Bir dizi oluşturup bu diziyi ID'si verilen kullanıcının banlanma bilgileri ile doldurur ve geri döndürür. Bir dizi kullanılmasının sebebi, iki tane bilgi olduğundan (ban sebebi, banlayan) bu bilgilere array keyleri yardımıyla kolay ulaşmak içindir.


Şimdi yetkililerin kullanıcıları nereden banlayacağına bakalım.

ban.php

PHP:
<?php
session_start();
require "check_ban.php";
if(
    !@$_SESSION["username"]
    || $userFuncs->getAuth($userFuncs->getId(@$_SESSION["username"])) < 2
    || !isset($_GET["id"])
    || @$_GET["id"] == @$userFuncs->getId(@$_SESSION["username"])
    || @$userFuncs->getAuth(@$_GET["id"]) >= @$userFuncs->getAuth($userFuncs->getId(@$_SESSION["username"]))
    || @$userFuncs->isBanned(@$_GET["id"])
){
    header("Location:index.php");
    exit();
    die();
}
?>
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Kullanıcı Ban Sistemi</title>
    <link rel="stylesheet" href="style.css">
</head>
<body style="position:relative; display:flex; flex-direction:column; justify-content:center; align-items:center;">
    <div class="username" style="position:absolute; top:20px; right:40px;">
        <?php echo "<h2>" . $_SESSION["username"] . "</h2>" . $userFuncs->getAuthorityText($userFuncs->getId($_SESSION["username"])); ?>
    </div>

    <h1 style="margin:20px;">Banlanacak Üye<br> <?php echo $userFuncs->getUsername($_GET["id"]) . " - " . $userFuncs->getAuthorityText($_GET["id"]); ?></h1>
    <span style="font-size:20px;">Ban Sebebi : </span>

    <div>
        <form action="" method="POST">
            <textarea style="resize:none; margin-bottom:10px; font-size:17px; padding:10px; text-align:center;" name="banReason" cols="55" rows="15"></textarea><br>
            <button type="submit" class="ban-btn" style="padding:10px; width:150px; font-size:17px; font-weight:bolder;">Banla</button>
        </form>

        <?php
            if(@$_POST["banReason"]){
                $bannedId = htmlspecialchars(trim($_GET["id"]), ENT_QUOTES);
                $banReason = htmlspecialchars(trim($_POST["banReason"]), ENT_QUOTES);

                $userFuncs->banUser($bannedId, $banReason, $userFuncs->getId(@$_SESSION["username"]));
            }
        
        ?>
    </div>

</body>
</html>

Yetkililer arayüzde listelenen kullanıcının yanındaki ban butonuna bastıkları zaman buraya yönlendirilecekler. Banlanan kişinin ID'si $_GET parametresiyle bildirilecek.


Burada yapılan if kontrolu sırasıyla :
  • Kullanıcının şu anda açık hesabı var mı?
  • Kullanıcının banlamak için yetkisi var mı?
  • Banlanılması istenen kişinin ID'si $_GET parametresi olarak verilmiş mi?
  • Kullanıcı kendisini banlamaya çalışmıyor, değil mi?
  • Kullanıcının banlamaya çalıştığı kişi kendi rütbesinden küçük mü?
  • Kullanıcının banlamaya çalıştığı kişinin halihazırda bir ban durumu yok, değil mi?

Eğer bu durumlardan herhangi birine 0(Olumsuz) cevabı gelirse, istek atan kullanıcı anasayfaya yönlendirilir.


Sonrasında yetkili personel forumu doldurup butona bastığı anda, kullanıcı yetkilinin verdiği sebeple birlikte banlanır.


check_ban.php
PHP:
<?php
    require "userfuncs.php";
    $userFuncs = new UserFuncs();

    $userFuncs = new UserFuncs();
    if($userFuncs->isBanned($userFuncs->getId(@$_SESSION["username"]))){
        header("Location:you_are_banned.php");
        die();
        exit();
    }                           



?>

Bu kodu anasayfaya eklediğimiz takdirde, eğer kullanıcı banlıysa anasayfaya giremeden kendisinin banlandığını bildiren sayfaya aktarılacaktır.


Ban bildiren sayfa :

you_are_banned.php
PHP:
<?php
session_start();
require "userfuncs.php";
$userFuncs = new UserFuncs();

if(!@$_SESSION["username"] || $userFuncs->isBanned($userFuncs->getId(@$_SESSION["username"])) == 0){
    header("Location:home.php");
}
?>

<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Kullanıcı Ban Sistemi</title>
    <link rel="stylesheet" href="style.css">
</head>
<body style="display:flex; flex-direction:column; justify-content:center; align-items:center;">
    <h1>Banlandınız.</h1>
    <h3>Banlayan : <?php echo $userFuncs->getBanInfo($userFuncs->getId(@$_SESSION["username"]))["banned_by"]; ?><br>
    Ban Sebebi : </h3>
    <div style="padding:5px; word-break: break-word; width:30%; text-align:center;">
        <?php echo $userFuncs->getBanInfo($userFuncs->getId(@$_SESSION["username"]))["ban_reason"]; ?>
    </div>
</body>
</html>

Eğer bu sayfayı görüntülemeye çalışan kişinin hesabı yoksa veya banlı değilse anasayfaya aktarılır.
Ve gözüktüğü gibi, ekrana ban bilgilerini yazdıracak. Tüm fonksiyonları yukarıda konuşmuştuk.




Son olarak, profesyonel mimarilerde bu gibi bir ban sistemini nasıl kullanabiliriz? Sunucuda onlarca ve hatta yüzlerce sayfa olabilir. Bu gibi durumlarda MVC yapısı tercih edilebilir (Model-View-Controller). Bu konuda mantığını anlamaya çalıştığımız için her sayfaya her yere ban kontrol dosyasını dahil etmedim, fakat gerçek bir sistemde her yerde ban kontrolü olmak zorunda. Bu durumda MVC yapısını kullanan bir sistemi baz aldığımızda, kullanıcı herhangi bir sayfayı bir fonksiyonu talep ederken bir Controller üzerinden istediğini sunuyor. Sonra Controller kullanıcı ne istediğiyse ona göre ya veri tabanı işlemleriyle ilgilenen Model'e gidiyor ya da herhangi bir sayfa talep edildiyse View'e gidiyor. Eğer Controller'in constructor() yapıcı metoduna bu ban kontrolünü koyarsak herhangi bir istek işlenmeden önce kullanıcının ban durumu göz önüne alınıp ona göre aksiyon alınacak.


Eğer gözden kaçırdığım kritik bir nokta veya anlatımını yanlış yaptığım bir kod bloğu varsa okuyanlardan özür diliyorum, bildirirseniz hatayı gideririm.




İyi forumlar, sistemden görüntüler :







- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



 

Muslukcu

Katılımcı Üye
17 Kas 2021
699
262
Tesisat dükkanı
Merhabalar. Bu konuda backend olarak sadece PHP ile temel ban sistemi yapımından söz edeceğim. Bu konu sadece sistemin mantığını kavramak içindir. Profesyonel sistemlere (MVC mimarileri gibi) bu anlatacağım ban sistemi olduğu gibi entegre edilemez. Sistemi anlattıktan sonra profesyonel mimarilere nasıl entegre edebiliriz sorusunun cevabını arayacağız.

Sistem : https://www.dosyaupload.com/1rbdg/KullanıcıBanSistemi.rar
VirusTotal : VirusTotal

Bu konuda tasarımla alakalı olan kısımlara değinmedim. Şu anda tek odak noktamız ban sistemi.



Şimdi konuya geçelim, öncelikle sistemde kullanacağımız küçük veritabanı :
kullanici_ban_sistemi >> `users`




Şimdi, çeşitli yerlerde kullanacağımız fonksiyonları barındıran bir sınıfımız var :

userfuncs.php

PHP:
class UserFuncs{
    public function __construct() {
        $this->db = new PDO("mysql:host=localhost;dbname=kullanici_ban_sistemi;charset=UTF8", "root", "");
    }

    function getId($username){

        $username = htmlspecialchars(trim($username), ENT_QUOTES);
        $user = $this->db->query("SELECT * FROM users WHERE username='$username'", PDO::FETCH_ASSOC);
        foreach ($user as $u) {
            return $u["id"];
        }
    }

    function getUsername($id){
        $id = htmlspecialchars(trim($id), ENT_QUOTES);
        $user = $this->db->query("SELECT * FROM users WHERE id='$id'", PDO::FETCH_ASSOC);
        foreach ($user as $u) {
            return $u["username"];
        }      
    }
   
    function listUsers(){
        $users = $this->db->query("SELECT * FROM users ORDER BY authority DESC", PDO::FETCH_ASSOC);
        foreach ($users as $u) {
            $id = $u["id"];
            $username = $u["username"];
            $authorityText = $this->getAuthorityText($id);
            $banned = $u["banned"];

           

            if($this->getAuth($this->getId($_SESSION["username"])) == 1){
                $banBtnDiv = "";
                $unbanBtnDiv = "";
            }else{
                $banBtnDiv = '<span class="ban"><a class="ban-btn" href="ban.php?id='.$id.'">Banla</a></span>';
                if($banned == 1){
                    $banBtnDiv = "<span style='color:darkred; font-weight:bolder;'>KULLANICI BANLI</span><span class='unban'><a class='ban-btn' style='background-color:darkgreen;' href='unban.php?id=".$id."'>Banı Kaldır</a></span>";
                }  
            }



            echo
            '
            <div class="user">
                <span class="username">'.$username.' - '.$authorityText.'</span>
                <span class="block"><button class="block-btn">Engelle</button></span>
                '.$banBtnDiv.'
            </div>

            ';
        }
    }


    function getAuth($id){
        $user = $this->db->query("SELECT * FROM users WHERE id='$id'", PDO::FETCH_ASSOC);
        foreach ($user as $u) {
            return $u["authority"];
        }

    }

   
    function getAuthorityText($id){
        $user = $this->db->query("SELECT * FROM users WHERE id='$id'", PDO::FETCH_ASSOC);
        foreach ($user as $u) {
            $authority = $u["authority"];
        }

        switch ($authority) {
            case 1:
                $authorityText = "<span>Normal Üye</span>";
                break;
           
            case 2:
                $authorityText = "<span style='color:darkblue;'>Yetkili Üye</span>";
                break;
           
            case 3:
                $authorityText = "<span style='color:red; font-weight:bolder;'>Üst Düzey Yetkili</span>";
                break;
        }

        return $authorityText;
    }
   
    function banUser($id, $reason, $byId){
        $banUser = $this->db->prepare("UPDATE users SET banned=1, ban_reason='$reason', banned_by='$byId' WHERE id='$id'");
        if($banUser->execute()){
            header("Location:home.php");
        }
    }

    function unban($id){
        $unbanUser = $this->db->prepare("UPDATE users SET banned=0, ban_reason='', banned_by=0");
        if($unbanUser->execute()){
            header("Location:home.php");
        }
    }

    function isBanned($id){
        $user = $this->db->query("SELECT * FROM users WHERE id='$id'", PDO::FETCH_ASSOC);
        foreach ($user as $u) {
            return $u["banned"] ? 1 : 0;
        }
    }

    function getBanInfo($id){
        $info = [];
        $user = $this->db->query("SELECT * FROM users WHERE id='$id'", PDO::FETCH_ASSOC);
        foreach ($user as $u) {
            $info["ban_reason"] = $u["ban_reason"];
            $info["banned_by"] = $this->getUsername($u["banned_by"]);
        }

        return $info;
    }
}




Fonksiyonların işlevleri :
  • getId($username) : Veri tabanına bağlanarak, kendisine verilen kullanıcı adına sahip sütunun ID'sini verir.
  • getUsername($id) : Kendisine verilen ID'ye sahip sütunun kullanıcı adını verir.
  • listUsers() : Kullanıcı bilgilerini alarak ekrana yazar.
Veritabanına bağlanarak tüm kullanıcıların dizisini çeker, ardından bu dizinin elemanları(kullanıcılar) foreach döngüsü yardımıyla elde edilir. Sonrasında, eğer bu fonksiyona istek gönderen kullanıcı yetkiliyse, dizideki kullanıcının ekrana yazdırıldığı yerin yanında ayrıca bir "Banla" butonu görür, ve halihazırda o kullanıcı banlanmışsa "KULLANICI BANLI" yazısını görür. Eğer istek atan kullanıcı yetkili değilse bu özelliklerden herhangi birisi gözükmez.

  • getAuth($id) : ID'si verilen kullanıcının yetki numarasını verir.
Yetki numaraları :
1 = Normal üye
2 = Yetkili üye
3 = Üst Düzey Yetkili


  • getAuthorityText($id) : ID'si verilen kullanıcının yetkisinin ne olduğunu CSS ile şekillendirilmiş bir şekilde verir.
  • banUser($id, $reason, $byId) : ID'si verilen kullanıcıyı, "verilen sebep" ve "banlayan kişi" parametreleriyle banlar.
  • isBanned($id) : ID'si verilen kullanıcı banlanmışsa 1, banlanmamışsa 0 değerini verir.
  • unban($id) : ID'si verilen kullanıcının banını kaldırır.
  • getBanInfo($id) : Bir dizi oluşturup bu diziyi ID'si verilen kullanıcının banlanma bilgileri ile doldurur ve geri döndürür. Bir dizi kullanılmasının sebebi, iki tane bilgi olduğundan (ban sebebi, banlayan) bu bilgilere array keyleri yardımıyla kolay ulaşmak içindir.


Şimdi yetkililerin kullanıcıları nereden banlayacağına bakalım.

ban.php

PHP:
<?php
session_start();
require "check_ban.php";
if(
    !@$_SESSION["username"]
    || $userFuncs->getAuth($userFuncs->getId(@$_SESSION["username"])) < 2
    || !isset($_GET["id"])
    || @$_GET["id"] == @$userFuncs->getId(@$_SESSION["username"])
    || @$userFuncs->getAuth(@$_GET["id"]) >= @$userFuncs->getAuth($userFuncs->getId(@$_SESSION["username"]))
    || @$userFuncs->isBanned(@$_GET["id"])
){
    header("Location:index.php");
    exit();
    die();
}
?>
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Kullanıcı Ban Sistemi</title>
    <link rel="stylesheet" href="style.css">
</head>
<body style="position:relative; display:flex; flex-direction:column; justify-content:center; align-items:center;">
    <div class="username" style="position:absolute; top:20px; right:40px;">
        <?php echo "<h2>" . $_SESSION["username"] . "</h2>" . $userFuncs->getAuthorityText($userFuncs->getId($_SESSION["username"])); ?>
    </div>

    <h1 style="margin:20px;">Banlanacak Üye<br> <?php echo $userFuncs->getUsername($_GET["id"]) . " - " . $userFuncs->getAuthorityText($_GET["id"]); ?></h1>
    <span style="font-size:20px;">Ban Sebebi : </span>

    <div>
        <form action="" method="POST">
            <textarea style="resize:none; margin-bottom:10px; font-size:17px; padding:10px; text-align:center;" name="banReason" cols="55" rows="15"></textarea><br>
            <button type="submit" class="ban-btn" style="padding:10px; width:150px; font-size:17px; font-weight:bolder;">Banla</button>
        </form>

        <?php
            if(@$_POST["banReason"]){
                $bannedId = htmlspecialchars(trim($_GET["id"]), ENT_QUOTES);
                $banReason = htmlspecialchars(trim($_POST["banReason"]), ENT_QUOTES);

                $userFuncs->banUser($bannedId, $banReason, $userFuncs->getId(@$_SESSION["username"]));
            }
       
        ?>
    </div>

</body>
</html>

Yetkililer arayüzde listelenen kullanıcının yanındaki ban butonuna bastıkları zaman buraya yönlendirilecekler. Banlanan kişinin ID'si $_GET parametresiyle bildirilecek.


Burada yapılan if kontrolu sırasıyla :
  • Kullanıcının şu anda açık hesabı var mı?
  • Kullanıcının banlamak için yetkisi var mı?
  • Banlanılması istenen kişinin ID'si $_GET parametresi olarak verilmiş mi?
  • Kullanıcı kendisini banlamaya çalışmıyor, değil mi?
  • Kullanıcının banlamaya çalıştığı kişi kendi rütbesinden küçük mü?
  • Kullanıcının banlamaya çalıştığı kişinin halihazırda bir ban durumu yok, değil mi?

Eğer bu durumlardan herhangi birine 0(Olumsuz) cevabı gelirse, istek atan kullanıcı anasayfaya yönlendirilir.


Sonrasında yetkili personel forumu doldurup butona bastığı anda, kullanıcı yetkilinin verdiği sebeple birlikte banlanır.


check_ban.php
PHP:
<?php
    require "userfuncs.php";
    $userFuncs = new UserFuncs();

    $userFuncs = new UserFuncs();
    if($userFuncs->isBanned($userFuncs->getId(@$_SESSION["username"]))){
        header("Location:you_are_banned.php");
        die();
        exit();
    }                          



?>

Bu kodu anasayfaya eklediğimiz takdirde, eğer kullanıcı banlıysa anasayfaya giremeden kendisinin banlandığını bildiren sayfaya aktarılacaktır.


Ban bildiren sayfa :

you_are_banned.php
PHP:
<?php
session_start();
require "userfuncs.php";
$userFuncs = new UserFuncs();

if(!@$_SESSION["username"] || $userFuncs->isBanned($userFuncs->getId(@$_SESSION["username"])) == 0){
    header("Location:home.php");
}
?>

<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Kullanıcı Ban Sistemi</title>
    <link rel="stylesheet" href="style.css">
</head>
<body style="display:flex; flex-direction:column; justify-content:center; align-items:center;">
    <h1>Banlandınız.</h1>
    <h3>Banlayan : <?php echo $userFuncs->getBanInfo($userFuncs->getId(@$_SESSION["username"]))["banned_by"]; ?><br>
    Ban Sebebi : </h3>
    <div style="padding:5px; word-break: break-word; width:30%; text-align:center;">
        <?php echo $userFuncs->getBanInfo($userFuncs->getId(@$_SESSION["username"]))["ban_reason"]; ?>
    </div>
</body>
</html>

Eğer bu sayfayı görüntülemeye çalışan kişinin hesabı yoksa veya banlı değilse anasayfaya aktarılır.
Ve gözüktüğü gibi, ekrana ban bilgilerini yazdıracak. Tüm fonksiyonları yukarıda konuşmuştuk.




Son olarak, profesyonel mimarilerde bu gibi bir ban sistemini nasıl kullanabiliriz? Sunucuda onlarca ve hatta yüzlerce sayfa olabilir. Bu gibi durumlarda MVC yapısı tercih edilebilir (Model-View-Controller). Bu konuda mantığını anlamaya çalıştığımız için her sayfaya her yere ban kontrol dosyasını dahil etmedim, fakat gerçek bir sistemde her yerde ban kontrolü olmak zorunda. Bu durumda MVC yapısını kullanan bir sistemi baz aldığımızda, kullanıcı herhangi bir sayfayı bir fonksiyonu talep ederken bir Controller üzerinden istediğini sunuyor. Sonra Controller kullanıcı ne istediğiyse ona göre ya veri tabanı işlemleriyle ilgilenen Model'e gidiyor ya da herhangi bir sayfa talep edildiyse View'e gidiyor. Eğer Controller'in constructor() yapıcı metoduna bu ban kontrolünü koyarsak herhangi bir istek işlenmeden önce kullanıcının ban durumu göz önüne alınıp ona göre aksiyon alınacak.


Eğer gözden kaçırdığım kritik bir nokta veya anlatımını yanlış yaptığım bir kod bloğu varsa okuyanlardan özür diliyorum, bildirirseniz hatayı gideririm.




İyi forumlar, sistemden görüntüler :







- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



Eline sağlık
 

codinger06

Üye
1 Mar 2023
161
5
136
127.0.0.1
Emeğine sağlık, gayet bilgilendirici.
eline sağlık , özen göstermiş, emek vermişsin ve buna değmiş. Eline sağlık
Ellerine emeklerine sağlık.Bu tarz içeriklerde konularını tekrardan görmek isteriz emeklerine sağlık.
Elinize sağlık, basit siteler için mükemmel olmuş

Teşekkürler değerli yorumlarınız için.
 
Son düzenleme:

gostking

Katılımcı Üye
29 Nis 2020
362
13
688
Vatan
Merhabalar. Bu konuda backend olarak sadece PHP ile temel ban sistemi yapımından söz edeceğim. Bu konu sadece sistemin mantığını kavramak içindir. Profesyonel sistemlere (MVC mimarileri gibi) bu anlatacağım ban sistemi olduğu gibi entegre edilemez. Sistemi anlattıktan sonra profesyonel mimarilere nasıl entegre edebiliriz sorusunun cevabını arayacağız.

Sistem : https://www.dosyaupload.com/1rbdg/KullanıcıBanSistemi.rar
VirusTotal : VirusTotal

Bu konuda tasarımla alakalı olan kısımlara değinmedim. Şu anda tek odak noktamız ban sistemi.



Şimdi konuya geçelim, öncelikle sistemde kullanacağımız küçük veritabanı :
kullanici_ban_sistemi >> `users`




Şimdi, çeşitli yerlerde kullanacağımız fonksiyonları barındıran bir sınıfımız var :

userfuncs.php

PHP:
class UserFuncs{
    public function __construct() {
        $this->db = new PDO("mysql:host=localhost;dbname=kullanici_ban_sistemi;charset=UTF8", "root", "");
    }

    function getId($username){

        $username = htmlspecialchars(trim($username), ENT_QUOTES);
        $user = $this->db->query("SELECT * FROM users WHERE username='$username'", PDO::FETCH_ASSOC);
        foreach ($user as $u) {
            return $u["id"];
        }
    }

    function getUsername($id){
        $id = htmlspecialchars(trim($id), ENT_QUOTES);
        $user = $this->db->query("SELECT * FROM users WHERE id='$id'", PDO::FETCH_ASSOC);
        foreach ($user as $u) {
            return $u["username"];
        }      
    }
   
    function listUsers(){
        $users = $this->db->query("SELECT * FROM users ORDER BY authority DESC", PDO::FETCH_ASSOC);
        foreach ($users as $u) {
            $id = $u["id"];
            $username = $u["username"];
            $authorityText = $this->getAuthorityText($id);
            $banned = $u["banned"];

           

            if($this->getAuth($this->getId($_SESSION["username"])) == 1){
                $banBtnDiv = "";
                $unbanBtnDiv = "";
            }else{
                $banBtnDiv = '<span class="ban"><a class="ban-btn" href="ban.php?id='.$id.'">Banla</a></span>';
                if($banned == 1){
                    $banBtnDiv = "<span style='color:darkred; font-weight:bolder;'>KULLANICI BANLI</span><span class='unban'><a class='ban-btn' style='background-color:darkgreen;' href='unban.php?id=".$id."'>Banı Kaldır</a></span>";
                }  
            }



            echo
            '
            <div class="user">
                <span class="username">'.$username.' - '.$authorityText.'</span>
                <span class="block"><button class="block-btn">Engelle</button></span>
                '.$banBtnDiv.'
            </div>

            ';
        }
    }


    function getAuth($id){
        $user = $this->db->query("SELECT * FROM users WHERE id='$id'", PDO::FETCH_ASSOC);
        foreach ($user as $u) {
            return $u["authority"];
        }

    }

   
    function getAuthorityText($id){
        $user = $this->db->query("SELECT * FROM users WHERE id='$id'", PDO::FETCH_ASSOC);
        foreach ($user as $u) {
            $authority = $u["authority"];
        }

        switch ($authority) {
            case 1:
                $authorityText = "<span>Normal Üye</span>";
                break;
           
            case 2:
                $authorityText = "<span style='color:darkblue;'>Yetkili Üye</span>";
                break;
           
            case 3:
                $authorityText = "<span style='color:red; font-weight:bolder;'>Üst Düzey Yetkili</span>";
                break;
        }

        return $authorityText;
    }
   
    function banUser($id, $reason, $byId){
        $banUser = $this->db->prepare("UPDATE users SET banned=1, ban_reason='$reason', banned_by='$byId' WHERE id='$id'");
        if($banUser->execute()){
            header("Location:home.php");
        }
    }

    function unban($id){
        $unbanUser = $this->db->prepare("UPDATE users SET banned=0, ban_reason='', banned_by=0");
        if($unbanUser->execute()){
            header("Location:home.php");
        }
    }

    function isBanned($id){
        $user = $this->db->query("SELECT * FROM users WHERE id='$id'", PDO::FETCH_ASSOC);
        foreach ($user as $u) {
            return $u["banned"] ? 1 : 0;
        }
    }

    function getBanInfo($id){
        $info = [];
        $user = $this->db->query("SELECT * FROM users WHERE id='$id'", PDO::FETCH_ASSOC);
        foreach ($user as $u) {
            $info["ban_reason"] = $u["ban_reason"];
            $info["banned_by"] = $this->getUsername($u["banned_by"]);
        }

        return $info;
    }
}




Fonksiyonların işlevleri :
  • getId($username) : Veri tabanına bağlanarak, kendisine verilen kullanıcı adına sahip sütunun ID'sini verir.
  • getUsername($id) : Kendisine verilen ID'ye sahip sütunun kullanıcı adını verir.
  • listUsers() : Kullanıcı bilgilerini alarak ekrana yazar.
Veritabanına bağlanarak tüm kullanıcıların dizisini çeker, ardından bu dizinin elemanları(kullanıcılar) foreach döngüsü yardımıyla elde edilir. Sonrasında, eğer bu fonksiyona istek gönderen kullanıcı yetkiliyse, dizideki kullanıcının ekrana yazdırıldığı yerin yanında ayrıca bir "Banla" butonu görür, ve halihazırda o kullanıcı banlanmışsa "KULLANICI BANLI" yazısını görür. Eğer istek atan kullanıcı yetkili değilse bu özelliklerden herhangi birisi gözükmez.

  • getAuth($id) : ID'si verilen kullanıcının yetki numarasını verir.
Yetki numaraları :
1 = Normal üye
2 = Yetkili üye
3 = Üst Düzey Yetkili


  • getAuthorityText($id) : ID'si verilen kullanıcının yetkisinin ne olduğunu CSS ile şekillendirilmiş bir şekilde verir.
  • banUser($id, $reason, $byId) : ID'si verilen kullanıcıyı, "verilen sebep" ve "banlayan kişi" parametreleriyle banlar.
  • isBanned($id) : ID'si verilen kullanıcı banlanmışsa 1, banlanmamışsa 0 değerini verir.
  • unban($id) : ID'si verilen kullanıcının banını kaldırır.
  • getBanInfo($id) : Bir dizi oluşturup bu diziyi ID'si verilen kullanıcının banlanma bilgileri ile doldurur ve geri döndürür. Bir dizi kullanılmasının sebebi, iki tane bilgi olduğundan (ban sebebi, banlayan) bu bilgilere array keyleri yardımıyla kolay ulaşmak içindir.


Şimdi yetkililerin kullanıcıları nereden banlayacağına bakalım.

ban.php

PHP:
<?php
session_start();
require "check_ban.php";
if(
    !@$_SESSION["username"]
    || $userFuncs->getAuth($userFuncs->getId(@$_SESSION["username"])) < 2
    || !isset($_GET["id"])
    || @$_GET["id"] == @$userFuncs->getId(@$_SESSION["username"])
    || @$userFuncs->getAuth(@$_GET["id"]) >= @$userFuncs->getAuth($userFuncs->getId(@$_SESSION["username"]))
    || @$userFuncs->isBanned(@$_GET["id"])
){
    header("Location:index.php");
    exit();
    die();
}
?>
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Kullanıcı Ban Sistemi</title>
    <link rel="stylesheet" href="style.css">
</head>
<body style="position:relative; display:flex; flex-direction:column; justify-content:center; align-items:center;">
    <div class="username" style="position:absolute; top:20px; right:40px;">
        <?php echo "<h2>" . $_SESSION["username"] . "</h2>" . $userFuncs->getAuthorityText($userFuncs->getId($_SESSION["username"])); ?>
    </div>

    <h1 style="margin:20px;">Banlanacak Üye<br> <?php echo $userFuncs->getUsername($_GET["id"]) . " - " . $userFuncs->getAuthorityText($_GET["id"]); ?></h1>
    <span style="font-size:20px;">Ban Sebebi : </span>

    <div>
        <form action="" method="POST">
            <textarea style="resize:none; margin-bottom:10px; font-size:17px; padding:10px; text-align:center;" name="banReason" cols="55" rows="15"></textarea><br>
            <button type="submit" class="ban-btn" style="padding:10px; width:150px; font-size:17px; font-weight:bolder;">Banla</button>
        </form>

        <?php
            if(@$_POST["banReason"]){
                $bannedId = htmlspecialchars(trim($_GET["id"]), ENT_QUOTES);
                $banReason = htmlspecialchars(trim($_POST["banReason"]), ENT_QUOTES);

                $userFuncs->banUser($bannedId, $banReason, $userFuncs->getId(@$_SESSION["username"]));
            }
       
        ?>
    </div>

</body>
</html>

Yetkililer arayüzde listelenen kullanıcının yanındaki ban butonuna bastıkları zaman buraya yönlendirilecekler. Banlanan kişinin ID'si $_GET parametresiyle bildirilecek.


Burada yapılan if kontrolu sırasıyla :
  • Kullanıcının şu anda açık hesabı var mı?
  • Kullanıcının banlamak için yetkisi var mı?
  • Banlanılması istenen kişinin ID'si $_GET parametresi olarak verilmiş mi?
  • Kullanıcı kendisini banlamaya çalışmıyor, değil mi?
  • Kullanıcının banlamaya çalıştığı kişi kendi rütbesinden küçük mü?
  • Kullanıcının banlamaya çalıştığı kişinin halihazırda bir ban durumu yok, değil mi?

Eğer bu durumlardan herhangi birine 0(Olumsuz) cevabı gelirse, istek atan kullanıcı anasayfaya yönlendirilir.


Sonrasında yetkili personel forumu doldurup butona bastığı anda, kullanıcı yetkilinin verdiği sebeple birlikte banlanır.


check_ban.php
PHP:
<?php
    require "userfuncs.php";
    $userFuncs = new UserFuncs();

    $userFuncs = new UserFuncs();
    if($userFuncs->isBanned($userFuncs->getId(@$_SESSION["username"]))){
        header("Location:you_are_banned.php");
        die();
        exit();
    }                          



?>

Bu kodu anasayfaya eklediğimiz takdirde, eğer kullanıcı banlıysa anasayfaya giremeden kendisinin banlandığını bildiren sayfaya aktarılacaktır.


Ban bildiren sayfa :

you_are_banned.php
PHP:
<?php
session_start();
require "userfuncs.php";
$userFuncs = new UserFuncs();

if(!@$_SESSION["username"] || $userFuncs->isBanned($userFuncs->getId(@$_SESSION["username"])) == 0){
    header("Location:home.php");
}
?>

<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Kullanıcı Ban Sistemi</title>
    <link rel="stylesheet" href="style.css">
</head>
<body style="display:flex; flex-direction:column; justify-content:center; align-items:center;">
    <h1>Banlandınız.</h1>
    <h3>Banlayan : <?php echo $userFuncs->getBanInfo($userFuncs->getId(@$_SESSION["username"]))["banned_by"]; ?><br>
    Ban Sebebi : </h3>
    <div style="padding:5px; word-break: break-word; width:30%; text-align:center;">
        <?php echo $userFuncs->getBanInfo($userFuncs->getId(@$_SESSION["username"]))["ban_reason"]; ?>
    </div>
</body>
</html>

Eğer bu sayfayı görüntülemeye çalışan kişinin hesabı yoksa veya banlı değilse anasayfaya aktarılır.
Ve gözüktüğü gibi, ekrana ban bilgilerini yazdıracak. Tüm fonksiyonları yukarıda konuşmuştuk.




Son olarak, profesyonel mimarilerde bu gibi bir ban sistemini nasıl kullanabiliriz? Sunucuda onlarca ve hatta yüzlerce sayfa olabilir. Bu gibi durumlarda MVC yapısı tercih edilebilir (Model-View-Controller). Bu konuda mantığını anlamaya çalıştığımız için her sayfaya her yere ban kontrol dosyasını dahil etmedim, fakat gerçek bir sistemde her yerde ban kontrolü olmak zorunda. Bu durumda MVC yapısını kullanan bir sistemi baz aldığımızda, kullanıcı herhangi bir sayfayı bir fonksiyonu talep ederken bir Controller üzerinden istediğini sunuyor. Sonra Controller kullanıcı ne istediğiyse ona göre ya veri tabanı işlemleriyle ilgilenen Model'e gidiyor ya da herhangi bir sayfa talep edildiyse View'e gidiyor. Eğer Controller'in constructor() yapıcı metoduna bu ban kontrolünü koyarsak herhangi bir istek işlenmeden önce kullanıcının ban durumu göz önüne alınıp ona göre aksiyon alınacak.


Eğer gözden kaçırdığım kritik bir nokta veya anlatımını yanlış yaptığım bir kod bloğu varsa okuyanlardan özür diliyorum, bildirirseniz hatayı gideririm.




İyi forumlar, sistemden görüntüler :







- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



Eline sağlık tasarıma özen gösterilmiş gibi duruyor.
 

codinger06

Üye
1 Mar 2023
161
5
136
127.0.0.1
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.