İlan
04 Haz 2026 20 çevrimiçi üye Duyurular
Ana Sayfa Metin2 PvP Panel - Web
Ana Sayfa Forum Metin2 PvP Panel - Web "Mikro Satış Yönetimi"...
İlan Yan banner placeholder

"Mikro Satış Yönetimi"

ynscnr55 20.04.2026 01:56 768 görüntüleme 18 cevap
Son Mesaj
ynscnr55
Üye
Üye
Katılım22 Ara 2025
Konular7
Mesajlar50
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
20.04.2026 01:56 #1
BOŞ ZAMANLARIMDA YAPTIĞIM VE ÇOKÇA EMEK VERDİĞİM BİR SİSTEMDİR GÖNÜL RAHATLIĞI İLE KULLANABİLİRSİNİZ.

EKLENEN GÜVENLİK ÖNLEMLERİ:
1- URL Manipülasyonu Önlemi
2- XSS (Cross-Site Scripting) koruması
3- CSRF (Cross-Site Request Forgery Token) Önlemi

4- Veri Tipi Kontrolü
5- SQL Enejksiyonu Önlemi

Hesap satış sistemi nedir?
-Hesap satış sistemi oyununuzun Mysql veritabanına php ile bağlantı kurulup oyuncular arasında hesap alış-veriş'inde otomasyon sağlar.

KURULUM
1- satis_paneli klasörünü direk olarak web sitenizin ana dizinine atın.(.htaccess hatası almamak için buna dikkat edin.)
2- config/database.php İçeriğini kendi oyun sunucunuzun veritabanı bilgileri ile değiştirin.
3- (ÖNEMLİ): player.player ve account.account tablolarınızın yapısını InnoDB yapın.
4- SQL klasöründe bulunan player klasörü içeriğini player.player tablolarınıza aktarın. (LÜTFEN 3. MADDE DE İŞLEMİ YAPTIKTAN SONRA SQL DOSYALARINI ATIN!!!)
5- Temanın içeriğini, metin içeriklerini kendi sunucunuza özel değiştirebilirsiniz.

NOT:

1- İlan kurulduktan sonra oyuna giriş engeli için ban_time kısmı kullanılıyor. "0000-00-00 00:00:00" formatında
kullanmak isteyen arkadaşlar farklı ban sistemi gibi bir sistem ekleyebilir oyununa.
2- İlanın satış bakiyesi için Ejderha parası yani account.account=cash stünü kullanıldı dileyen arkadaşlar

farklı bir birim kullanabilir.

Nasıl Çalışır?

Oyunun Account tablosunda bulunan bilgiler ile (web sitesinde oluşturulan üyelik) sisteme giriş yapılır. Oyuncu hesabını satmak ister ise
ilan ekle kısmından öncelik olarak gösterilecek karakteri seçer ve açıklama, başlık, fiyatı gibi ilan bilgilerini ekler. İlan satıldıktan sonra
gelen kazancın hangi hesaba aktarılacağı (kullanıcı adı ve Email) bilgili hesabı girer ve ilan satıldıktan sonra gelen bakiye belirlenen kullanıcının hesabına aktarılır.
İlan satın alınırken mail ve password bilgileri girilen bilgiler ile güncellenir.

GÜNCELLEMELER ve NOTLAR
---------------------------------------------

DÜZENLEME: Konu içerisinde verilen ilan-duzenle.php ve UserController.php dosyalarının içeriğini değiştirin!






VİRÜSTOTAL
views/user/ilan-duzenle.php:
<?php include '../views/layouts/header.php'; ?>

<h2>İlanı Düzenle</h2>

<?php if (isset($error)): ?>
    <p><?php echo htmlspecialchars($error); ?></p>
<?php endif; ?>

<form action="/index.php?route=user&action=ilan-duzenle-submit" method="post">
    <input type="hidden" name="id" value="<?php echo htmlspecialchars($ilan['id']); ?>">

    <div>
        <label for="player_id">Satılacak Karakter:</label>
        <select name="player_id" id="player_id" required disabled>
            <option value="<?php echo htmlspecialchars($ilan['player_id']); ?>">
                <?php echo htmlspecialchars($ilan['karakter_adi']); ?> (Level <?php echo htmlspecialchars($ilan['level']); ?>, <?php echo htmlspecialchars(getJobName($ilan['job'])); ?>)
            </option>
        </select>
        <p>Karakter seçimi değiştirilemez.</p>
    </div>

    <div>
        <label for="baslik">İlan Başlığı:</label>
        <input type="text" id="baslik" name="baslik" value="<?php echo htmlspecialchars($ilan['baslik']); ?>" required>
    </div>

    <div>
        <label for="fiyat">Fiyat (Ejderha Parası):</label>
        <input type="number" id="fiyat" name="fiyat" min="1" value="<?php echo htmlspecialchars($ilan['fiyat']); ?>" required>
    </div>

    <div>
        <label for="aciklama">Açıklama:</label>
        <textarea id="aciklama" name="aciklama" rows="5"><?php echo htmlspecialchars($ilan['aciklama']); ?></textarea>
    </div>

    <hr>

    <div>
        <h3>Kazancın Aktarılacağı Hesap Bilgileri</h3>
        <p>İlanınız satıldığında, kazancınız aşağıdaki bilgilere sahip hesaba aktarılacaktır.</p>
        <div>
            <label for="alici_login">Alıcı Hesap Login:</label>
            <input type="text" id="alici_login" name="alici_login" value="<?php echo htmlspecialchars($ilan['alici_login']); ?>" required>
        </div>

        <div>
            <label for="alici_mail">Alıcı Hesap E-posta:</label>
            <input type="email" id="alici_mail" name="alici_mail" value="<?php echo htmlspecialchars($ilan['alici_mail']); ?>" required>
        </div>
    </div>

    <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
    <button type="submit">İlanı Güncelle</button>
</form>

<p><a href="/index.php?route=user&action=ilan-listele">İlanlarıma Geri Dön</a></p>

<?php
function getJobName($jobId) {
    switch ($jobId) {
        case 0: return 'Savaşçı';
        case 1: return 'Ninja';
        case 2: return 'Sura';
        case 3: return 'Şaman';
        default: return 'Bilinmiyor';
    }
}
?>

<?php include '../views/layouts/footer.php'; ?>
değiştir conrtollers/usercontoller.php:
<?php

class UserController {
    private $ilanModel;
    private $playerModel;
    private $accountModel;
    private $devirAlModel;

    public function __construct() {
        $this->ilanModel = new IlanModel();
        $this->playerModel = new PlayerModel();
        $this->accountModel = new AccountModel();
        $this->devirAlModel = new DevirAlModel();
    }

    public function kontrolPanel() {
        if (!isset($_SESSION['user_id'])) {
            header('Location: /index.php?route=auth&action=giris');
            exit();
        }
        $accountInfo = $this->accountModel->getAccountById($_SESSION['user_id']);
        $seller_id = $_SESSION['user_id'];
        $ilanSayisi = $this->ilanModel->getIlanSayisiBySellerId($seller_id);

        $satinalinanlar = $this->devirAlModel->getSatinalinanHesaplar($_SESSION['user_id']);

        $data = [
            'accountInfo' => $accountInfo,
            'ilanSayisi' => $ilanSayisi,
            'satinalinanlar' => $satinalinanlar,
        ];
        // **XSS Önlemi:** Çıktılar view'da güvenli hale getirilecek (htmlspecialchars)
        include '../views/user/kontrol-paneli.php';
    }

    public function ilanListele() {
        if (!isset($_SESSION['user_id'])) {
            header('Location: /index.php?route=auth&action=giris');
            exit();
        }
        $seller_id = $_SESSION['user_id'];
        $ilanlar = $this->ilanModel->getIlansBySellerId($seller_id);
        // **XSS Önlemi:** Çıktılar view'da güvenli hale getirilecek (htmlspecialchars)
        include '../views/user/ilan-listele.php';
    }

    public function ilanVerForm() {
        if (!isset($_SESSION['user_id'])) {
            header('Location: /index.php?route=auth&action=giris');
            exit();
        }

        $seller_id = $_SESSION['user_id'];
        $ilanSayisi = $this->ilanModel->getIlanSayisiBySellerId($seller_id);

        if ($ilanSayisi >= 1) {
            $error = 'Mevcutta aktif bir ilanınız bulunmaktadır. Yeni bir ilan ekleyebilmek için öncelikle mevcut ilanınızı kaldırmanız gerekmektedir.';
            $accountInfo = $this->accountModel->getAccountById($_SESSION['user_id']);
            $data = [
                'accountInfo' => $accountInfo,
                'error' => htmlspecialchars($error, ENT_QUOTES, 'UTF-8'), // XSS önlemi
            ];
            // **XSS Önlemi:** Çıktılar view'da güvenli hale getirilecek (htmlspecialchars)
            include '../views/user/kontrol-paneli.php';
            return;
        }

        $characters = $this->playerModel->getCharactersByAccountId($_SESSION['user_id']);
        // **XSS Önlemi:** Çıktılar view'da güvenli hale getirilecek (htmlspecialchars)
        include '../views/user/ilan-ver.php';
    }

public function ilanVerSubmit() {
    // CSRF token kontrolü
    if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
        exit("Güvenlik uyarısı: Geçersiz istek (CSRF token hatası - İlan Ver Submit).");
    }

    if (!isset($_SESSION['user_id']) || $_SERVER['REQUEST_METHOD'] !== 'POST') {
        header('Location: /');
        exit();
    }

    $player_id = filter_var($_POST['player_id'], FILTER_SANITIZE_NUMBER_INT);
    $baslik = htmlspecialchars(trim($_POST['baslik']), ENT_QUOTES, 'UTF-8');
    $fiyat = filter_var($_POST['fiyat'], FILTER_SANITIZE_NUMBER_INT);
    $aciklama = htmlspecialchars(trim($_POST['aciklama']), ENT_QUOTES, 'UTF-8');
    $alici_login = htmlspecialchars(trim($_POST['alici_login']), ENT_QUOTES, 'UTF-8');
    $alici_mail = filter_var(trim($_POST['alici_mail']), FILTER_SANITIZE_EMAIL);

    $aliciHesap = $this->accountModel->getUserByLogin($alici_login);

    if (!$aliciHesap) {
        $error = 'Girilen alıcı login bilgisine ait bir hesap bulunamadı.';
        $characters = $this->playerModel->getCharactersByAccountId($_SESSION['user_id']);
        $data = ['error' => htmlspecialchars($error, ENT_QUOTES, 'UTF-8'), 'characters' => $characters];
        // **XSS Önlemi:** Çıktılar view'da güvenli hale getirilecek (htmlspecialchars)
        include '../views/user/ilan-ver.php';
        return;
    }

    if (isset($aliciHesap['email']) && $aliciHesap['email'] !== $alici_mail) {
        $error = 'Girilen alıcı e-posta adresi bu hesaba ait değil.';
        $characters = $this->playerModel->getCharactersByAccountId($_SESSION['user_id']);
        $data = ['error' => htmlspecialchars($error, ENT_QUOTES, 'UTF-8'), 'characters' => $characters];
        // **XSS Önlemi:** Çıktılar view'da güvenli hale getirilecek (htmlspecialchars)
        include '../views/user/ilan-ver.php';
        return;
    }

    $birYilSaniye = 365 * 24 * 60 * 60; // 1 yıl saniye cinsinden
    $banBitisTimestamp = time() + $birYilSaniye;
    $banBitisZamani = date('Y-m-d H:i:s', $banBitisTimestamp);

    if ($this->ilanModel->createIlan($player_id, $_SESSION['user_id'], $baslik, $fiyat, $aciklama, $alici_login, $alici_mail)) {
        $character = $this->playerModel->getPlayerById($player_id);
        if ($character) {
            $account_id = $character['account_id'];
            if ($this->accountModel->updateBanTime($account_id, $banBitisZamani)) {
                header('Location: /index.php?route=user&action=ilan-listele&success=1');
            } else {
                $error = 'İlan yayınlandı ancak karakterin giriş engelleme süresi güncellenirken bir hata oluştu.';
                $characters = $this->playerModel->getCharactersByAccountId($_SESSION['user_id']);
                $data = ['error' => htmlspecialchars($error, ENT_QUOTES, 'UTF-8'), 'characters' => $characters];
                // **XSS Önlemi:** Çıktılar view'da güvenli hale getirilecek (htmlspecialchars)
                include '../views/user/ilan-ver.php';
                return;
            }
        } else {
            $error = 'İlan yayınlandı ancak karakter bilgileri bulunamadı.';
            $characters = $this->playerModel->getCharactersByAccountId($_SESSION['user_id']);
            $data = ['error' => htmlspecialchars($error, ENT_QUOTES, 'UTF-8'), 'characters' => $characters];
            // **XSS Önlemi:** Çıktılar view'da güvenli hale getirilecek (htmlspecialchars)
            include '../views/user/ilan-ver.php';
            return;
        }
    } else {
        $error = 'İlan yayınlanırken bir hata oluştu.';
        $characters = $this->playerModel->getCharactersByAccountId($_SESSION['user_id']);
        $data = ['error' => htmlspecialchars($error, ENT_QUOTES, 'UTF-8'), 'characters' => $characters];
        // **XSS Önlemi:** Çıktılar view'da güvenli hale getirilecek (htmlspecialchars)
        include '../views/user/ilan-ver.php';
    }
}

    public function ilanSil() {
        if (!isset($_SESSION['user_id']) || !isset($_GET['id']) || !is_numeric($_GET['id'])) {
            header('Location: /');
            exit();
        }
        // **URL Manipülasyonu Önlemi:** id'nin sayısal ve geçerli olduğunu kontrol et
        $ilan_id = filter_var($_GET['id'], FILTER_SANITIZE_NUMBER_INT);
        $ilan = $this->ilanModel->getIlanById($ilan_id);
        if ($ilan && $ilan['seller_id'] === $_SESSION['user_id']) {
            $character = $this->playerModel->getPlayerById($ilan['player_id']);
            if ($character) {
                $account_id = $character['account_id'];
                $this->accountModel->updateBanTime($account_id, 0);
            }

            if ($this->ilanModel->deleteIlan($ilan_id)) {
                header('Location: /index.php?route=user&action=ilan-listele&success_delete=1');
            } else {
                $error = 'İlan silinirken bir hata oluştu.';
                $ilanlar = $this->ilanModel->getIlansBySellerId($_SESSION['user_id']);
                $data = ['error' => htmlspecialchars($error, ENT_QUOTES, 'UTF-8'), 'ilanlar' => $ilanlar];
                // **XSS Önlemi:** Çıktılar view'da güvenli hale getirilecek (htmlspecialchars)
                include '../views/user/ilan-listele.php';
            }
        } else {
            header('Location: /index.php?route=user&action=ilan-listele&error_permission=1');
        }
    }

    public function ilanDuzenleForm() {
        if (!isset($_SESSION['user_id']) || !isset($_GET['id']) || !is_numeric($_GET['id'])) {
            header('Location: /');
            exit();
        }
        // **URL Manipülasyonu Önlemi:** id'nin sayısal ve geçerli olduğunu kontrol et
        $ilan_id = filter_var($_GET['id'], FILTER_SANITIZE_NUMBER_INT);
        $ilan = $this->ilanModel->getIlanDetaylari($ilan_id);
        if (!$ilan || $ilan['seller_id'] !== $_SESSION['user_id']) {
            header('Location: /index.php?route=user&action=ilan-listele&error_permission=1');
            exit();
        }
        $characters = $this->playerModel->getCharactersByAccountId($_SESSION['user_id']);
        // **XSS Önlemi:** Çıktılar view'da güvenli hale getirilecek (htmlspecialchars)
        include '../views/user/ilan-duzenle.php';
    }

public function ilanDuzenleSubmit() {
    // CSRF token kontrolü
    if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
        exit("Güvenlik uyarısı: Geçersiz istek (CSRF token hatası - İlan Düzenle Submit).");
    }

    // Oturum kontrolü, POST isteği kontrolü ve ilan ID kontrolü
    if (!isset($_SESSION['user_id']) || $_SERVER['REQUEST_METHOD'] !== 'POST' || !isset($_POST['id']) || !is_numeric($_POST['id'])) {
        header('Location: /');
        exit();
    }
    // URL/Form Manipülasyonu Önlemi: ilan_id'nin sayısal ve geçerli olduğunu kontrol et
    $ilan_id = filter_var($_POST['id'], FILTER_SANITIZE_NUMBER_INT);
    // XSS Önlemi: Girdi verilerini güvenli hale getir
    $baslik = htmlspecialchars(trim($_POST['baslik']), ENT_QUOTES, 'UTF-8');
    $fiyat = filter_var($_POST['fiyat'], FILTER_SANITIZE_NUMBER_INT);
    $aciklama = htmlspecialchars(trim($_POST['aciklama']), ENT_QUOTES, 'UTF-8');
    $alici_login = htmlspecialchars(trim($_POST['alici_login']), ENT_QUOTES, 'UTF-8');
    $alici_mail = filter_var(trim($_POST['alici_mail']), FILTER_SANITIZE_EMAIL);

    // İlanın varlığını ve kullanıcının yetkisini kontrol et
    $ilan = $this->ilanModel->getIlanById($ilan_id);
    if (!$ilan || $ilan['seller_id'] !== $_SESSION['user_id']) {
        header('Location: /index.php?route=user&action=ilan-listele&error_permission=1');
        exit();
    }

    // Alıcı hesabının varlığını kontrol et
    $aliciHesap = $this->accountModel->getUserByLogin($alici_login);
    if (!$aliciHesap) {
        $error = 'Girilen alıcı login bilgisine ait bir hesap bulunamadı.';
        $characters = $this->playerModel->getCharactersByAccountId($_SESSION['user_id']);
        $data = ['error' => htmlspecialchars($error, ENT_QUOTES, 'UTF-8'), 'characters' => $characters];
        // XSS Önlemi: Çıktılar view'da güvenli hale getirilecek (htmlspecialchars)
        include '../views/user/ilan-duzenle.php';
        return;
    }

    // Alıcı e-posta adresinin alıcı hesabına ait olup olmadığını kontrol et
    if (isset($aliciHesap['email']) && $aliciHesap['email'] !== $alici_mail) {
        $error = 'Girilen alıcı e-posta adresi bu hesaba ait değil.';
        $characters = $this->playerModel->getCharactersByAccountId($_SESSION['user_id']);
        $data = ['error' => htmlspecialchars($error, ENT_QUOTES, 'UTF-8'), 'characters' => $characters];
        // XSS Önlemi: Çıktılar view'da güvenli hale getirilecek (htmlspecialchars)
        include '../views/user/ilan-duzenle.php';
        return;
    }

    // İlan bilgilerini güncelle
    if ($this->ilanModel->updateIlan($ilan_id, $baslik, $fiyat, $aciklama, $alici_login, $alici_mail)) {
        // İlan başarıyla güncellendi, şimdi karakterin ban süresini 1 yıl olarak ayarla
        $character = $this->playerModel->getPlayerById($ilan['player_id']);
        if ($character) {
            $account_id = $character['account_id'];
            $birYilSaniye = 365 * 24 * 60 * 60; // 1 yıl saniye cinsinden
            $banBitisTimestamp = time() + $birYilSaniye;
            $banBitisZamani = date('Y-m-d H:i:s', $banBitisTimestamp);
            if ($this->accountModel->updateBanTime($account_id, $banBitisZamani)) {
                // Başarılı güncelleme mesajıyla ilan listeleme sayfasına yönlendir
                header('Location: /index.php?route=user&action=ilan-listele&success_update=1');
            } else {
                $error = 'İlan güncellendi ancak karakterin giriş engelleme süresi güncellenirken bir hata oluştu.';
                $characters = $this->playerModel->getCharactersByAccountId($_SESSION['user_id']);
                $data = ['error' => htmlspecialchars($error, ENT_QUOTES, 'UTF-8'), 'characters' => $characters];
                // XSS Önlemi: Çıktılar view'da güvenli hale getirilecek (htmlspecialchars)
                include '../views/user/ilan-duzenle.php';
                return;
            }
        } else {
            $error = 'İlan güncellendi ancak karakter bilgileri bulunamadı.';
            $characters = $this->playerModel->getCharactersByAccountId($_SESSION['user_id']);
            $data = ['error' => htmlspecialchars($error, ENT_QUOTES, 'UTF-8'), 'characters' => $characters];
            // XSS Önlemi: Çıktılar view'da güvenli hale getirilecek (htmlspecialchars)
            include '../views/user/ilan-duzenle.php';
            return;
        }
    } else {
        // İlan güncellenirken bir hata oluştu
        $error = 'İlan güncellenirken bir hata oluştu.';
        $characters = $this->playerModel->getCharactersByAccountId($_SESSION['user_id']);
        $data = ['error' => htmlspecialchars($error, ENT_QUOTES, 'UTF-8'), 'characters' => $characters];
        // XSS Önlemi: Çıktılar view'da güvenli hale getirilecek (htmlspecialchars)
        include '../views/user/ilan-duzenle.php';
        return;
        }
    }
}
?>
alperkahriman
ironpeak
Üye
Üye
Katılım13 Ara 2025
Konular7
Mesajlar54
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
22.04.2026 23:04 #2
Selamün aleyküm, emeğinize sağlık lütfen 24 saat içinde virus total ekleyin.
ArmanHAN
Üye
Üye
Katılım17 Ara 2025
Konular5
Mesajlar51
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
25.04.2026 19:02 #3
güzel görünüyor,
eline sağlık.
electroshoc
Üye
Üye
Katılım26 Mar 2026
Konular8
Mesajlar62
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
03.05.2026 06:29 #4
Eline sağlık
lastasmile
Üye
Üye
Katılım13 Ara 2025
Konular6
Mesajlar66
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
04.05.2026 09:48 #5
Paylaşım için teşekkürler, emeğine sağlık.
kalaletto
Üye
Üye
Katılım30 Oca 2026
Konular9
Mesajlar86
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
05.05.2026 04:55 #6
Emeğine Sağlık Başarılarının Devamını Dilerim
ynscnr55
Üye
Üye
Katılım22 Ara 2025
Konular7
Mesajlar50
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
05.05.2026 08:12 #7
güzel görünüyor,
eline sağlık.
Eline sağlık
Teşekkür ederim
ynscnr55
Üye
Üye
Katılım22 Ara 2025
Konular7
Mesajlar50
Elmas Konular0
Başarım0
ZirveCoin 0
Ticaret Puanı
+0 -0
05.05.2026 13:34 #8
Emeğine Sağlık Başarılarının Devamını Dilerim
Paylaşım için teşekkürler, emeğine sağlık.
Teşekkür ederim
Bu konuyu görüntüleyenler
1 misafir
Cevap yazmak için giriş yapın.
İlan Yan banner placeholder