2016-02-04 26 views
-4

我目前有一個PHP登錄系統,它通過驗證用戶輸入的組織代碼進行登錄,因此查詢的數據庫將會不同。如何以更安全的方式檢查PHP會話?

includes.php

<?php 

mysql_connect("mysql.example.com", $dbconn, "MySecurePassword"); 
mysql_select_db($dbconn); 

?> 

login.php

// $org is the Organisation Code, will be set when user clicks Login 

$dbconn = $org; 
include "includes.php"; 

// Omitted the $userid & $pw variables, assume there is no error, and that MySQL Injection is prevented already 

    $query = "SELECT * FROM `Login` WHERE `userid`=TRIM('$userid') AND `password`=TRIM('$pw')"; 

    $result = mysql_query($query); 

    if(mysql_num_rows($result)>0){ 

     session_start(); 
     $_SESSION['logged_in'] = $username; 
     header("Location: loggedinpage.php"); 

    } 

loggedinpage.php

<?php 

session_start(); 

// As there is no fixed database, I've omitted the DB Connection 

define('DS', TRUE); // used to protect includes 
define('USERNAME', $_SESSION['logged_in']); 
define('SELF', $_SERVER['PHP_SELF']); 

// Checks if user is logged in 
if (!USERNAME) { 
    header("Location: login.php"); 
} 

?> 

保障措施採取

  • 密碼使用SHA-512進行散列處理,而不是以純文本形式存儲。

  • MySQL的注射用mysql_real_escape_string()

我省略爲便於一些代碼來閱讀阻止,我可以知道,如果用戶登錄檢查的方式是安全的?如果不是,我該如何改進?

在此先感謝!

  • 更新的問題,以反映的意見更新
+2

這幾乎是如何完成的。你可以代替'SELECT *',運行'SELECT 1'。那麼你沒有檢索數據庫信息,因爲你沒有使用它。也可以使用'mysql_'函數退出,改爲使用'mysqli_'。並且不要忘記逃避所有的用戶輸入。 – Phiter

+2

一個主要的方法是切換到使用參數化查詢 –

+0

檢測用戶是否安全登錄的方式?謝謝! – Panda

回答

2

假設按照預期,只有當返回的比賽是完全正確的一排(例如,通過整理規則沒有怪異的模糊匹配查詢工作,但純bin比較),認證部分是非常好的。

(你被警告過大量的SQL注入,你自己在那裏。)

您的安全,然後歸結爲:

$_SESSION['logged_in'] = $username; 

和後續:

define('USERNAME', $_SESSION['logged_in']); 

if (!USERNAME) { 
    header("Location: login.php"); 
} 

我想你的問題是關於這一部分。
然後答案是:會話部分是好的,阻塞不是。

這就是如何使用會話,是的,他們默認情況下是合理安全的;用戶將無法以某種方式自己設置$_SESSION['logged_in']值,該值只能由您的服務器設置,並且大概只有在成功驗證時才這樣做。請閱讀會話劫持,這是整個方案唯一真正的漏洞。

真正的問題是:

if (!USERNAME) { 
    header("Location: login.php"); 
} 

設置的標頭不終止當前頁面。如果您在此行之後輸出敏感信息,它會將發送給客戶端!設置標題後,您需要明確指定exit

說完這一切後,我們無法告訴您您的系統是否「安全」,因爲可能有您創建的我們沒有看到的任何數量的後門程序。總的來說,我會跟下面的啓動:

  • 停止使用mysql,使用PDOmysqli
  • 綁定您的參數,不要mysql_real_escape_string他們。那裏有安全隱患
  • 使用password_hash密碼散列,而不是SHA;特別是如果你只做一個單一的SHA通道
+0

謝謝!這就是我一直在尋找的東西。 – Panda

1

becareful SQL注入:

如果您在密碼字段中鍵入:

''='' 

密碼的規則將是真實的,因爲密碼= TRIM(''='')爲真。你必須控制密碼的字符串:

  • 最小長度
  • 沒有空格(感謝修剪功能)

而且你不必來存儲這樣的密碼,你必須做出密碼的哈希

+0

謝謝!我已經阻止了MySQL注入。 – Panda