Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
bioshock

Cookies {Resolvido}

Recommended Posts

bioshock

Possuo na página de login, o seguinte código (para o cookie):

//Checks if there is a login cookie
if(isset($_COOKIE['ID_my_site']))

//if there is, it logs you in and directes you to the members page
{ 
$username = $_COOKIE['ID_my_site']; 
$pass = $_COOKIE['Key_my_site'];
------------------------------------------------
// if login is ok then we add a cookie 
$_POST['username'] = stripslashes($_POST['username']); 
$hour = time() + 20000; 
setcookie(ID_my_site, $_POST['username'], $hour); 
setcookie(Key_my_site, $_POST['pass'], $hour);	

Na página do index (LOGOUT):

//this makes the time in the past to destroy the cookie 
setcookie(ID_my_site, gone, $past); 
setcookie(Key_my_site, gone, $past); 
header("Location: login.php"); 

    exit;
  }
}

O problema está quando tento aceder a páginas restritas. Por exemplo, eu restringi uma página com este código:

<?php
if (!isset($_SESSION)) {
  session_start();
}
$MM_authorizedUsers = "";
$MM_donotCheckaccess = "true";

// *** Restrict Access To Page: Grant or deny access to this page
function isAuthorized($strUsers, $strGroups, $UserName, $UserGroup) { 
  // For security, start by assuming the visitor is NOT authorized. 
  $isValid = False; 

  // When a visitor has logged into this site, the Session variable MM_Username set equal to their username. 
  // Therefore, we know that a user is NOT logged in if that Session variable is blank. 
  if (!empty($UserName)) { 
    // Besides being logged in, you may restrict access to only certain users based on an ID established when they login. 
    // Parse the strings into arrays. 
    $arrUsers = Explode(",", $strUsers); 
    $arrGroups = Explode(",", $strGroups); 
    if (in_array($UserName, $arrUsers)) { 
      $isValid = true; 
    } 
    // Or, you may restrict access to only certain users based on their username. 
    if (in_array($UserGroup, $arrGroups)) { 
      $isValid = true; 
    } 
    if (($strUsers == "") && true) { 
      $isValid = true; 
    } 
  } 
  return $isValid; 
}

$MM_restrictGoTo = "Login.php";
if (!((isset($_SESSION['MM_Username'])) && (isAuthorized("",$MM_authorizedUsers, $_SESSION['MM_Username'], $_SESSION['MM_UserGroup'])))) {   
  $MM_qsChar = "?";
  $MM_referrer = $_SERVER['PHP_SELF'];
  if (strpos($MM_restrictGoTo, "?")) $MM_qsChar = "&";
  if (isset($QUERY_STRING) && strlen($QUERY_STRING) > 0) 
  $MM_referrer .= "?" . $QUERY_STRING;
  $MM_restrictGoTo = $MM_restrictGoTo. $MM_qsChar . "accesscheck=" . urlencode($MM_referrer);
  header("Location: ". $MM_restrictGoTo); 
  exit;
}
?>

Quando tento aceder a esta página (já com o login efectuado) dá-me a seguinte mensagem:

"A página Web em http://localhost/supless/login.php originou demasiados redireccionamentos. Limpar os cookies deste site ou permitir cookies de terceiros pode resolver o problema. Caso contrário, trata-se de um problema de configuração do servidor e não de um problema com o computador."

O que pressuponho que a página não está a receber os cookies, correcto? Já tive no google à procura por "Get cookies" ou algo do género, mas nada consegui. Obrigado!

Share this post


Link to post
Share on other sites
bioshock

Já resolvi o assunto, com o seguinte código:

<?php 
// Connects to your Database 
mysql_connect("localhost", "root", "") or die(mysql_error()); 
mysql_select_db("supless") or die(mysql_error()); 

//checks cookies to make sure they are logged in 
if(isset($_COOKIE['ID_my_site'])) 
{ 
$username = $_COOKIE['ID_my_site']; 
$pass = $_COOKIE['Key_my_site']; 
$check = mysql_query("SELECT * FROM supless WHERE username = '$username'")or die(mysql_error()); 
while($info = mysql_fetch_array( $check )) 
{ 

//if the cookie has the wrong password, they are taken to the login page 
if ($pass != $info['password']) 
{ header("Location: login.php"); 
} 

//otherwise they are shown the admin area	
else 
{ 
echo "Admin Area<p>"; 
echo "Your Content<p>"; 
echo "<a href=logout.php>Logout</a>"; 
} 
} 
} 
else 

//if the cookie does not exist, they are taken to the login screen 
{	
header("Location: login.php"); 
} 
?>

Share this post


Link to post
Share on other sites
softklin

Cuidado com informação sensível nos cookies, visto que podem ser acessíveis/roubados por outros. Chamo-te a atenção para isto, porque usas uma password num cookie lá em cima, que depois comparas com a que está na base de dados, e não devias fazer isso.


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
softklin

Na linha:

$pass = $_COOKIE['Key_my_site'];  

Depois mais em baixo, usas para comparar:

if ($pass != $info['password'])
{ header("Location: login.php");
} 

Aparentemente guardas a password nesse cookie. Se usares o browser Firefox, podes facilmente ir à opções, ver cookies, escolhes o teu site, e aparece lá tudo. Isto para além que te podem roubar os cookies num ataque de XSS, por exemplo, e ficam a saber facilmente a password. Porque decidiste guardar a password no cookie?


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
bioshock

Mas só eu (no meu pc) é que vejo esses cookies, presuponho(?).

Epa, decidi porque foi o que consegui. Estou no php desde segunda feira, a estagiar numa empresa, e tenho de apresentar trabalho..está a ser uma semana e pêras.

Eu guardo os logins que efectuo (via base de dados & sem ser base de dados) nos cookies, para que depois possa visualizar páginas como "Index" etc, já como utilizador registado.

Share this post


Link to post
Share on other sites
bioshock

Softclean, tenho o seguinte:

<?php
$username = $_POST['username'];
$pass = $_POST['pass'];
if(($username=="123")&&($pass=="123")){
$_SESSION['tipo']="Admin";
$_POST['username'] = stripslashes($_POST['username']); 
$hour = time() + 20000; 
setcookie(ID_my_site, $_POST['username'], $hour); 
setcookie(Key_my_site, $_POST['pass'], $hour);
header('Location: members.php');

//// e os parametros que precisares, á partida não precisas da pass na sessão.....
//// e de seguida encaminhas para a página de administração onde verificas o tipo de utilizador

}else{

// Connects to your Database 
mysql_connect("localhost", "root", "") or die(mysql_error()); 
mysql_select_db("supless") or die(mysql_error()); 

//Checks if there is a login cookie
if(isset($_COOKIE['ID_my_site']))

//if there is, it logs you in and directes you to the members page
{ 
$username = $_COOKIE['ID_my_site']; 
$pass = $_COOKIE['Key_my_site'];

$check = mysql_query("SELECT * FROM supless WHERE username = '$username'")or die(mysql_error());
while($info = mysql_fetch_array( $check )) 
{
if ($pass != $info['password']) 
{
}
else
{
header("Location: login.php");

}
}
}

//if the login form is submitted
if (isset($_POST['submit'])) { // if form has been submitted

// makes sure they filled it in
if(!$_POST['username'] | !$_POST['pass']) {
echo "<script>alert('Por favor, preencha todos os campos.'); window.location=\"login.php\"</script>";
}
// checks it against the database

if (!get_magic_quotes_gpc()) {
$_POST['email'] = addslashes($_POST['email']);
}
$check = mysql_query("SELECT * FROM supless WHERE username = '".$_POST['username']."'")or die(mysql_error());

//Gives error if user dosen't exist
$check2 = mysql_num_rows($check);
if ($check2 == 0) {
echo "<script>alert('O utilizador não existe, por favor volte-se a registar!'); window.location=\"registo.php\"</script>";
}
while($info = mysql_fetch_array( $check )) 
{
$_POST['pass'] = stripslashes($_POST['pass']);
$info['password'] = stripslashes($info['password']);
$_POST['pass'] = md5($_POST['pass']);

//gives error if the password is wrong
if ($_POST['pass'] != $info['password']) {
die('Incorrect password, please try again.');
}
else 
{ 

// if login is ok then we add a cookie 
$_POST['username'] = stripslashes($_POST['username']); 
$hour = time() + 20000; 
setcookie(ID_my_site, $_POST['username'], $hour); 
setcookie(Key_my_site, $_POST['pass'], $hour);	

//then redirect them to the members area 
header("Location: index.php"); 

} 
}
}
else 
{	

// if they are not logged in 
}
?>
<?php 

?>

Este é o codigo do Login. Ou seja, quando fazemos o login ele detecta se é Administrador ou se pertence a um utilizador comum (na base de dados).

Se for Administrador, terá acessos diferentes dos utilizadores.

O que me aconselhas a fazer?

Share this post


Link to post
Share on other sites
KiNgPiTo

Eu aconselho-te a criares uma variável na sessão que define os acessos dos utilizadores. Algo tipo $_SESSION['tipo'] = 0; para utilizadores e $_SESSION['tipo'] = 1; e depois de fazer login e verificares que tipo de utilizador é...

Depois nas diversas páginas, é só receberes o valor e caso seja === 0 faz X, caso seja === 1 faz x + y

Share this post


Link to post
Share on other sites
softklin

É isso. Aos criares uma sessão, ela cria um cookie próprio para que possas relacionar o browser com o cliente. Ou seja, em vez de guardares as coisas nos cookies, guarda nas sessões, como o kingpito te indicou.

As sessões só ficam visiveis do lado do servidor. Tem em conta este quadro da nossa wiki:

http://wiki.portugal-a-programar.pt/dev_web:php:cookies_sessoes#consideracoes_de_quando_usar_um_e_outro


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.