Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

bioshock

Cookies {Resolvido}

Mensagens Recomendadas

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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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"); 
} 
?>

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.