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!
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
views/user/ilan-duzenle.php:
<?php include '../views/layouts/header.php'; ?>
<h2>İlanı Düzenle</h2>
<?php if (isset($error)): ?>
<p class="error"><?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 class="uyari">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 class="transfer-info">
<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'; ?>
Daha Çok Göster
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;
}
}
}
?>
Daha Çok Göster