我的PHP很生鏽。我的影片被通過GET傳遞給腳本一個MD5哈希值,然後我抓住它是這樣的:
$id = $_GET['id'];
顯然有一個安全隱患這裏...我想檢查字符串的長度,以確保的它的長度爲32個字符,但對我來說看起來並不很健壯。我還能做些什麼來使其更安全?
感謝
我的PHP很生鏽。我的影片被通過GET傳遞給腳本一個MD5哈希值,然後我抓住它是這樣的:
$id = $_GET['id'];
顯然有一個安全隱患這裏...我想檢查字符串的長度,以確保的它的長度爲32個字符,但對我來說看起來並不很健壯。我還能做些什麼來使其更安全?
感謝
可以使用preg_match
來ckeck alnum和32的長度只有存在。
這取決於你想用ID做什麼。如果你創建一個mysql選擇這個,你應該添加mysql_real_escape_string
(php.net/mysql_real_escape_string)。對於輸出的目的,你可以只轉換爲HTML實體ヶ輛(php.net/htmlentities)將字符串或使用過濾器擴展(php.net/filter)
是的,我正在那樣做! – 2011-03-11 10:19:11
做某種「過濾器」,並將其應用到$ _GET ['身份證'] var,在這些過濾器中,你可以檢查長度,類型,允許的字符類型,是否需要...
傳遞一個隨機生成的字符串(散列)重寫表單,在你的會話和表單上保存生成的字符串,然後在表單上對其進行檢查,如果它們不匹配,那麼你不需要檢查id或發送的其他元素。
使用帖子,而不是在可能的情況下獲得。
我首先假設您使用> = 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);
例子:
if (strlen($id) == 32 && ctype_alnum($id)) exit('pass');
else exit('no');
你爲什麼要通過獲得通過哈希?如果沒有更多信息,我猜測你這樣做的方式根本上是不安全的。 – 2011-03-11 10:08:18
拿到後你用'$ id'做什麼? – Blorgbeard 2011-03-11 10:08:28
是否存在安全風險主要取決於您之後對變量所做的操作。 – 2011-03-11 10:09:26