Wątek przeniesiony 2016-01-20 15:46 z PHP przez dzek69.

Cookies nie działają na każdym PC

0

Hej,
Na samym początku chciałbym zwrócić uwagę, że w programowaniu stron jestem totalnym amatorem i kod może wydawać się zabawny bardziej doświadczonym, ale stworzyłem już niemalże całą witrynę, a mam problem z głupim ciasteczkiem : D Problem jest prosty: używam setcookie do ustawienia pliku cookie, wszystko super działa na wielu różnych kompach czy nawet telefonach, ale już drugi pecet z kolei po prostu nie tworzy pliku cookie, przez co zalogowanie się nie jest możliwe. Na owych pecetach strona sprawdzana była przez różne przeglądarki (Firefox, Chrome, Opera), żadnej różnicy.

Spędziłem kilka długich godzin na szukaniu przyczyny problemu, na anglo jak i polskojęzycznych stronach - nie widzę by ktokolwiek na świecie miał taki problem. Znając życie to coś mega banalnego, ale już opadam z sił. Oto kod index.php:

<?php
	ob_start();
	include 'connect.php';
	
	if(!isset($_GET['ZmianaHasla'])) //To takie tymczasowe, dopóki nie używam jeszcze mod_rewrite
		header("Location: index.php?ZmianaHasla=0");
?>

<html>
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" >
	<link href="index.css" rel="stylesheet" type="text/css">
	<title>Logowanie</title>
</head>
<body>
<div class="center">

<div id="panel">
    <form action="" method="post">
		<noscript><center><b><font color="red">Do poprawnego działania strony wymagane jest włącznie obsługi javascript!</font></b></center><br></noscript>
		<?php
			if($_GET['ZmianaHasla'] == 1)
				printf("<center><font color=green>Hasło zostało pomyślnie zmienione, zaloguj się ponownie.</font></center><br>");
		?>
        <label for="User">Nazwa użytkownika:</label>
        <input type="text" id="User" name="User">
        <label for="Pass">Hasło:</label>
        <input type="password" id="Pass" name="Pass">
		<label><a href="forgotpassword.php">Przypomnij hasło</a></label>
        <div id="lower">
            <input type="submit" value="Login" id="Send" name="Send">
			<br>
    </form>
</body>

<?php
$User = htmlspecialchars(trim($_POST['User']));
$Pass =  htmlspecialchars(trim($_POST['Pass']));
$Send = $_POST['Send'];

if(isset($_COOKIE['Send'])) $error ='Odczekaj '.($_COOKIE['Send']-time()).' sekund przed wysłaniem';

if(SprawdzUprawnienia() > -2)
	header("Location: zalogowany.php");

if($Send && !isset($_COOKIE['Send']))
{
	if(strlen($User) && strlen($Pass))
	{
		$Znaleziono = 0;
		$Podane = mysql_query("SELECT ID, User, Pass, Rights, Imie, Nazwisko FROM `$db`.`logowanie`");
		while($Wiersz = mysql_fetch_array($Podane))
		{
			if($Wiersz['User'] == $User)
			{
				if(md5($Pass) == $Wiersz['Pass'])
				{
					$Znaleziono = 1;
					$Ciasteczko = sprintf("%d/%s %s/%s", $Wiersz['Rights'], $Wiersz['Imie'], $Wiersz['Nazwisko'], $Wiersz['ID']);
					setcookie("Zalogowany", $Ciasteczko, time() + 600, "/", ".www.g***k.eu");
					header("Location: zalogowany.php"); 
				}
				break;
			}
		}
		if($Znaleziono == 0)
			printf("</br><center><font color=red>Niepoprawna nazwa użytkownika lub hasło!</font></center>");
	}
	else
		printf("</br><center><font color=red>Wypełnij wszystkie pola!</font></center>");
}
?>
</html>

connect.php jakby było potrzebne:

<?php
error_reporting(0);
$db = "g***k_eko";
$link = mysql_connect('localhost', 'g***k_eko', 'tajnehaslo', '$db');

if(!$link)
{
	printf("<br><b><font color='red'>Nie mogę połączyć się z serwerem MySQL. Kod błędu: %s</font></b>", mysqli_connect_error());
}

mysql_query("SET NAMES utf8");
mysql_query("SET CHARACTER_SET utf8_polish_ci");

function SprawdzUprawnienia()
{
	if(isset($_COOKIE['Zalogowany']) && strlen($_COOKIE['Zalogowany']) > 2)
	{
		$Data = 0;
		$str = explode("/", $_COOKIE['Zalogowany']);
		$Zapytanie = sprintf("SELECT ID, User, Rights, Imie, Nazwisko, ZmianaHasla, RightsConst FROM `g***k_eko`.`logowanie` WHERE ID='%s'", $str[2]);
		$Podane = mysql_query("$Zapytanie");
		while($Wiersz = mysql_fetch_array($Podane))
			$Data = sprintf("%s", $Wiersz['ZmianaHasla']);
		$Obecna_Data = date("Y-m-d");
		$Minelo = (strtotime($Obecna_Data) - strtotime($Data)) / (60 * 60 * 24);
		if($str[0] != -1 && $Minelo > 29)
		{
			$Zapytanie = sprintf("UPDATE `g***k_eko`.`logowanie` SET `Rights`='-1' WHERE `ID`='%s'", $str[2]);
			mysql_query("$Zapytanie");
			return -1;
		}
		else
			return strtok($_COOKIE['Zalogowany'], "/");
	}
	else
		return -2;
}
?>

Dziękuję za pomoc : )

0

Błąd najprawdopodobniej polega na tym, że Cookies są wysyłane w nagłówkach HTTP, w twoim kodzie zaś setcookie() pojawia się dopiero po tym, jak już wyrzucisz <html> i parę innych rzeczy. PHP rzuca Ci ostrzeżenie, że nie może ustawić ciastka, bo ciastko = nagłówek, ale nagłówki zostały już wysłane (bo muszą poprzedzać treść), więc ciastko nie jest ustawione - ale tego ostrzeżenia nie widzisz, bo masz wyłączone raportowanie błędów.

0

Dlatego też użyłem ob_start(). Włączyłem raportowanie błędów i wyrzuciłem chwilowo header by mnie nie przekierowało - u mnie na PC błędu nie ma po zalogowaniu (tworzy normalnie plik cookie, tak jak ma być). Na innym kompie, na którym nie tworzy pliku cookie błędu również nie wyświetla. Zresztą, próbowałem też tworzyć ten plik na samym początku strony i nadal nie robiło go na tym innym kompie : D

0

Dobrze, że ukryłeś nazwę domeny, bo strona jest dziurawa jak sito. Poszukaj sobie w Google: SQL Injection.

0

Dzięki, że mnie o tym uświadomiłeś, ale nadal nie załatwia to mojego problemu, bowiem związek z SQL Injection (wiem co to jest) ma to taki, że aż żaden : D

//Edit
Ok, poradziłem sobie. Wystarczyło usunąć "www" z setcookie przy ustawianiu domeny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1