Scripts

Ledenscript

Omdat de meeste loginscripts niet werken als de cookies van een bezoeker af staan ben ik zelf aan eentje beginnen werken. Om hijacken van een SESSIE tegen te gaan heb ik gebruik gemaakt van een database, waar ik dan ook ineens een klein leden script aan vast heb gemaakt. wachtwoord en username worden weldra uit de cookies en sessies verwijderd en aangepast met een unieke session id per lid opgeslagen in een database en cookie of sessie. Script werkt wel degelijk indien cookies af staan, PHPSESSID wordt dan mee doorgegeven via de url. Geplande uitbreidingen: - layout, avatar en andere persoonlijke instellingen per lid. - verdere uitbreiding van leden script. - volledig admin gedeelte voor beheer layout, leden en database. Daar ik eerst de msql gedeelten aan het wijzigen ben naar mysqli zijn deze updates voor later. Een setup bestand zit er nog niet echt bij maar de tabellen en administrator worden wel reeds automatisch aangemaakt via het admin gedeelte. Je moet wijzigingen toepassen in 3 bestanden in de map includes namelijk: - config.inc.php - mysql_config.php - login.inc.php en indien gewenst kan je in config_register.inc.php ook even een kijkje nemen en een eventuele mimimumleeftijd indtellen om te registreren. Het staat steeds duidelijk beschreven welke gegevens je mag/moet aanpassen. installatie Je maakt een database aan indien je die nog niet hebt. Je download het zip bestand op onderstaande link en pakt het uit, upload het naar een gewenste map op je server en pas de gegevens aan in bovenvermelde bestanden. Na het uploaden en aanpassen ga je in je browser naar de map waar je de bestanden naartoe hebt geupload met "/admin" erachter. Dus als je naar http://www.jedomein.be/ledenscript hebt geupload ga je naar http://www.jedomein.be/ledenscript/admin daar neem je dan tabellen aanmaken en kies je ledenscript (de andere functies in admin zijn voor versie 1.1 en 1.2 enkel database beheer werkt ook reeds gedeeltelijk) Als alles goed is gegaan kan je het voorbeeld nu gebruiken op http://www.jedomein.be/ledenscript/voorbeelden/voorbeeld.php Alle opbouwende / aanvullende kritiek is meer dan welkom. - preg_match controle op invoer username toegevoegd! - Probleem van verkeerde pagina na registratie zou opgelost moeten zijn. - Je krijgt nu 5 seconden een boodschap te zien dat je geregistreerd bent. testen kan je met test en TEST123 Download het script: http://www.jb-web.org/downloads/scripts/php/ledenscript.zip

ledenscript
omdat de code wat lang is van het hele script kan je het op volgende link in een zip downloaden http://www.jb-web.org/downloads/scripts/php/ledenscript.zip.

Hieronder vind u wel de code van login.inc.php terug die de SESSIES en COOKIES beheerd bij het inloggen.

voor de uitleg erbij
code van voorbeeld.php:
[code]
<?php
if (! isset($_COOKIE['testcookie'])) {
	setrawcookie("testcookie", "test", time()+3600*24*365*30);
}
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Hoofdpagina Website</title>

<link href="../css/style.css" rel="stylesheet" type="text/css" />

<?php
/* er worden 4 SESSION waardes teruggegeven als de gebruiker is ingelogd:
	- $_SESSION['sid']  moet je toevoegen aan elke url waarnaar je doorverwijsd en je de SESSIE wil bewaren als er geen cookies aanvaard worden door de gebruiker zijn browser.
	- $_SESSION['right_id']  komt overeen met de waardes die je in je array moet vermelden.
	- $_SESSION['right_name'] de naam van gebruiker zijn recht en ook hieronder beschreven in de array documentatie.
	- $_SESSION['right_description'] een korte omschrijving van de rechten van de gebruiker.
*/

// hieronder geef je de cijfers op in een array van de benodigde rechten om de pagina te openen.
$rights = array(1, 2); // 0 = new, 1 = admin, 2 = mod, 3 = crew, 4 = trusted, 5 = member 
?>

</head>

<body>

<div>
Hier kan je inhoud zetten die voor iedereen zichtbaar mag zijn.
</div>

<?php
require_once("../includes/login.inc.php");
?>

<div>
Hier kan je inhoud zetten die zichtbaar mag zijn voor al de leden ongeacht hun rechten.
<input class="button" onclick="window.location='../registreer.php'" type="button" value="Registreer" />
</div>

<div>
<?php
if (in_array($_SESSION['right_id'], $rights)) {
	echo "Hier kan je inhoud zetten die zichtbaar mag zijn voor de gebruiker die voldoet aan de rechten in \$rights.<br />";
} else {
	echo "Hier kan je een mededeling zetten indien de gebruiker niet voldoet aan de rechten in \$rights.<br />";
}

echo "Je hebt <b>" . $_SESSION['right_name'] . "</b> rechten.<br />";
echo "<textarea rows=\"7\" cols=\"63\" readonly=\"readonly\">" . $_SESSION['right_description'] . "</textarea>";
?>
</div>

<a href="<?php	echo $_SERVER['PHP_SELF'] . "?" . $_SESSION['sid']; ?>">Herladen</a>

</body>
</html>
[/code]

code van login.inc.php
[code]
<?php
error_reporting(E_ALL);
session_start();

$path_to_script = "scripts/Eigen Scripts/ledenscript/includes"; // geef hier het path naar het script tov de server root

/*********************************
 * HIERONDER NIETS MEER WIJZIGEN *
 *********************************/
/* nagaan of de gebruiker zijn browser cookies aanvaard
   testen of eerder aangemaakte cookie 'testcookie' aanwezig is.
*/
if (isset($_COOKIE['testcookie'])) { // cookie aanwezig, url zonder SESSID instellen
	$_SESSION['url'] = $_SERVER['PHP_SELF'];
	$_SESSION['sid'] = "";
} else { // cookie NIET aanwezig, url MET doorgeven SESSID instellen
	$_SESSION['sid'] = htmlspecialchars(sid);
	$_SESSION['url'] = $_SERVER['PHP_SELF'] . "?" . htmlspecialchars(sid);
	setrawcookie("testcookie", "test", time()+3600*24*365*30);
}

// benodigde bestanden invoegen
require_once($_SERVER['DOCUMENT_ROOT'] . "/" . $path_to_script . "/config.inc.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/" . $path_to_script . "/mysql_config.inc.php"); // Mysql gegevens inladen
require_once($_SERVER['DOCUMENT_ROOT'] . "/" . $path_to_script . "/mysql_functies.inc.php"); // Mysql functies inladen

// bezoeker status instellen als niet ingelogged.
$user_verified = FALSE;

if (isset($_COOKIE[$cookie_name])) {
	$cookiedata = explode("/", $_COOKIE[$cookie_name]);
	list($coo_username, $coo_password, $coo_user_ip, $coo_verified, $cookie_remember) = $cookiedata;
	if ($_SERVER['REQUEST_METHOD'] == "POST" && isset($_POST['verifypassword'])) {
		if ($coo_password == sha1(md5($_POST['verifypassword']))) {
			$coo_verified = time();
			if ($cookie_remember == TRUE) {
				setrawcookie($cookie_name, $coo_username . "/" . $coo_password . "/" . $coo_user_ip . "/" . $coo_verified . "/TRUE", time()+3600*24*365*30, $cookie_path, $cookie_domain);
			} elseif ($cookie_remember == FALSE) {
				setrawcookie($cookie_name, $coo_username . "/" . $coo_password . "/" . $coo_user_ip . "/" . $coo_verified . "/FALSE", 0, $cookie_path, $cookie_domain);
			}
		} else {
			echo "!! PASWORD VERIFICATION FAILED !!<br /> Gelieve opnieuw in te loggen";
			setrawcookie($cookie_name, "dummy", time()-3600*24*365, $cookie_path, $cookie_domain);
			header("Refresh: 2; URL= " . $_SESSION['url']);
			exit;
		}
	}
	dbconnect($host, $dbuser, $dbpass, $dbname);
	$query = "SELECT user_ip FROM leden_stats, leden_profile WHERE leden_profile.username='" . $coo_username . "' AND leden_profile.password='" . $coo_password . "'";
	$result = mysql_query($query);
	if (mysql_num_rows($result)) {
		$db_user_ip = implode(mysql_fetch_row($result));
		if ($db_user_ip == $coo_user_ip) {
			$query = "SELECT recht_id, recht_naam, recht_omschrijving FROM leden_rights, leden_stats WHERE leden_rights.recht_id=leden_stats.rechten AND leden_stats.username='" . $coo_username . "'";
			$result = mysql_query($query);
			$rights_info = mysql_fetch_row($result);
			list($_SESSION['right_id'], $_SESSION['right_name'], $_SESSION['right_description']) = $rights_info;
			if ($time_verify) {
				if ($coo_verified >= time()- $verify_after) {
					$username = $coo_username;
					$user_ip = $_SERVER['REMOTE_ADDR'];
					$user_verified = TRUE;
				} else {
					echo "Het is meer dan " . date("H:i:s", mktime(0,0,$verify_after)) ." geleden dat je geverifiëerd werd.<br />";
					echo "Gelieve je wachtwoord opnieuw in te geven";
					?>
					<form action="<?php echo $_SESSION['url']; ?>" method="post">
						<b>Password:</b>
						<input class="input" name="verifypassword" type="password" style="width: 100px" />
						<input class="button" name="login" type="submit" value="Verifi&euml;er" />
</form>
					<?php
					exit;
				}
			} else {
				$username = $coo_username;
				$user_ip = $_SERVER['REMOTE_ADDR'];
				$user_verified = TRUE;
			}
			mysql_query("UPDATE leden_stats SET online=1, laatst_actief='" . date('U') . "', user_ip='" . $user_ip . "', laatste_bezoek = '" . date('YmdHis') . "' WHERE username = '" . $username . "'");	
		} else {
			echo "!! IP NIET OK !!<br /> Er werd een cookie teruggevonden maar de data erin is corrupt! Gelieve opnieuw in te loggen";
			setrawcookie($cookie_name, "dummy", time()-3600*24*365, $cookie_path, $cookie_domain);
			// cookies verwijderen, database updaten indien nodig.
		}
	} else {
		echo "!! PASWOORD NIET OK !!<br /> Er werd een cookie teruggevonden maar de data erin is corrupt! Gelieve opnieuw in te loggen";
		setrawcookie($cookie_name, "dummy", time()-3600*24*365, $cookie_path, $cookie_domain);
		// cookies verwijderen, database updaten indien nodig.
	}
	mysql_free_result($result);
	mysql_close($m_connect);
} elseif (isset($_SESSION['username'], $_SESSION['password'], $_SESSION['user_ip'], $_SESSION['verified'])) {
	if ($_SERVER['REQUEST_METHOD'] == "POST" && isset($_POST['verifypassword'])) {
		if ($_SESSION['password'] == sha1(md5($_POST['verifypassword']))) {
			$_SESSION['verified'] = time();
		} else {
			echo "!! PASWORD VERIFICATION FAILED !!<br /> Gelieve opnieuw in te loggen";
			session_destroy();
			header("Refresh: 2; URL= " . $_SESSION['url']);
			exit;
		}
	}
	if ($_SESSION['user_ip'] == $_SERVER['REMOTE_ADDR']) {
		if ($time_verify) {
			if ($_SESSION['verified'] >= time()- $verify_after) {
				$user_verified = TRUE;
			} else {
				echo "Het is meer dan " . date("H:i:s", mktime(0,0,$verify_after)) ." geleden dat je geverifiëerd werd.<br />";
				echo "Gelieve je wachtwoord opnieuw in te geven";
				?>
				<form action="<?php echo $_SESSION['url']; ?>" method="post">
					<b>Password:</b>
					<input class="input" name="verifypassword" type="password" style="width: 100px" />
					<input class="button" name="login" type="submit" value="Verifi&euml;er" />
</form>
				<?php
				exit;
			}
		} else {
			$user_verified = TRUE;
		}
	}
	
} elseif ($_SERVER['REQUEST_METHOD'] === "POST" && isset($_POST['login'], $_POST['username'], $_POST['password']) && strtolower($_POST['login']) === "inloggen") {
	$username = trim($_POST['username']);
	$password = trim($_POST['password']);
	if(preg_match('~["*$<>{}()\[\]§!\'´`áéíóúàèìòùçµäëïö\\\ü]~', $username)) {
		echo "De gebruikersnaam bevat ongeldige tekens! Probeer opnieuw.";
	} elseif(empty($username)) {
		echo "Gelieve een Gebruikersnaam in te vullen.";
	} elseif (empty($password)) {
		echo "Gelieve een wachtwoord in te vullen.";
	} else {
		dbconnect($host, $dbuser, $dbpass, $dbname);
		$query = "SELECT password FROM leden_profile WHERE username='" . $username . "'";
		$result = mysql_query($query);
		if (mysql_num_rows($result) === 1) {
			$db_user_password = implode(mysql_fetch_row($result));
			if ($db_user_password == sha1(md5($password))) {
				$query = "SELECT recht_id, recht_naam, recht_omschrijving FROM leden_rights, leden_stats WHERE leden_rights.recht_id=leden_stats.rechten AND leden_stats.username='" . $username . "'";
				$result = mysql_query($query);
				$rights_info = mysql_fetch_row($result);
				list($_SESSION['right_id'], $_SESSION['right_name'], $_SESSION['right_description']) = $rights_info;
				$password = sha1(md5($password));
				$user_ip = $_SERVER['REMOTE_ADDR'];
				$verified = time();
				if (isset($_COOKIE['testcookie'])) {
					if (isset($_POST['remember']) && $_POST['remember'] == "remember") {
						setrawcookie($cookie_name, $username . "/" . $password . "/" . $user_ip . "/" . $verified . "/TRUE", time()+3600*24*365*30, $cookie_path, $cookie_domain);
					} else {
						setrawcookie($cookie_name, $username . "/" . $password . "/" . $user_ip . "/" . $verified . "/FALSE", 0, $cookie_path, $cookie_domain);
					}
				} else {
					$_SESSION['username'] = $username;
					$_SESSION['password'] = $password;
					$_SESSION['user_ip'] = $user_ip;
					$_SESSION['verified'] = $verified;
				}
				$user_verified = TRUE;
				mysql_query("UPDATE leden_stats SET online=1, laatst_actief='" . date('U') . "', user_ip='" . $user_ip . "', aantal_bezoeken=(aantal_bezoeken+1) WHERE username = '" . $username . "'");
			} else {
				echo "Foutief Paswoord.";
			}
		} else {
			echo "Je gebruikersnaam kan niet gevonden worden gelieve je te registreren.";
		}
		mysql_close($m_connect);
	}
}
if ($_SERVER['REQUEST_METHOD'] == "POST" && isset($_POST['logout']) && strtolower($_POST['logout']) == "uitloggen") {
	if (isset($_COOKIE[$cookie_name])) { 
		setrawcookie($cookie_name, "dummy", time()-3600*24*365, $cookie_path, $cookie_domain);
		session_destroy();
	} else {
		session_destroy();
	}
	dbconnect($host, $dbuser, $dbpass, $dbname);
	mysql_query("UPDATE leden_stats SET online=0, laatst_actief='" . date('U') . "', user_ip='" . $user_ip . "' WHERE username = '" . $username . "'");
	mysql_close($m_connect);	
	echo "U wordt Uitgelogged";
	header("Refresh: 2; URL= " . $_SERVER['PHP_SELF']);
	exit;
}
if (! $user_verified) {
	?>
	<form action="<?php echo $_SESSION['url']; ?>" method="post">
		<b>Username:</b>
		<input class="input" name="username" type="text" style="width: 100px" />
		<b>Password:</b>
		<input class="input" name="password" type="password" style="width: 100px" />
		<?php
		if (isset($_COOKIE['testcookie'])) {
			?>
			<input type="checkbox" name="remember" value="remember" style="width: 15px" />Onthouden
			<?php
		}
		?>
		<input class="button" name="login" type="submit" value="Inloggen" />
		<input class="button" onclick="window.location='../registreer.php'" type="button" value="Registreer" />
</form>
	<?php
	exit;
} else {
	?>
	<form action="<?php echo $_SESSION['url']; ?>" method="post">
		<input class="button" name="logout" type="submit" value="Uitloggen" />
</form>
	<?php
}
?>
[/code]

Reacties

0
Nog geen reacties.