Post işleminde açık nerede sürekli hack yiyorum
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;
}
}
}
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 :)