2012-03-08 219 views
1

我傳遞一個數據庫生成的id值鏈接到另一個頁面。在我撥打$_GET的接收頁面中,我想防止人們在網址(例如www.mysite.com?id=43)中的?之後插入虛假值。如何檢查查詢字符串中的ID是否有效?

我想檢查傳入的值並確保它是數據庫中的有效標識符,或者有沒有辦法檢查NULL或空值?這是我已經試過:

來源頁面:

echo "<a href=\"get-post-pg2.php?id=" .urlencode($row['id']) ."\">Second Page</a>"; 

目標頁面:

$id = $_GET['id']; 
if(isset($_GET)) { 
    echo $id; 
} else 
    echo 'foo'; 
} 
+0

isset()是檢查值的好方法! – powtac 2012-03-08 20:10:53

+0

要確保只有整數值,可以使用'echo(int)$ id;' – powtac 2012-03-08 20:11:23

+2

'empty()'檢查isset,null和空字符串。但是,如果必須保護該值,則應該使用'$ _SESSION'來持久保存,而不是'$ _GET'將其傳遞到您自己站點上的另一個頁面。 – 2012-03-08 20:11:56

回答

0

你應該做的是投了$ _GET變量到整型...

$id = (int) $_GET['id']; 

然後檢查是否爲空..

if(!empty($id)){ 
    // process code 
} 

任何字符串將被轉換爲零,它在PHP中返回爲空。 然後檢查數據庫中是否存在該ID!

+0

甜!這完美的作品!數據並不重要,我只想學習更好的編碼習慣。非常感謝你的幫助! – Stubb207 2012-03-08 20:30:26

+0

'(int)$ _GET ['id']''會爲'1 Oops!'返回'1',因此可能轉換爲int並不一定是最合適的解決方案(規範url?)。爲什麼不直接在數據庫中查詢'$ _GET ['id']'而不檢查它?如果該行不存在,則顯示404,與用戶傳入的內容無關。Shrapnel提到,無論用戶想要什麼,都無法阻止用戶輸入地址欄。 – 2012-03-08 20:31:19

+0

在我的查詢函數中,我已經測試了查詢,如果失敗了,我重定向到一個oops頁面。所以這一步沒有必要? – Stubb207 2012-03-08 20:43:44

0

在目標頁面上,我只需檢查$ _GET ['id']以確保它是您需要的範圍內的整數,如果不是,則默認爲某個值或重定向用戶。

if(is_int($_GET['id']) And $_GET['id']>=1 And $_GET['id'] <= 1000) { 
    //proceed 
} 
else { 
    header('Location:...'); // or set $id to a default value 
} 
+0

我的下一步也是重定向!乾杯! – Stubb207 2012-03-08 20:31:10

0

檢查傳入值並確保它是來自數據庫IS的有效標識符的唯一方法是根據數據庫查詢它。簡單,呃?

我想防止人們插入虛假值後?在網址中。

答案更簡單 - 你不行。
雖然你可以驗證你的ID,但是我個人很少打擾這種愚蠢的原因驗證變量。

+0

解救的常識!另外,'0'可能是一個有效的ID - 如果你使用像「example.com/?slug = test-for-inserted-values-in-url」那樣的slug,那麼就沒有辦法「驗證」他們沒有數據庫查詢。 – 2012-03-08 20:33:11

相關問題