След вписване на потребителя, не създава/запомня бисквитката

nom3r1

Registered
Нещо не ми запомня данните за вход т.е. след затварянето на браузъра, автоматично се описвам , а на всичкото от-горе не успявам да създавам бисквитка?

/нарочно не съм направил връзка с базата данни, 'щото си правя експерименти за най-добър вход-изход/

Също така приемам и съвети за най-добра защита за използването на бисквитки плюс сесиите при вход..

Код за вход:
PHP:
<?php
session_start();
function filter($string) {
	return preg_replace('/[^a-zA-Z0-9\s\.]/', '', $string);
}
$_GET     = array_map("filter", $_GET);
$_POST    = array_map("filter", $_POST);
$_COOKIE  = array_map("filter", $_COOKIE);
echo '<meta http-equiv="Content-Type" content="text/html;charset=windows-1251"/>';
if(isSet($_SESSION['logged']) || isSet($_COOKIE['username'])) {
	echo "Изход";
} else {
	if(isSet($_POST['submit'])) {
		if(isSet($_SESSION['token']) && $_POST['token'] == $_SESSION['token']) {
			if(isSet($_COOKIE['username'])) {
				$username = $_COOKIE['username'];
			} else {
				if(isSet($_POST['username'], $_POST['password'])) {
					$username = $_POST['username'];
					$password = $_POST['password'];
				} else {
					$username = "";
					$password = "";
				}
			}
			if(!$username || !$password) {
				echo "Трябва да въведете задължителните полета.";
			} else {
				if($username == "admin" AND $password == "admin") {
					setcookie('username', $username, time() + 3600, '/', '.site.com');
					$_SESSION['logged'] = 1;
					echo "Success";
				} else {
					echo "invalid user/pass";
				}
			}
		} else {
			echo "CSRF Attack Detected";
		}
	} else {
		$token = $_SESSION['token'] = md5(uniqid('gushter',true));
		$GET_SELF = htmlentities($_SERVER['PHP_SELF']);
		echo "
		<form method=\"POST\" action=\"{$GET_SELF}\">
		<table>
		<tbody>
			<tr>
				<td>Потребител</td>
				<td><input type=\"text\" name=\"username\" /></td>
			</tr>
			<tr>
				<td>Парола</td>
				<td><input type=\"password\" name=\"password\" /></td>
			</tr>
			<tr>
				<td>
				<input type=\"submit\" name=\"submit\" value=\"SignUp\" />
				<input type=\"hidden\" name=\"token\" value=\"{$token}\" />
				</td>
			</tr>
		</tbody>
		</table>
		</form>";
	}
}
?>

П.С. Направи ми впечатление, че когато се опитам да създам бисквитката преди
PHP:
if(isSet($_SESSION['logged']) || isSet($_COOKIE['username'])) {

- няма проблеми, обаче мушна ли го някъде при if(); въобще не създава бисквитка.. или въобще надолу след

PHP:
if(isSet($_SESSION['logged']) || isSet($_COOKIE['username'])) {
 
1. echo '<meta http-equiv="Content-Type" content="text/html;charset=windows-1251"/>'; това го направи по следния начин

PHP:
header("Content-Type: text/html; charset=windows-1251");

Поне да не цепим PHP-то с HTML.

2. Пробвай да направиш проверката така

PHP:
if(!empty($_SEESION['logged']) || !empty($_COOKIE['username']))

и кажи какво става.

3. .site.com - надявам се, че въвеждаш правилен адрес. Защото, ако си написал някакъв домейн, а отваряш през localhost бисквитката никога няма да се запише.
 
Падна малко играчка , но пренаписах всичко на ново и за сега работи, обаче ме притеснява факта, да не би да може да бъде манипулирана бисквитката и да се използва/открадне чужд профил?

PHP:
<?php
session_start();
header("Content-Type: text/html; charset=windows-1251");
$GET_SELF = htmlentities($_SERVER['PHP_SELF']);
function filter($string) {
	return preg_replace('/[^a-zA-Z0-9\s\.]/', '', $string);
}
$_GET     = array_map("filter", $_GET);
$_POST    = array_map("filter", $_POST);
$_COOKIE  = array_map("filter", $_COOKIE);

function loggedin() {
	if(isSet($_SESSION['username']) || isSet($_COOKIE['username']))
	$loggedin = true;
	return $loggedin;
}
function logout() {
	session_destroy();//destroy session
	setcookie("username", "", time()-7200);//unset cookie
	header("Location: {$GET_SELF}");
}
if(loggedin()) {
	//logout();
	echo "Клиентски панел";
} else {
if(isSet($_POST['submit'])) {
	if(isSet($_SESSION['token']) && $_POST['token'] == $_SESSION['token']) {
		if(isSet($_POST['username'], $_POST['password'])) {
			$username = trim($_POST['username']);
			$password = trim($_POST['password']);
		} else {
			$username = "";
			$password = "";
		}
		if(isSet($_POST['rememberme'])) {
			$remember = $_POST['rememberme'];
		} else {
			$remember = "";
		}
		if(!$username || !$password) {
			echo "Username/password combination incorrect.";
		} else {
			if($username == "admin" AND $password == "admin") {
				if($remember == "1") {
					setcookie('username', $username, time()+7200, '/', '.site.com');
					//echo "setcookie";
				} else {
					$_SESSION['username'] = $username;
					//echo "session";
				}
				header("Location: {$GET_SELF}");
			} else {
				echo "Username/password combination incorrect.";
			}
		}
	} else {
		echo "CSRF Attack Detected";
	}
} else {
	$token = $_SESSION['token'] = md5(uniqid('gushter',true));
	echo "
		<form method=\"POST\" action=\"{$GET_SELF}\">
		<table>
		<tbody>
			<tr>
				<td>Потребител</td>
				<td><input type=\"text\" name=\"username\" /></td>
			</tr>
			<tr>
				<td>Парола</td>
				<td><input type=\"password\" name=\"password\" /></td>
			</tr>
			<tr>
				<td>
				Запомни ме: <input type=\"checkbox\" name=\"rememberme\" value=\"1\" />
				<input type=\"submit\" name=\"submit\" value=\"SignUp\" />
				<input type=\"hidden\" name=\"token\" value=\"{$token}\" />
				</td>
			</tr>
		</tbody>
		</table>
		</form>";
}
}
?>




А ето и варианта с база от данни:

Предполагам няма да има начин да се манипулира след, проверка в базата данни, като се има на предвид, че ще му плесна няк'в token при създаването на бисквитката.

След което правя проверка в базата данни дали този token съществува, като при вписването на потребителя ще има една update заявка, на колона "update_token" - например.

и вече функцията ще трябва да я променим на:
PHP:
function loggedin() {
	if(isSet($_SESSION['username']) || isSet($_COOKIE['remember']) && preg_match('/^([0-9a-f]{32})$/', $_COOKIE['remember'])) {
		$query = mysql_query("SELECT `id` FROM `users` WHERE MD5(CONCAT(`username`, `password`, `token`)) = '{$_COOKIE['remember']}';")or die(mysql_error());
	}
	return mysql_num_rows($query)? 1 : 0;
}

а при вписването:
PHP:
if($remember == "1") {
	//update query f0r `users` table f0r column `token`
	setcookie('remember', md5($username.md5($password).$token), time()+7200, '/', '.site.com');
	//echo "setcookie";
} else {
	$_SESSION['username'] = $username;
	//echo "session";
}

Ако при функцията loggedin - всичко е наред , ще върне резултат 1 - истина и всичко е наред, в противен случай 0 - лъжа.

Обаче по време на експеримента ми направи впечатление, че сесията все едно не е създадена, може би

PHP:
isSet($_SESSION['username']) ||

Тук е проблема, че когато чек-бокса не е натиснат не си вписан т.е. създава ти сесия, но не си вписан. Някакви идеи? :)

PHP:
<?php
session_start();
header("Content-Type: text/html; charset=windows-1251");
$GET_SELF = htmlentities($_SERVER['PHP_SELF']);
function filter($string) {
	return preg_replace('/[^a-zA-Z0-9\s\.]/', '', $string);
}
$_GET    = array_map("filter", $_GET);
$_POST   = array_map("filter", $_POST);
$_COOKIE = array_map("filter", $_COOKIE);

function loggedin() {
	if(isSet($_SESSION['username']) || isSet($_COOKIE['remember']) && preg_match('/^([0-9a-f]{32})$/', $_COOKIE['remember'])) {
		$query = mysql_query("SELECT `id` FROM `users` WHERE MD5(CONCAT(`username`, `password`, `token`)) = '{$_COOKIE['remember']}';")or die(mysql_error());
	}
	return mysql_num_rows($query)? 1 : 0;
}
function verifyDatabase($username, $password) {
	$query = mysql_query("SELECT `id` FROM `users` WHERE `username`='{$username}' AND `password`='{$password}';")or die(mysql_error());
	return mysql_num_rows($query)? 1 : 0;
}
function logout() {
	session_destroy();//destroy session
	setcookie("remember", "", time()-7200);//unset cookie
	header("Location: {$GET_SELF}");
}
if(loggedin() == 1) {
	//logout();
	echo "Клиентски панел";
} else {
if(isSet($_POST['submit'])) {
	if(isSet($_SESSION['token']) && $_POST['token'] == $_SESSION['token']) {
		if(isSet($_POST['username'], $_POST['password'])) {
			$username = trim($_POST['username']);
			$password = trim($_POST['password']);
		} else {
			$username = "";
			$password = "";
		}
		if(isSet($_POST['rememberme'])) {
			$remember = $_POST['rememberme'];
		} else {
			$remember = "";
		}
		if(!$username || !$password) {
			echo "Username/password combination incorrect.";
		} else {
			if(verifyDatabase($username, md5($password)) == 0) {
				echo "Username/password combination incorrect.";
			} else {
				if($remember == "1") {
					//update query f0r `users` table f0r column `token`
					setcookie('remember', md5($username.md5($password).$token), time()+7200, '/', '.site.com');
					//echo "setcookie";
				} else {
					$_SESSION['username'] = $username;
					//echo "session";
				}
				header("Location: {$GET_SELF}");
			}
		}
	} else {
		echo "CSRF Attack Detected";
	}
} else {
	$token = $_SESSION['token'] = md5(uniqid('gushter',true));
	echo "
		<form method=\"POST\" action=\"{$GET_SELF}\">
		<table>
		<tbody>
			<tr>
				<td>Потребител</td>
				<td><input type=\"text\" name=\"username\" /></td>
			</tr>
			<tr>
				<td>Парола</td>
				<td><input type=\"password\" name=\"password\" /></td>
			</tr>
			<tr>
				<td>
				Запомни ме: <input type=\"checkbox\" name=\"rememberme\" value=\"1\" />
				<input type=\"submit\" name=\"submit\" value=\"SignUp\" />
				<input type=\"hidden\" name=\"token\" value=\"{$token}\" />
				</td>
			</tr>
		</tbody>
		</table>
		</form>";
}
}
?>
 
Я пробвай сега, промених някои неща, както и си позволих малко да си го преподредя, както на мен ми е удобно.

PHP:
<?php
session_start();
header("Content-Type: text/html; charset=windows-1251");
$GET_SELF = htmlentities($_SERVER['PHP_SELF']);
function filter($string) {
	return preg_replace('/[^a-zA-Z0-9\s\.]/', '', $string);
}
$_GET    = array_map("filter", $_GET);
$_POST   = array_map("filter", $_POST);
$_COOKIE = array_map("filter", $_COOKIE);

function loggedin() {
	if(isSet($_SESSION['username']) || (isSet($_COOKIE['remember']) && preg_match('/^([0-9a-f]{32})$/', $_COOKIE['remember']))) {
		$query = mysql_query("SELECT `id` FROM `users` WHERE MD5(CONCAT(`username`, `password`, `token`)) = '{$_COOKIE['remember']}';")or die(mysql_error());
	}
	return mysql_num_rows($query)? 1 : 0;
}
function verifyDatabase($username, $password) {
	$query = mysql_query("SELECT `id` FROM `users` WHERE `username`='{$username}' AND `password`='{$password}';")or die(mysql_error());
	return mysql_num_rows($query)? 1 : 0;
}
function logout() {
	unset($_SESSION['username']);
	unset($_SESSION['token']);
	setcookie("remember", "", time()-7200);//unset cookie
	header("Location: {$GET_SELF}");
}

if(loggedin() == 1) {
	//logout();
	echo "Клиентски панел";
} 
else {
	if(isSet($_POST['submit'])) {
		$username = NULL;
		$password = NULL;
		$remember = NULL;
		
		
        if(isSet($_SESSION['token']) && $_POST['token'] == $_SESSION['token']) {
			if(isSet($_POST['username'], $_POST['password'])) {
				$username = trim($_POST['username']);
				$password = trim($_POST['password']);
			} 
			if(isSet($_POST['rememberme'])) {
				$remember = $_POST['rememberme'];
			}
			
			if(is_null($username) || is_null($password)) {
				echo "Username/password combination incorrect.";
			} 
			else {
				if(verifyDatabase($username, md5($password)) == 0) {
					echo "Username/password combination incorrect.";
				} 
				else {
					if($remember == "1") {
						//update query f0r `users` table f0r column `token`
						setcookie('remember', md5($username.md5($password).$token), time()+7200, '/', '.site.com', false, true);
						//echo "setcookie";
					} 
					else {
						$_SESSION['username'] = $username;
						//echo "session";
					}
					header("Location: {$GET_SELF}");
				}
			}
        } 
		else {
			echo "CSRF Attack Detected";
        }
	} 
	else {
        $token = $_SESSION['token'] = md5(uniqid('gushter',true));
		?>
		<form method="POST" action="<?php echo $GET_SELF; ?>">
			<table>
                <tbody>
					<tr>
						<td>Потребител</td>
						<td><input type="text" name="username" /></td>
					</tr>
					<tr>
						<td>Парола</td>
						<td><input type="password" name="password" /></td>
					</tr>
					<tr>
						<td>
							Запомни ме: <input type="checkbox" name="rememberme" value="1" />
							<input type="submit" name="submit" value="SignUp" />
							<input type="hidden" name="token" value="<?php echo $token; ?>" />
						</td>
					</tr>
				</tbody>
			</table>
		</form>
		<?php
	}
}
?>
 
Същата работа, създава сесията обаче не си вписан, проблема е в if(); , но нещо не го чаткам 'що ми прави мизерии;

PHP:
function loggedin() {
        if(isSet($_SESSION['username']) || isSet($_COOKIE['remember']) && preg_match('/^([0-9a-f]{32})$/', $_COOKIE['remember'])) {
                $query = mysql_query("SELECT `id` FROM `users` WHERE MD5(CONCAT(`username`, `password`, `token`)) = '{$_COOKIE['remember']}';")or die(mysql_error());
        }
        return mysql_num_rows($query)? 1 : 0;
}

Като при формата изкарам $_SESSION['username']; ми изкарва потребителя - тоест, сесията съществува, но при проверката във функцията "издава" багажа.

При бисквитките проблеми няма.

-- Реших проблема, така:
PHP:
function loggedin() {
	if(isSet($_SESSION['username'])) {
		$query = mysql_query("SELECT `id` FROM `users` WHERE `username` = '{$_SESSION['username']}';")or die(mysql_error());
	} else if(isSet($_COOKIE['remember']) && preg_match('/^([0-9a-f]{32})$/', $_COOKIE['remember'])) {
		$query = mysql_query("SELECT `id` FROM `users` WHERE MD5(CONCAT(`username`, `password`, `token`)) = '{$_COOKIE['remember']}';")or die(mysql_error());
	}
	return mysql_num_rows($query)? 1 : 0;
}
 
Кода работи - без проблеми, ако няма HTML, но вкарам ли под
PHP:
session_start();

Няк'в html седи и гледай чудо.. сесиите бачкат, но бисквитките не. Не виждам логика в това, да не запазва бисквитка , като се използва по-нагоре html.

Като ми изважда грешка:

PHP:
Warning: Cannot modify header information - headers already sent by (output started at /home/nom3r1/public_html/index.php:21) in /home/nom3r1/public_html/index.php on line 88

21 ред е:

PHP:
<body>";

88 ред е:
PHP:
setcookie('remember', md5($username.md5($password).$_SESSION['token']), time()+7200, '/', '.site.com', false, true);
Проблема го решавам като сложа:
PHP:
ob_start();

Хм, ако може някой да ми обясни защо без ob_start(); не работи? Бисквитките ли го изискват :shock:
 
Пробвай с това:

https://github.com/carhartl/jquery-cookie

От както го ползвам, нямам проблеми с бисквитките.
 
madmax3_ каза:
Пробвай с това:

https://github.com/carhartl/jquery-cookie

От както го ползвам, нямам проблеми с бисквитките.

За к'во ми е да използвам jQuery при бисквитките - нещо не ми се връзва?
 

Back
Горе