2011-03-11 29 views
3

我的PHP很生鏽。我的影片被通過GET傳遞給腳本一個MD5哈希值,然後我抓住它是這樣的:

$id = $_GET['id']; 

顯然有一個安全隱患這裏...我想檢查字符串的長度,以確保的它的長度爲32個字符,但對我來說看起來並不很健壯。我還能做些什麼來使其更安全?

感謝

+0

你爲什麼要通過獲得通過哈希?如果沒有更多信息,我猜測你這樣做的方式根本上是不安全的。 – 2011-03-11 10:08:18

+2

拿到後你用'$ id'做什麼? – Blorgbeard 2011-03-11 10:08:28

+3

是否存在安全風險主要取決於您之後對變量所做的操作。 – 2011-03-11 10:09:26

回答

12

你可以用正則表達式驗證,以確保它包含的字母數字字符。

E.g.像這樣(我的PHP是生鏽太):

if(preg_match("/^[A-Fa-f0-9]{32}$/", $id) > 0) { 
    // All good 
} 
+0

好的+1!只要對我快... – Akarun 2011-03-11 10:10:23

+2

我只注意到我的正則表達式是錯誤的(包括A-Z) - 現在編輯。 – mdm 2011-03-11 10:12:49

+0

很棒...這對我來說很好。 – 2011-03-11 10:19:27

1

可以使用preg_match來ckeck alnum和32的長度只有存在。

1

這取決於你想用ID做什麼。如果你創建一個mysql選擇這個,你應該添加mysql_real_escape_stringphp.net/mysql_real_escape_string)。對於輸出的目的,你可以只轉換爲HTML實體ヶ輛(php.net/htmlentities)將字符串或使用過濾器擴展(php.net/filter

+0

是的,我正在那樣做! – 2011-03-11 10:19:11

0
  1. 做某種「過濾器」,並將其應用到$ _GET ['身份證'] var,在這些過濾器中,你可以檢查長度,類型,允許的字符類型,是否需要...

  2. 傳遞一個隨機生成的字符串(散列)重寫表單,在你的會話和表單上保存生成的字符串,然後在表單上對其進行檢查,如果它們不匹配,那麼你不需要檢查id或發送的其他元素。

  3. 使用帖子,而不是在可能的情況下獲得。

0

我首先假設您使用> = PHP5.2。我其實會建議你使用PHP5.3,因爲它甚至不需要修改代碼庫就可以更快。我使用filter擴展名來保護我的代碼庫。使用ctype-alnum

/* prevent XSS. */ 
$_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING); 
$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING); 
0

例子:

if (strlen($id) == 32 && ctype_alnum($id)) exit('pass'); 
else exit('no');