Tarih dize Seçme sorgusu mümkün enjeksiyon

2 Cevap php

Ben bir sorun wich biraz garip var. Benim sayfa sayfayı yeniler ve bir PHP değişkeni çağıran bir html bağlantı içerir. Bu değişken, bu tarihi eşleşen kayıtları kapmak bir MySQL sorgusu, beslenir url dizesi bir tarih dizesi ekler. Ben bazen veritabanından kullanıcıyı siler gibi bu bir enjeksiyon neden olduğunu düşünüyorum!

Ben köprü '#' kullanarak güvenlik sorunları olabilir biliyorum, ama ne oluyor bilmek istiyorum. Ayrıca bu o javascript kullanır ne gibi görerek, farklı tarayıcılarda farklı etkileri olurdu. Silinen kullanıcıların sadece bazı halklar bilgisayarlarda gerçekleşmesi gibi görünüyor.

PHP kodu üç gün geç bir zaman damgası hesaplar ve daha sonra bir SQL biçime koyar:

$ts_threeDays   = mktime(1,0,0,date('m'), date('d')+3-date('w'), date('y'));     
$threeDaysAhead = date('y-m-d', $ts_second_day);

Komut dosyası daha sonra sayfadaki köprüyü geçti url dizesinde 'gün' değişkeni için dinler:

$date = mysql_real_escape_string($_GET['day']);

JavaScript ve köprüdür:

<a href='#' onClick="document.location.href='planner.php?day=<?php echo $threeDaysAhead; ?>'"> 3 Days Later</a>

MySQL sorgusu büyük ama o kullanıcı eylem aldığı tek giriş yukarıda tarih dizedir. Sorgu temelde (kullanıcılar tabloya erişmek için başka bir deyim kullanır) bu gibi görünüyor:

SELECT planner.details FROM planner 
WHERE  planner.date = '$date' AND users.`user_id` = '$id' // Logged in Id superglobal

If anyone can help me out and explain my problem I will be most grateful. Many thanks

2 Cevap

Eğer mysql_real_escape_string ile $date geçiyoruz gibi, şüphe ya $id düşmek zorunda, ya da bir şey biz göremiyoruz.

A SELECT beyanı sizin db şeyler silmek için gitmiyor. Başka ne kullanıcıların silme sorumlu bulunuyor PHP dosyası var ve yapmak ne zaman onlar gerçekten kullanıcıları silmek için bir fonksiyon geçerek biter bazı kırık if / else mantığı olabilir olmamalı?

Önceki tepkiler çok iyi sorunu açıklayınız.

Ve bu şekilde gibi 'gün' olsun VAR doğrulamak:

$day = '';
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $_GET['day'])
{
    $day = $_GET['day'];
} else {
    die("bye bye");
}