用户帐户系统PHP

时间:2013-07-17 08:08:50

标签: php session login

大家好,这是我的第一个问题所以如果我错误地解释自己,请不要杀了我。 我正在尝试建立一个带有数据库的用户帐户系统,问题是当有人登录时,如果另一个用户登录并从他的帐户ID更改URL:index.php?us = 7 到index.php?us = 270他/她可以进入其他用户的VIP页面。 这是登录控制代码。

<?

//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();
} 

如果有人能指出我问题最严重的地方是最好的! 感谢。

1 个答案:

答案 0 :(得分: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进行比较,如果它们匹配,则继续。理想情况下,您重新生成新的nonce并更新SESSION和db记录,以便用户可以看到下一页。

这种方法与没有将所有数据存储在数据库中一样安全。这取决于大多数应用程序,特别是如果您使用SSL,并且比您建议的较小系统更难编码。