2009-03-26 20 views
8

Recientemente aprendí cómo agregar correctamente un nombre de usuario y contraseña a una base de datos. Mi base de datos es usersys, y la tabla que almacena la información del usuario se llama userdb. La tabla tiene dos columnas: nombre de usuario (principal), contraseña.¿Cómo autentico a un usuario en PHP/MySQL?

El formulario de registro funciona muy bien, ingresa correctamente la entrada de los usuarios en la base de datos y también verifica si el nombre de usuario del usuario ya está en la base de datos o no.

Dicho esto, estoy preguntando si alguien podría ayudarme a crear un script de inicio de sesión. Hasta ahora, esto es lo que tengo:

$username = $_POST['username']; 
$password = $_POST['password']; 
$displayname = $_POST['username']; 
$displayname = strtolower($displayname); 
$displayname = ucfirst($displayname);   
echo "Your username: " . $displayname . "<br />"; 

mysql_connect("localhost", "root", "******") or die(mysql_error()); 
echo "Connected to MySQL<br />"; 

mysql_select_db("usersys") or die(mysql_error()); 
echo "Connected to Database <br />"; 

$lcusername = strtolower($username); 
$esclcusername = mysql_real_escape_string($lcusername); 
$escpassword = mysql_real_escape_string($password); 

$result = mysql_query("SELECT * FROM userdb WHERE username='$esclcusername' AND  password='$escpassword'") or die(mysql_error()); 
$row = mysql_fetch_array($result); 
$validateUser = $row['username']; 
$validatePass = $row['password']; 

Los datos POST son de la página de inicio de sesión anterior. Quiero que este script compruebe la tabla (userdb) y busque la fila del nombre de usuario que el usuario ingresó desde el formulario anterior y verifique que la contraseña ingresada coincida con la contraseña del nombre de usuario establecida en esa fila, en la tabla userdb.

También quiero algún tipo de forma de comprobar si el nombre de usuario ingresado existe o no, para decirle al usuario que el nombre de usuario ingresado no existe si no se puede encontrar en la tabla.

+0

debe volver a utilizar un marco de autenticación existente siempre que sea posible, ya que, en realidad, es compleja. Por ejemplo, eche un vistazo a https://github.com/delight-im/PHP-Auth, que es tanto agnóstico como independiente de la base de datos. – caw

Respuesta

7

Puede usar sesiones. Las sesiones son variables globales que, cuando se configuran, permanecen con el usuario mientras navega por el sitio.

Dado que está aprendiendo PHP, try out this tutorial en el sitio web oficial.

Pero lo que haría en teoría es que el nombre de usuario y contraseña de partido, se establece una variable de sesión

$_SESSION["auth"] = true; 
$_SESSION["user_id"] = $row["user_id"]; 

y luego hacer una comprobación para ver si el usuario es autenticado.

3

Una forma de hacerlo (AVISO: no necesariamente mejores prácticas):

$result = mysql_query("SELECT id FROM userdb WHERE username='$esclcusername' AND password='$escpassword'") or die(mysql_error()); 
$row = mysql_fetch_array($result); 
$id = (int)$row['id']; 
if($id > 0) { 
    //log in the user 
    session_start(); 
    $_SESSION['userId'] = $id; 
    $_SESSION['username'] = $displayname; 
} 

... y en las páginas que requieren autenticación:

session_start(); 
if(!isset($_SESSION['userId'])) { 
    die('You need to be logged in!!!'); 
} else { 
    echo 'Welcome ' . $_SESSION['username']; 
} 

Leer más sobre PHP sessions.

0

Puede utilizar una instrucción de selección para recuperar de MySQL la contraseña para el nombre de usuario especificado. Si tiene un conjunto de resultados vacío, entonces no tiene el nombre de usuario en la tabla.

Si necesita que el usuario se autentique en más de una página php, entonces una opción sería usar sesiones (http://www.php.net/manual/en/function.session-start.php).

Además, creo que usted debe pensar en la seguridad, la prevención es decir, inyección de SQL:

$variable = mysql_real_escape_string($_POST['variable']) 

y evitar que "morir" (tratamiento de errores y devolver mensajes de fácil uso de la escritura).

0

También pensaría en no almacenar contraseñas en su base de datos. Los hash de una forma con MD5 o SHA1 son una forma de agregar una capa de seguridad en el nivel de db.

Consulte http://php.net/md5 o http://php.net/sha1 para obtener más información.

12

Esta no es una respuesta directa a esta pregunta sino un BUEN valor agregado. Debe usar la función MYSQL SHA1 para encriptar la contraseña antes de almacenarla en la base de datos.

$user = $_POST['userid']; 
$pwd = $_POST['password']; 
$insert_sql = "INSERT into USER(userid, password) VALUES($user, SHA1($pwd))"; 

$select_sql = "SELECT * FROM USER WHERE userid=$user AND password=SHA1($pwd))"; 
+2

+1 por un punto muy importante. Sin embargo, hay dos correcciones: 1. El código debe usar mysql_escape_string/mysql_real_escape_string() para evitar ser ignorado por las inyecciones de SQL. 2. Se prefiere usar una sal para el hash para evitar que se agriete con tablas de arcoiris. Ver: http://tinyurl.com/jwb8o – Fredrik

+0

Esta respuesta es principalmente insegura porque no utiliza comillas alrededor de la contraseña, aunque la pregunta principal muestra el uso de la función de escape de mysql, esto todavía permite las inyecciones de sql en el forma de '$ pwd =" 1) O (1 = 1 "' – Ferrybig

2

me gusta usar ambas $_SESSION y MYSQL cheques con cualquier puesto de inicio de sesión. Esto debería ayudar a comenzar algunas cosas.

$username = mysql_real_escape_string($_POST[username]); 
$password = strip_tags($_POST[password]); 
$password = sha1($password); 

if(isset($username) && isset($password) && !empty($username) && !empty($password)) 
{ 
$sql = mysql_query("SELECT * FROM users_column WHERE username = '$username' AND password = '$password'"); 

//Check the number of users against database 
//with the given criteria. We're looking for 1 so 
//adding > 0 (greater than zero does the trick). 
$num_rows = mysql_num_rows($sql); 
if($num_rows > 0){ 

//Lets grab and create a variable from the DB to register 
//the user's session with. 
$gid = mysql_query("SELECT * FROM users_column WHERE username = '$username' AND password = '$password'"); 
$row = mysql_fetch_assoc($gid); 
$uid = $row[userid]; 

// This is where we register the session. 
$_SESSION[valid_user] = $uid; 

//Send the user to the member page. The userid is what the 
//session include runs against. 
header('Location: memberpage.php?userid='.$userid); 
} 

//If it doesn't check out -- throw an error. 
else 
{ 
echo 'Invalid Login Information'; 
} 
} 

NOTA: Usted tendría que iniciar el archivo de página con session_start() y crear un Registro de sesión separada incluiría manifestar con session_start() y sus progresiones por ejemplo, if($_SESSION[valid_user] != $userid) hacer algo.

0

Estoy de acuerdo con la idea si se utilizan variables de SESSION al autenticar al usuario.

La forma más fácil de autenticar al usuario es la siguiente

//connect the mysql_db 
$mysql_connect() 
$mysql_select_db() 

//reading from mysql table 
$res="SELECT * FROM table WHERE name=$username AND password=$password"; 
$val=mysql_query($res); 

//authentication 
$count=mysql_num_rows($val); 
if($count==1) 
//authenticate the user 
else 
through an error 
+0

Esta respuesta es principalmente insegura porque no usa comillas alrededor de la contraseña, aunque la pregunta principal muestra el uso de la función de escape mysql, esto todavía permite para las inyecciones de sql en forma de '$ password =" 1OR1 = 1 "' – Ferrybig

Cuestiones relacionadas