2013-05-28 434 views
1

這可能是一個重複的問題,但我真的找不到任何答案。我有一個忘記的密碼腳本,它使用$ _GET從URL中抓取用戶的電子郵件地址。然後,腳本檢查$ _GET是否有錯誤消息,然後通過mysql檢查天氣的用戶ID是否相同。用戶ID是否必須是整數?

現在,腳本本身很好,但用戶標識在var_dump()中以字符串形式返回,而不是整數形式。我打算放手,但後來我讀到,如果用戶ID不是$ _GET變量中的整數,它可能導致攻擊,這讓我有點擔心。我試圖將num_rows的值改爲int,但沒有成功,因爲num_rows返回一個數組。檢查用戶ID的代碼是:

if (mysql_num_rows($result) == 1) { 
    // NEED TO TURN THIS ARRAY TO AN INT 
    list($userId) = mysql_fetch_array($result, MYSQL_NUM); 
} 

//elseif (mysql_num_rows($result) <= 0) { 
else { 
    $wrong = '<p style="color: red">Something went wrong. Please try again</p>'; 
} 

就像我之前說的腳本本身是好的,它只是我讀的東西,現在不能把它弄出來我的頭,這使得我問你們。 Doe的用戶ID必須是一個整數,或者我可以以字符串的形式逃脫嗎?

編輯:謝謝你的意見和建議。在php中學習還有很多。再次歡呼。

+0

如果你的腳本需要一個整數,你應該驗證輸入是一個整數。 '$ _GET'中的值將是字符串,但您可以使用'is_numeric'檢查它們並使用'(int)'將其轉換。 –

+0

你從URL中抓取的東西應該是一個int。如果它是一個字符串,那就是一個漏洞。當您從數據庫中檢索ID時,只要您信任數據庫的內容,該值可以是一個字符串。 – 11684

+1

使用[** FILTER_VALIDATE_INT **](http://php.net/manual/en/function.filter-var.php)。 [_這裏是(int)在這種情況下不可取的原因_](http://stackoverflow.com/questions/4789624/php-security-int-vs-filter-validate-int)。然後,[_這裏是它的另一個例子](http://codepad.org/kZGrkNuG) – itachi

回答

0

用戶ID可以是任何你想要的......我只會建議它是在數據庫中有一個唯一的鍵,並且不會隨着時間而改變。

傳統上使用ID是因爲在您的表上使用自動遞增主鍵是一種很好的做法,它符合所有條件以成爲有效的用戶ID。

+1

這不是很好的做法,原因實際上已經很好地定義了。 –

+1

@ N.B。也許這將有助於分享這些原因所述的鏈接。 –

+0

@Jack - 如果我有這樣一個鏈接,可以解釋*所有*的原因,我只是立即提供,但不幸的是我沒有一個 –

1

您從$ _GET數組中取出的所有內容都將是一個字符串,因爲沒有通過http發送的類型信息。

但是,您應該始終清理用戶輸入或使用預準備語句來防止SQL注入攻擊。

1

你混淆了事情,我會盡力澄清它們。當PHP通過HTTP協議接收數據時,無論是GET還是POST - 所有數據都被認爲是一個字符串,因爲無法安全地識別數據應該是什麼。

這意味着你可以試着將其轉換一個數據,你可以通過$ _GET或內部_POST $成不同的類型,有使用類型轉換,如$id = (int)$_GET['id'];

至於數據庫的ID(我們稱之爲Primary Key )應該始終是一個整數。

爲什麼: - InnoDB在實際的數據結構組織和將信息寫入磁盤時內部使用了一定的原則。它通過使用按順序遞增的整數實現顯着的性能增益 - 使用整數很容易創建唯一的標識符。只要每次插入一個偏移量就可以增加一些數字,並且您可以獲得分配給該行的唯一編號,無需使用複雜算法來計算唯一標識符,如UUID()等。

長話短說 - 保持用戶ID作爲整數在MySQL中,如果你通過$ _POST/$ _ GET獲得數據 - 類型把它們轉換成你想要它們的東西(int,float,string等等)。)

1

的用戶ID不必是整數,但它通常是

  • 獨特(每用戶一個)
  • 格式化的方式,它是有效地搜索在數據庫中(例如)
  • 較短,使得它並不需要太多的空間,尤其是對大用戶的銀行

因此,理想情況下,這將是一個整數(其中位數必須覆蓋的EXPEC數量最多泰德用戶)

  • 獨特 - 例如通過數據庫自動分配(增量)
  • 有效的索引,並且是小的指針到一個更大的用戶表

的一個缺點是,如果整數提供給客戶端瀏覽器(例如在表單中),客戶端可能會猜測用戶數量/更改表單用戶ID,因爲順序中的數字可能很容易被猜到......(需要防止通過進一步的安全)