v2.5.2
Giriş yap

Post işleminde açık nerede sürekli hack yiyorum

onnumaraadam
470 defa görüntülendi

merhabalar bir script satın almıştım puan sistemli ve her üyeye günlük (24 saatte) birdefa hediye puan işlemi var

siteme bir üye dadandı sürekli istediği puanı alıyor kod bilgim çok az ne olur yardımcı olun

kısaca index.php de bir adet tıklama buttonu var

    <div class="tablo hediye">
        Günlük Hediyeni almak için tıklayın
    </div>

bu işlem js kısmında ise bu şekilde işlem yaptırılmış

    $('.hediye').on('click',function() {
    $(".hediye").html("Lütfen bekleyin");

    $.post("./php/post.php", {
     tip:"hediye",
     
    },function(r){
        if(r=="ok"){
             window.location.href = './index.php';
        }else{
            if(r=="oturum"){
    			$(".hediye").html("Günlük Hediyeni almak için tıklayın");
                uyar("<br>Oturum açmalısınız");
            }else{
                if(r=="zaten"){
                    $(".hediye").html("Günlük Hediyeni almak için tıklayın");
                    uyar("<br>Bugünlük hediyenizi zaten aldınız<br>24 Saat sonra tekrar alabilirsiniz.");
                }
            }
        }
    });
    });

post.php de ise

burda $hediyelik = $proje->hediyelik; veritabanından belirlediğim puan miktarı


    function guvenlikKapisi($data){
    return htmlspecialchars($data);
    }

    if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['tip'])){
    $_POST  = array_map('guvenlikKapisi', $_POST);
    
    if($_POST['tip']=='hediye'){
        if(isset($_SESSION['oturum']) && $_SESSION['oturum']){
			$profil     =   DB::getRow('SELECT * FROM uyeler WHERE id = ?',array($_SESSION['oturum']));
			$hediyelik   = $proje->hediyelik;
			if($profil){
			$bitis = date('Y-m-d H:i:s', strtotime('+24 hours'));
			$guncelle= DB::exec('UPDATE uyeler SET bakiye=bakiye + ?, hediye=1,hediyetarih=? WHERE id =?',array($hediyelik,$bitis,$_SESSION['oturum']));
			if($guncelle){
				
			echo 'ok';
            return;
			}
				
			}
		}else{
            echo 'oturum';
            return;			
		}
	}
	}
Cevap yaz
Cevaplar (4)
polev
1086 gün önce

Anladım ama bu şekilde sağlıklı çalışma olmaz ve güvenli değil.Biraz araştırmanı tavsiye ederim.

onnumaraadam
1086 gün önce

şöyle ki hocam en son alınan puanın nezaman alındığı deilde
puan ala tıklayınca tıkladığı tarihe 24 saat ekleterek veritabanına biris olarak kayıt ediyor
sonra aşağıdaki kod ile index.php de her açılışta sorgu çalışıyor tarih dolmuş ise button gözüküyor

cevaplarınız için çok teşekkür ederim deneyeceğim
ayrıca kullandığım pdo hazır bir sınıf idi

<?php
if($proje->hediyelikdurum==1){
	$hediye = $me->hediye;
	if($me->hediyetarih<$tmsptarih && $hediye==1){
		$guncelle= DB::exec('UPDATE uyeler SET hediye=0 WHERE id =?',array($me->id)); ?>
		<div class="tablo hediye">
			Günlük <?=$proje->hediyelik;?> Hediyeni almak için tıklayın
		</div>		
<?php }
	if($hediye!=1 and $me->hediyetarih<$tmsptarih){ ?>
		<div class="tablo hediye">
			Günlük <?=$proje->hediyelik;?> Hediyeni almak için tıklayın
		</div>	
<?php } }?>
emresycn
1086 gün önce

Şöyle bir sorun var, 24 saatte bir tıklamasını istiyorsunuz ama bunu kontrol edecek kod yok. En son alınan puanın ne zaman alındığını kontrol ettirmek gerekiyor.

function guvenlikKapisi($data)
{
    return htmlspecialchars($data);
}
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['tip'])) {
    $_POST  = array_map('guvenlikKapisi', $_POST);
    if ($_POST['tip'] == 'hediye') {
        if (isset($_SESSION['oturum']) && $_SESSION['oturum']) {
            $user_id = $_SESSION['oturum'];
            $result = $db->prepare("select * from uyeler where id=:id");
            $result->bindParam(':id', $user_id, PDO::PARAM_INT);
            $result->execute();
	        $kontrol = $result->fetch(PDO::FETCH_ASSOC);
            $userCount = $result->rowCount();
			$saat = date('Y-m-d H:i:s');
			$bitis = $kontrol['hediyetarih'];
			if($saat > $bitis) {
				 if ((int)$userCount > 0) {
                $bitis = date('Y-m-d H:i:s', strtotime('+24 hours'));
                $user_id = $_SESSION['sess_user_id'];
                $guncelle = $db->prepare("UPDATE uyeler SET bakiye=bakiye+:hediyelik,hediye=1,hediyetarih=:hediyetarih where id=:id");
                $guncelle->bindParam(':hediyelik', $hediyelik, PDO::PARAM_INT);
                $guncelle->bindParam(':hediyetarih', $bitis, PDO::PARAM_INT);
                $guncelle->bindParam(':id', $user_id, PDO::PARAM_INT);
                $guncelle->execute();
                echo 'ok';
                return;
				}
			}

        } else {
            echo 'oturum';
            return;
        }
    }
}

Bu kodu dener misiniz ?

polev
1087 gün önce

PDO ile yazarsak sorunu çözülür mü bilmiyorum ama denemek lazım:

<?php
function guvenlikKapisi($data)
{
    return htmlspecialchars($data);
}
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['tip'])) {
    $_POST  = array_map('guvenlikKapisi', $_POST);
    if ($_POST['tip'] == 'hediye') {
        if (isset($_SESSION['oturum']) && $_SESSION['oturum']) {
            $user_id = $_SESSION['oturum'];
            $result = $db->prepare("select * from uyeler where id=:id");
            $result->bindParam(':id', $user_id, PDO::PARAM_INT);
            $result->execute();
            $userCount = $result->rowCount();
            if ((int)$userCount > 0) {
                $userDate   = $result->fetch(PDO::FETCH_ASSOC);
                $fark = time() - strtotime($userDate['hediyetarih']);
                if($fark >= 0){
                    $time = time();
                    $guncelle = $db->prepare("UPDATE uyeler SET bakiye=bakiye+:hediyelik,hediye=1,hediyetarih=:hediyetarih where id=:id");
                    $guncelle->bindParam(':hediyelik', $hediyelik, PDO::PARAM_INT);
                    $guncelle->bindParam(':hediyetarih', $time, PDO::PARAM_STR);
                    $guncelle->bindParam(':id', $user_id, PDO::PARAM_INT);
                    $guncelle->execute();
                    echo 'ok';
                    return;
                }
                else{
                    echo 'zaten';
                    return;
                }
            }
        } else {
            echo 'oturum';
            return;
        }
    }
}


Burda saçma olan şu kayıt ettiğin son tarihi getirmiyorsun ve kontrol sağlamıyorsun.
Hediyeyi hangi tablodan nasıl çekiyor göstermediğin için uygulama yapmadım.

Düzeltme : Kodu düzenledim kontrol sağlamasını yapmakta.Geçmiş olsun :)