2013-07-17 155 views
1

大家好,這是我的第一個問題,所以請不要殺我,如果我解釋自己錯了。 我試圖讓一個用戶帳戶系統與數據庫,問題是,如果另一個用戶登錄,當有人登錄,並從他的帳戶ID更改網址:我們的index.php = 7 的index.php?我們= 270他/她可以進入其他用戶的VIP頁面。 這是登錄控制代碼。用戶帳戶系統PHP

<? 

//incluir librerias 
include_once "funciones/funciones_BD.php"; 
include_once "constantes/constantes.php"; 

//abrir BD 
Abrir_BD($link,$Servidor,$Usuario,$Clave,$BD); 

$id = mysql_query("SELECT xidusuario FROM tblreferidos_usuarios WHERE xemail='".htmlentities($_REQUEST["email"])."'",$link); 
$xid = mysql_fetch_row($id); 
$usuario = mysql_query("SELECT xemail FROM tblreferidos_usuarios WHERE xemail='".htmlentities($_REQUEST["email"])."'",$link); 
$Nusuario = mysql_num_rows($usuario); 

//Si existe el usuario, validamos también la contraseña ingresada y el estado del usuario… 
if($Nusuario != 0){ 
$clave = mysql_query("SELECT xpass FROM tblreferidos_usuarios WHERE xestado=1 AND xemail='".htmlentities($_REQUEST["email"])."' AND xpass='".htmlentities($_REQUEST["clave"])."'",$link); 
$Nclave = mysql_num_rows($clave); 
//Si el usuario y clave ingresado son correctos (y el usuario está activo en la BD), creamos la sesión del mismo. 
if($Nclave != 0){ 
session_start(); 
//Guardamos dos variables de sesión que nos auxiliará para saber si se está o no "logueado" un usuario 
$_SESSION["autentica"] = "SI"; 
$_SESSION["usuarioactual"] = $usuario; //nombre del usuario logueado. 
//Direccionamos a nuestra página principal del sistema. 
$us=$_REQUEST["email"]; 
header ("Location: referidos_index.php?us=$xid[0]"); 
} 
else{ 
echo"<script>alert('La contrase\u00f1a del usuario no es correcta.') 
window.location.href=\"referidos_login.php?\"</script>"; 
} 
}else{ 
echo"<script>alert('El usuario no existe.');window.location.href=\"referidos_login.php\" </script>"; 

} 
mysql_close($link); 

?> 

,這就是我把所有其他網頁,查看會議

if(!isset($_SESSION["usuarioactual"])) 
{ 
header("Location:referidos_login.php"); 
die(); 
} 

如果有人能指出我哪裏出了問題是生病是最感激的代碼! 謝謝。

+3

*旁註:*停止使用不推薦的'mysql_ *'函數。改用MySQLi或PDO。 – Raptor

+2

您還必須在檢查$ _SESSION數組之前在其他每個文件中啓動會話! –

+0

和您的代碼受SQL注入。首先清理你的輸入! – Raptor

回答

0

這可不行,沒有一點出於安全考慮的不應該做的。如果您正在學習PHP,請按照正確的方式進行操作。請使用準備好的語句來處理任何用戶輸入的代碼。這是代碼的幾行,但:

$sql="******"; 
$stmnt=$mysqlidb->prepare($sql); 
$stmnt->bind_param("******",******); 
$stmnt->execute(); 
$stmnt->bind_result(******); 
while($stmnt->fetch()) 
    { 


    } 
$stmnt->close(); 

將讓您安全地訪問您的密碼 - 你需要把你自己的東西來代替*

,如果你只需要獲取單個行,可以省略一段時間。

其次,存儲用戶密碼的哈希值作爲 -

define ("CRYPT_SALT","Random Stuff"); 
password=SHA1($_POST['password'].CRYPT_SALT); 

你不能找回他們,但那時,沒有其他人既可以。將提交的密碼的哈希與數據庫中的哈希值進行比較。

通過身份驗證時,不要通過GET傳遞用戶數據。請將用戶數據存儲在$ _SESSION中。 爲了獲得額外的安全性,創建一個nonce(microtime()的SHA1散列將會)將其存儲在數據庫和$ _SESSION中。

每一個頁面加載時間,相比於$ _SESSION的隨機數與一個在針對該用戶的姓名分貝,如果他們匹配,你繼續。理想情況下,重新生成一個新的隨機數並更新SESSION和db記錄,以便用戶可以看到下一頁。

這種方法大約是安全的,因爲它得到不存儲在數據庫中的所有數據。這取決於大多數應用程序,特別是如果您使用SSL,並且不會比您建議的較小系統更難編碼。

+0

感謝您的答案@ RobertSeddon-Smith但是最終我做了什麼是使用會話將數據從一個頁面發送到另一個頁面,我相信這也是更安全的。我也會開始學習一些關於安全的問題,問題是如果事情不起作用,我會受到壓力,需要一個快速的回答xD –

+0

很酷。請記住,快速回答可能會留下安全漏洞。兩年後,當你擅長PHP時,你會記得你今天所做的快速解決方案嗎?也許它現在是一個完全不同的網站的一部分,只是坐在那裏,等待成爲一個麻煩。一次安全漏洞可能嚴重損害任何網站的可信度。儘管玩得開心! –