2015-09-02 88 views
2

我有一個網站,其中某些區域/功能僅適用於已通過身份驗證的用戶。一些用戶在網站之前就已經存在,並且目前擁有有效的訂閱。因此,他們的信息(必然)存在於數據庫中,但是這些賬戶不應該被任何人(甚至是他們所屬的用戶)訪問 - 直到他們驗證了他們的信息,通過帶有散列參數的電子郵件接收鏈接並設置他們的密碼。在MySQL數據庫中存儲不可訪問的用戶

因此:我想將這些用戶存儲在Users表中,但我不希望他們能夠登錄到該網站。

目前,我的數據庫建立這樣的:

Table: Users 

    email |  password  |  salt 
------------+------------------+---------------- 
    User1 |     |     // password and salt are 
    User2 |     |     // empty strings, not NULL 
    User3 | md5(pass + salt) | rand(10-digits) 
    User4 | md5(pass + salt) | rand(10-digits) 


Table: Non-Registered Users 

    email |  identify1 | identify2 
------------+------------------+---------------- 
    User1 |  secret1a  | secret1b 
    User2 |  secret2a  | secret2b 

而且我accessControl.php,與簡潔一些僞代碼:

<?php 

session_start(); 
if(isset($_POST['email']) && isset($_POST['password']) { 
    $sql1 = "SELECT salt FROM Users WHERE email = :email"; 
    .... // prepare and execute 
    if (!empty($result1)) { 
     $hash = sha2($password.$result1['salt'],256); 
     $sql2 = "SELECT * FROM Users WHERE password = :hash AND email = :email"; 
     .... // prepare and execute 
     if(!empty($result2)) { 
      $_SESSION['email'] = $_POST['email']; 
      $_SESSION['password'] = $_POST['password']; 
     } 
    } 
} elseif(isset($_SESSION['email'] && isset($_SESSION['password'])) { 
    // do pretty much the same check as above 
} else { 
    // force login 
} 

?> 

所以,我的問題是:是否有可能未註冊的用戶先登錄而不先設置密碼?這是不可能的空白字段匹配什麼 SHA256,是嗎?我擔心我忽略了一些明顯的東西。

請謝謝! :3

回答

1

SHA256將始終有256位,所以它永遠不會匹配空字符串。話雖如此,你的僞代碼並沒有完全描述你如何驗證用戶輸入,所以你仍然可能容易受到SQL注入攻擊。

+0

感謝您的確認。我很欣賞你提到的SQL注入 - 但是由於這部分代碼與手頭的問題無關,所以我認爲最好不要爲了簡潔而忽略它。 – kittykittybangbang