2014-02-28 144 views
0

我一直在這裏現在潛伏几個月,不得不說這個社會石頭!MySQL和PHP登錄安全涉及

所以,這是我的問題。我正在爲網站創建登錄功能。這只是一個非常基礎的論壇,我的目標是學習每一部分,並從那裏發展,而不是深入到最底層。

我的代碼如下:

<?php 
$username = "temp_name"; 
$password = "temp_pass"; 
$hostname = "temp_host"; 
$db_name = "temp_dbase"; 
$tbl_name = "temp_tbl"; 

$login_uname = $_POST['username']; 
$login_upass = $_POST['password']; 
$salt1 = "temp_salt1"; 
$salt2 = "temp_salt2"; 

mysql_connect("$hostname", "$username", "$password")or die("Unable to connect to server); 
mysql_select_db("$db_name")or die("Cannot access database."); 

$user = mysql_query("SELECT username, password FROM $tbl_name WHERE username = '$login_uname'); 
$userexist = mysql_num_rows($user); 

if($userexists == 0) { 
    die("Invalid login information."); 
} 

$userinfo = mysql_fetch_array($user); 

$checkpass = md5($login_upass); 
$checkpass = $salt1 . $checkpass . $salt2; 

if(($userinfo['username'] == $login_uname) && ($userinfo['password'] == $checkpass)) { 
    setcookie('username', "$login_uname", time()+60*60*24*7); 
    setcookie('password', "$login_upass", time()+60*60*24*7); 
} 
else 
    die("Invalid login information."); 

?> 

現在,代碼工作,沒有問題。我理解散列和醃製密碼的基礎知識(我知道md5並不理想,但現在它只是一個學習工具。)我真正關心的是:

我的代碼中有我的MySQL登錄信息!我考慮只是有用戶註冊一個用戶名和密碼,居然讓MySQL來生成一個登錄用戶名和密碼,以自身爲他們授予相應的權限,但我覺得這是完全不切實際的,安全風險本身就是作爲網站擴大。

隱藏代碼在另一個文件中,只是使用可能會奏效,但使用這種方法阻止用戶能夠瀏覽我的代碼本身,只是看基本MySQL的登錄信息不?

我知道PHP代碼沒有在網站的源代碼顯示,除非它是不正確解析。但是我應該注意哪些問題或解決方案?再次

感謝您的幫助!我知道這是一段文字。

+1

這個問題更適合對於http://codereview.stackexchange.com/,因爲您基本上正在尋找關於當前工作代碼的評論。 –

+1

首先,您應該遠離mysql_ *函數,因爲它們已被棄用。嘗試PDO類或mysqli_ *函數 – 6elephants

+0

我同意@MikeBrant。您正在尋找代碼審查。你的代碼有很多明顯的問題。首先,你不要散列pw,然後把它作爲一個字符串添加到它。您將鹽添加到基礎pw中,然後對其進行哈希處理。您應該爲每個用戶存儲一個獨特的鹽,並將其存儲在用戶行中。我也不知道你爲什麼使用名稱/ pw設置cookie。可怕的想法。使用會話進行狀態。即使您想要記住我的功能,您也應該爲其生成一個密鑰並將其存儲在用戶行中。 – gview

回答

3

將配置信息外化爲類似config.php的東西,然後在文件頂部使用require_once('config.php');

CHMOD(變化模式)config.php文件0644,以便它不能被執行或除了由所屬的用戶(服務器)讀取。

有了到位,沒有人能看到你的MySQL連接信息,除非他們有FTP或SSH訪問你的機器(在這一點上,你有更大的問題)