2013-01-13 127 views
0

我有一個漫畫網站,我想我的上傳圖像路徑到數據庫。管理員登錄和上傳安全

我有一個登錄界面,檢查這樣正確的憑據:

  <?php 

     $username = isset($_POST['username']) ? $_POST['username'] : ""; 
     $password = isset($_POST['pw']) ? $_POST['pw'] : ""; 


     if($_SERVER['REQUEST_METHOD'] == 'POST') { 
      if(verify($username, $password) == 1) { 
       header("Location: ?action=admin"); 
      } 
      else { 
       echo "<center>Incorrect credentials</center>"; 
      } 
     } 

     function verify($user, $pw) { 
      include './scripts/dbconnect.php'; 

      $result = $mysqli->query("SELECT username, password FROM users WHERE username='" . $user . "' AND password='" . $pw . "'"); 

      return $result->num_rows; 
     } 

     include 'include/footer.php'; 
     ?> 

然後將它們記錄在上傳畫面。

不幸的是,所有的用戶所要做的就是猜出我的網址可能是上傳網頁,讓他們可以跳過我的登錄屏幕...

/HTWS /?動作=登錄(只需更換「登錄」與'管理員',你在那裏...)所以,我的第一道防線將不會讓我的上傳頁面名稱如此明顯......但如果用戶仍然猜測它會發生什麼......我可以驗證另一種方式,不會讓他們只是改變了網址?

謝謝!

+1

通常的做法是讓登錄過程創建會話變量,如果未設置,將導致用戶被重定向到登錄頁面。 – SirDarius

+1

你使用mysqli很棒。但是你仍然很容易注射,因爲你只是把輸入權傾倒入它。 –

+0

你可能只需使用'.htauth',除非你有十幾個管理員。是的,並且http://bobby-tables.com/ – mario

回答

1

那麼這是非常不安全的。你想要做的是在登錄時設置一些會話變量($_SESSION[user_id]$_SESSION[permission_type]等)。然後,您可以在每個管理頁面的頂部有一個功能,例如verifyAdmin(),通過檢查您剛剛設置的$_SESSION變量來檢查登錄用戶是否實際上是管理員。如果他們不是,他們會被重定向到登錄頁面。

當管理員日誌,設置一些會話變量,例如:

$_SESSION[user_id] = id_of_admin; 
$_SESSION[permission_type] = 'admin'; 

verifyAdmin會是這個樣子:

function verifyAdmin() { 
    if(!isset($_SESSION[username]) || !isset($_SESSION[permission_type]) || $_SESSION[permission_type] != 'admin'){ 
     header("Location: login.php"); 
    } 
} 

然後你可以簡單地做每個管理頁面頂部這個:

verifyAdmin();

Your verify fun ction應該看起來像這樣:

function verify($user, $pw) { 
    include './scripts/dbconnect.php'; 
    $result = $mysqli -> query("SELECT username, password FROM users WHERE username='" . $user . "' AND password='" . $pw . "'"); 
    if ($result -> num_rows == 1) { 
     $_SESSION[username] = $user; 
     $_SESSION[permission_type] = 'admin'; 
    } 
    return $result -> num_rows; 
} 
+0

我想過這樣做,但並沒有真正獲得使用會話的權限。你能提供一個簡短的例子給我的代碼,你如何整合會話檢查? – Growler

+0

檢查我的更新。 – SeanWM

+0

好涼快。我理解的細節是這樣的:我知道其他超級全局變量從哪裏獲得它們的值,比如$ _POST(從表單提交中獲得它的值)或$ _GET(從URL獲取它的值),但是$ _SESSION從哪裏獲得它的值價值從? $ _SESSION ['user_id']中的'user_id'來自哪裏?我檢查了http://php.net/manual/en/reserved.variables.session.php的答案,但它仍然不清楚。 – Growler

0

這段代碼也容易受到SQL注入的影響。你需要清理這些$ _POST變量。