2009-09-03 122 views
3

我有一個問題,這有點奇怪。我的頁面包含一個html鏈接,刷新頁面並調用一個PHP變量。這個變量將一個日期字符串附加到URL字符串中,該字符串被饋送到MySQL查詢中,該查詢獲取匹配此日期的記錄。我認爲這是造成注射,因爲它有時會從數據庫中刪除用戶!可能從日期字符串注入選擇查詢

我知道在超鏈接中使用'#'可能存在安全問題,但我想知道發生了什麼。這也會對不同的瀏覽器看到不同的效果,看它如何使用JavaScript。被刪除的用戶似乎只發生在某些人的電腦上。

的PHP代碼計算從現在三天一戳,然後把它放到一個SQL格式:

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

腳本然後偵聽通過在超鏈接通過「天」的URL字符串變量頁:

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

的JavaScript和超鏈接是:

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

的MySQ L查詢較大,但用戶操作所需的唯一輸入是上述日期字符串。查詢基本上就像這樣(使用另一個select語句訪問用戶表):

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

如果有人可以幫助我,並解釋我的問題,我將非常感激。 非常感謝

回答

2

當你通過$datemysql_real_escape_string,懷疑必須落在$id,或者我們看不到的東西。

A SELECT聲明不會從您的數據庫中刪除東西。你還有什麼在你的PHP文件中負責刪除用戶,並且你可能有一些破壞的邏輯,最終通過刪除用戶的功能,當他們真的不應該這樣做時?

0

以前的回答很好地解釋了您的問題。

而且你可以驗證你的「天」獲得VAR像這樣:

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

你甚至可以指定'$ day'正則表達式相匹配的部分。這種方式如果你有垃圾包含日期(如'2009-09-03'); DROP TABLE學生;'),你把垃圾拿走。 – 2009-09-03 15:19:09

+0

你說得對。正則表達式應該是'^ \ d {4} - \ d {2} - \ d {2} $'^。我的錯 – inakiabt 2009-09-03 17:26:24