2013-07-17 2 views
1

안녕하세요 여러분, 제 첫 질문입니다. 잘못 설명하면 나를 죽이지 마시기 바랍니다. 데이터베이스가있는 사용자 계정 시스템을 만들려고합니다. 다른 사용자가 로그인하여 자신의 계정 ID에서 URL을 변경하면 다른 사람이 로그인 할 때 문제가 발생합니다. index.php? us = 7 to 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); 

?> 

는이 내가 문제가 병이 가장 greatful 할 위치를 누군가가 저를 지적 할 수있는 경우 세션

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

을 확인하는 다른 모든 페이지에 넣어 코드입니다! 감사합니다. .

+3

* sidenote : * 더 이상 사용되지 않는'mysql_ * '함수 사용을 중단하십시오. 대신에 MySQLi 또는 PDO를 사용하십시오. – Raptor

+2

$ _SESSION-array를 확인하기 전에 다른 모든 파일에서 세션을 시작해야합니다! –

+0

및 코드는 SQL 주입이 적용됩니다. 먼저 입력을 정리하십시오! – Raptor

답변

0

보안을 고려하지 않아도되며 그렇게해서는 안됩니다. PHP를 배우면 올바른 방법으로하십시오. 사용자가 입력 한 코드를 처리하려면 준비된 문을 사용하십시오. 그것은 더 몇 줄의 코드 만입니다 :

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


    } 
$stmnt->close(); 

가 안전하게 비밀번호를 액세스 할 수있게됩니다 - 당신이 * 대신에 자신의 물건을 넣어해야합니다.

한 행만 가져 오면 while을 생략 할 수 있습니다. 해시로

둘째, 저장 사용자 암호 -

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

당신은 검색 할 수 없습니다하지만, 다른 아무도 중 하나를 수 있습니다. 제출 된 암호의 해시를 데이터베이스의 해시 된 값과 비교하십시오.

인증 될 때 GET을 통해 사용자 데이터를 전달하지 마십시오. 대신 사용자 데이터를 $ _SESSION에 저장하십시오. 추가 보안을 위해 nonce (microtime()이 수행하는 SHA1 해시)를 만들어 db 및 $ _SESSION에 저장합니다.

페이지가로드 될 때마다 $ _SESSION의 nonce를 db의 해당 nonce와 해당 사용자 이름이 동일한 경우를 비교하십시오. 새로운 논스를 다시 생성하고 사용자가 다음 페이지를 볼 수 있도록 SESSION 및 db 레코드를 업데이트하는 것이 이상적입니다.

이 방법은 DB에 모든 데이터를 저장하지 않고 얻는 것처럼 안전합니다. 특히 SSL을 사용하는 경우 대부분의 응용 프로그램에 달려 있으며, 제안한 적은 시스템보다 코드 작성이 더 어렵지 않습니다.

+0

@ RobertSeddon-Smith의 답변에 감사드립니다. 그러나 결국 내가 사용하는 세션이 한 페이지에서 다른 페이지로 데이터를 보내는 것이 었습니다. 나는 보안에 대해서 조금 배우기 시작할 것이다. 문제는 일들이 일하지 않는다면 나는 스트레스를 받고 빠른 대답이 필요하다는 것이다. xD –

+0

차갑다. 빠른 답변만으로 보안 허점을 남길 수 있다는 것을 기억하십시오. 2 년이 지난 지금, PHP를 잘 할 때, 당신이 오늘 만든 빠른 수정을 기억할 것입니까? 아마 지금은 다른 사이트의 일부이며, 그냥 앉아서 성가신 사람이되기를 기다리고있을 것입니다. 한 가지 보안 침해는 모든 사이트의 신뢰성을 심각하게 손상시킬 수 있습니다. 그래도 재미 있어요! –