Beste PHP'ers,

Ik heb hetvolgende script:

<?php
function login($naam, $wachtwoord, $action) {
$output = '';
if ($action == "inloggen") {
if (isset($_COOKIE["hash"])) {
$_COOKIE["hash"]=mysql_real_escape_string($_COOKIE["hash"]);
$qry = 'SELECT * FROM gebruikers WHERE hash = "'.$_COOKIE['hash'].'" AND ip = "'.$_SERVER['REMOTE_ADDR'].'"';
if ( !($result=mysql_query($qry)) ) {
$output .= '<br />Error: '.mysql_error();
}
else {
if (mysql_num_rows($result) == 1) {
$output .= '<br />U bent reeds ingelogd.';
$niet_ingelogd=0;
}
else {
$niet_ingelogd=1;
}
}
}
else {
$niet_ingelogd=1;
}
if (isset($naam) && isset($wachtwoord) && $niet_ingelogd == 1) {
$naam=mysql_real_escape_string($naam);
$wachtwoord=mysql_real_escape_string($wachtwoord);
$hash=md5(time());
$sql = 'SELECT * FROM gebruikers WHERE gebruikersnaam = "'.$naam.'" AND wachtwoord = "'.md5($wachtwoord).'"';
if ( !($result = mysql_query($sql)) ) {
$output .= '<br />Error: '.mysql_error();
}
else {
if (mysql_num_rows($result) == 0) {
$output .= '<br />U heeft een verkeerde naam en/of wachtwoord ingevuld.';
}
else {
$output .= '<br />U bent succesvol ingelogd!';
if ( !(mysql_query('UPDATE gebruikers SET hash = "'.$hash.'", ip = "'.$_SERVER['REMOTE_ADDR'].'" WHERE gebruikersnaam = "'.$naam.'" AND wachtwoord = "'.md5($wachtwoord).'"')) ) {
$output .= '<br />Error: '.mysql_error();
}
else {
setcookie('hash', $hash);
}
}
}
}
elseif ($niet_ingelogd == 1) {
$output .= '<br />Error, u heeft geen naam en of wachtwoord ingevuld!';
}
}
$output = preg_replace('(<br />)', '', $output, 1);
return $output;
}
function check($hash, $ip) {
$output = '';
if (isset($hash)) {
$hash=mysql_real_escape_string($hash);
$ip=mysql_real_escape_string($ip);
$qry = 'SELECT * FROM gebruikers WHERE hash = "'.$hash.'" AND ip = "'.$ip.'"';
if ( !($result=mysql_query($qry)) ) {
$output .= '<br />Error: '.mysql_error();
}
else {
if (mysql_num_rows($result) == 1) {
while ($row = mysql_fetch_assoc($result)) {
$output .= 'Welkom op uw eigen gedeelte '.$row["gebruikersnaam"].'!';
}
}
else {
$output .= 'U bent niet ingelogd, klik <a href="index.php?action=inloggen">hier</a> om in te loggen of <a href="index.php?page=registreer">hier</a> om gratis een account aan te maken';
}
}
}
else {
$output .= 'U bent niet ingelogd, klik <a href="index.php?action=inloggen">hier</a> om in te loggen of <a href="index.php?page=registreer">hier</a> om gratis een account aan te maken';
}
$output = preg_replace('(<br />)', '', $output, 1);
return $output;
}
function uitloggen($hash, $ip) {
$output = '';
if (isset($hash)) {
$hash=mysql_real_escape_string($hash);
$ip=mysql_real_escape_string($ip);
$qry = 'SELECT * FROM gebruikers WHERE hash = "'.$hash.'" AND ip = "'.$_SERVER['REMOTE_ADDR'].'"';
if ( !($result = mysql_query($qry)) ) {
$output .= '<br />Error: '.mysql_error();
}
else {
if (mysql_num_rows($result) == 1) {
$output .= '<br />U bent succesvol uitgelogd!';
setcookie('hash', '', time() - 3600);
}
else {
$output .= 'U bent niet ingelogd, en kan dus ook niet uitloggen...';
}
}
}
else {
$output .= 'U bent niet ingelogd, en kan dus ook niet uitloggen...';
}
$output = preg_replace('(<br />)', '', $output, 1);
return $output;
}
?>

En:

<?php
include("pages/check_login.php");
if (isset($_GET["action"])) {
if ($_GET["action"] == "inloggen" || $_GET["action"] == "checken" || $_GET["action"] == "uitloggen") {
if ($_GET["action"] == "inloggen") {
if (isset($_POST["name"]) && isset($_POST["pass"])) {
if (isset($_GET["action"])) {
$action=$_GET["action"];
}
else {
$action='inloggen';
}
$user = login($_POST["name"], $_POST["pass"], $action);
echo $user;
}
else {
echo '<form name="form" method="post" action="?action=inloggen">';
echo 'Name <input type="text" name="name"> ';
echo 'Pass <input type="password" name="pass"><input type="submit" value="submit" alt="login" name="login">';
echo '</form>';
}
}
if ($_GET["action"] == 'checken') {
$checken = check($_COOKIE["hash"], $_SERVER['REMOTE_ADDR']);
echo $checken;
}
if ($_GET["action"] == 'uitloggen') {
if (isset($_COOKIE["hash"])) {
$uitloggen = uitloggen($_COOKIE["hash"], $_SERVER['REMOTE_ADDR']);
echo $uitloggen;
}
else {
echo 'U bent niet ingelogd, en kan dus ook niet uitloggen... ';
}
}
}
else {
echo 'Er is een onbekende actie meegegeven!';
}
}
?>

Is het idee veilig genoeg ??
Dat had ik nog niet gemaakt, maar daarvoor moet de check functie iets worden aangepast....

<?php
function check($hash, $ip) {
$output = '';
if (isset($hash)) {
$hash=mysql_real_escape_string($hash);
$ip=mysql_real_escape_string($ip);
$qry = 'SELECT * FROM gebruikers WHERE hash = "'.$hash.'" AND ip = "'.$ip.'"';
if ( !($result=mysql_query($qry)) ) {
$output .= '<br />Error: '.mysql_error();
}
else {
if (mysql_num_rows($result) == 1) {
while ($row = mysql_fetch_assoc($result)) {
$output .= 'ingelogd';
// deze lijn is aangepast ^^
}
}
else {
$output .= 'U bent niet ingelogd, klik <a href="index.php?action=inloggen">hier</a> om in te loggen of <a href="index.php?page=registreer">hier</a> om gratis een account aan te maken';
}
}
}
else {
$output .= 'U bent niet ingelogd, klik <a href="index.php?action=inloggen">hier</a> om in te loggen of <a href="index.php?page=registreer">hier</a> om gratis een account aan te maken';
}
$output = preg_replace('(<br />)', '', $output, 1);
return $output;
}
?>

En de code om te checken:
<?php
if (isset($_COOKIE["hash"])) {
$checken = check($_COOKIE["hash"], $_SERVER['REMOTE_ADDR']);
if ($checken == 'ingelogd') {
echo 'Dit kan u alleen zien omdat u ingelogd bent, heeft u even mazzel!';
}
else {
echo 'U kan geen gebruik maken van dit onderdeel omdat u geen account heeft, registreer snel of log in!';
}
}
else {
echo 'U kan geen gebruik maken van dit onderdeel omdat u geen account heeft, registreer snel of log in!';
}
?>
Leuk. Maar wat is nu het nut nog in die functie om al die verschillende mogelijkheden in $output te zetten. Je doet er verder niks mee.
Uhm, geen eigenlijk, kan dus allemaal weg :p
Maak zo'n functie zo dat ie true of false teruggeeft. Dan kun je de check zo maken:

if(check(.........))
{
// ingelogd
}
else
{
// niet ingelogd
}
Okee, dat is inderdaad handiger ja...

Verder geen op -en of aanmerkingen over veiligheid ?
Misschien kun je aan de hand van een klasse die ik ooit heb geschreven ideeen opdoen?


<?php
error_reporting(E_ALL); 
ini_set("display_errors", 1);

require_once('errorLogger.php');

class Auth 
{
	private $sSalt;
	private $sPepper;
	
	private $sReturnUrl;
	
	public $iUserID;
	public $sUserHash;
	public $sUsername;
	
	private $db;
	private $error;
	
	private $session_id;
	
	private $time_out;
	
	public function __construct($time_out = 60)
	{
		$this->db = new PDO('mysql:host=localhost;dbname=
','
','
');
		$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
		
		$this->error = new errorReporting;

		$this->sSalt = '%fyg#h74$gS6F/e%sC^^$fd';
		$this->sPepper = '#$fe3êr#%^Dgt54fgD$%53D$';
		
		$this->time_out = $time_out;
		
		$this->cleanAttempts();
		$this->cleanLogins();
	}
	
	public function authorisation ($iUserID, $sHash, $sSessionID)
	{
		try
		{
			$qCheckAuthorisedUser = $this->db->query('SELECT ID
														FROM login_current_online
															WHERE user_ID = '.$iUserID.' 
																AND hash = "'.$sHash.'"
																	AND ip_address = "'.$_SERVER['REMOTE_ADDR'].'"
																		AND session_ID = "'.$sSessionID.'"');
															
				$rCheckAuthorisedUser = $qCheckAuthorisedUser->fetch(PDO::FETCH_ASSOC);
				
				if(count($rCheckAuthorisedUser) == 1)
				{
					$qUpdateUserLastActive = $this->db->exec('UPDATE login_current_online
																SET last_active = NOW()
																	WHERE ID = '.$rCheckAuthorisedUser['ID']);
																	
					return true;
				}
				else
				{
					return false;
				}
		}
		catch(PDOException $e)
		{
			$this->error->setDatabaseError($e->getTrace(), $e->getMessage());
			$this->error->log();
			
			return false;
		} 		
	}
	
	public function login($sUsername, $sPassword)
	{
		try 
		{ 
			$qAttempt = $this->db->exec('INSERT INTO 
												login_attempts 
													(ip_address, 
													username, 
													password,
													date) 
											VALUES 
													("'.$_SERVER['REMOTE_ADDR'].'",
													'.$this->db->quote($sUsername).',
													'.$this->db->quote($sPassword).',
													NOW())
											');
													
			$qBruteforce = $this->db->query('SELECT ID 
												FROM login_attempts 
													WHERE date > NOW() - INTERVAL 1 MINUTE');
				
				$aBruteforce = $qBruteforce->fetchAll(PDO::FETCH_ASSOC);
				
				if(count($aBruteforce) < 10)
				{
					$qChkUserInput = $this->db->query('SELECT ID, username, rights
														FROM accounts
															WHERE username = '.$this->db->quote($sUsername).' 
																AND password = '.$this->db->quote($this->hash($sPassword)).'
																AND active = 1'
													  );
													  
						$aChkUserInput = $qChkUserInput->fetch(PDO::FETCH_ASSOC);
														  
						if($aChkUserInput != false)
						{							
							$this->iUserID = $aChkUserInput['ID'];
							$this->sUserHash = $this->userIdentity();
							
								$qInsertUserOnline = $this->db->exec('INSERT INTO 
																			login_current_online 
																				(user_ID,
																				hash,
																				last_active,
																				ip_address,
																				session_ID)
																		VALUES
																				('.$this->iUserID.',
																				"'.$this->sUserHash.'",
																				NOW(),
																				"'.$_SERVER['REMOTE_ADDR'].'",
																				"'.$this->session_id.'")
																	');
							return true;
						}
						else
						{
							return false;
						}
				}
				else
				{
					return false;
				}
		} 
		catch(PDOException $e) 
		{ 
			$this->error->setDatabaseError($e->getTrace(), $e->getMessage());
			$this->error->log();
			
			return false;
		} 		
	}
	
	public function logout ($iUserID, $sUserHash)
	{
		try
		{
			$this->db->exec('DELETE FROM 
								login_current_online
									WHERE user_ID = '.$iUserID.'
										AND hash = "'.$sUserHash.'"');
										
			return true;
		}
		catch(PDOException $e)
		{
			$this->error->setDatabaseError($e->getTrace(), $e->getMessage());
			$this->error->log();
			
			return false;
		}
	}
	
	public function redirect()
	{
		if($this->sReturnUrl != NULL)
		{
			return $this->sReturnUrl;
		}
		else
		{
			if(isset($_SERVER['HTTP_REFERER']) && !empty($_SERVER['HTTP_REFERER']))
			{
				return $_SERVER['HTTP_REFERER'];
			}
			else
			{
				return 'index.php';
			}
		}
	}
	
	public function getUserInfoPerMail ($emailAddress)
	{
		$qUserInfo = $this->db->query('SELECT ID, username 
												FROM accounts 
													WHERE email_address = '.$this->db->quote($emailAddress));
				
			return $qUserInfo->fetch(PDO::FETCH_ASSOC);
	}
	
	public function resetUser($user_id, $password)
	{
		if(ctype_digit($user_id) || !empty($password))
		{
			$qResetUser = $this->db->exec('UPDATE accounts SET password = "'.$password.'" WHERE ID = '.$user_id.' LIMIT 1');
			
			if($qResetUser > 0)
			{
				return true;
			}
			else
			{
				return false;
			}
		}
		else
		{
			return false;
		}
		
	}
	
	public function getUserID ()
	{
		if(!empty($this->iUserID))
		{
			return $this->iUserID;
		}
	}
	
	public function getsUserHash ()
	{
		if(!empty($this->sUserHash))
		{
			return $this->sUserHash;
		}
	}
	
	public function getNewPassword ()
	{
		$sIdentity = '';
		$iIntegers = range(0,9);
		$sLowerCase = range('a','z');
		$return = array();
		
		$aChars = array_merge($iIntegers, $sLowerCase);
		
			for($i = 0; $i <= 4; $i++)
			{
					$sIdentity .= $aChars[rand(0,count($aChars)-1)];
			}
		
		$return['password'] = $sIdentity;
		$return['hash'] = $this->hash($sIdentity);
		
		return $return;
	}
	
	public function setReturnPath ($returnUrl)
	{
		if(!empty($returnUrl))
		{
			$this->sReturnUrl = $returnUrl;
		}
	}
	
	public function setSessionID ($sessionID)
	{
		if(!empty($sessionID))
		{
			$this->session_id = $sessionID;
		}
	}
	
	private function hash ($password)
	{
		return sha1($this->sSalt.$password.$this->sPepper);
	}
	
	private function cleanAttempts ()
	{
		try
		{
			$this->db->exec('DELETE 
								FROM login_attempts 
									WHERE date < NOW() - INTERVAL 7 DAY');
		} 
		catch(PDOException $e) 
		{ 
			$error = '<p><b>A query error has occurred</b><p>'.PHP_EOL;
		    $error .= '<pre>'; 
		    $error .= 'Line number: '.$e->getLine().'<br>'.PHP_EOL; 
		    $error .= 'File: '.$e->getFile().'<br>'.PHP_EOL; 
		    $error .= 'PDO message: '.$e->getMessage().'<br>'.PHP_EOL; 
		    $error .= '</pre>'; 
			
			return $error;
		}
	}
	
	private function cleanLogins ()
	{
		try
		{
			$this->db->exec('DELETE 
								FROM login_current_online
									WHERE last_active < NOW() - INTERVAL '.$this->time_out.' MINUTE');
		}
		catch(PDOException $e)
		{
			$error = '<p><b>A query error has occurred</b><p>'.PHP_EOL;
		    $error .= '<pre>'; 
		    $error .= 'Line number: '.$e->getLine().'<br>'.PHP_EOL; 
		    $error .= 'File: '.$e->getFile().'<br>'.PHP_EOL; 
		    $error .= 'PDO message: '.$e->getMessage().'<br>'.PHP_EOL; 
		    $error .= '</pre>'; 
			
			return $error;
		}
	}
	
	private function userIdentity()
	{
		$sIdentity = '';
		$iIntegers = range(0,100);
		$sLowerCase = range('a','z');
		$sUpperCase = range('A','Z');
		
		$aChars = array_merge($iIntegers, $sLowerCase , $sUpperCase);
		
			for($i = 0; $i <= 50; $i++)
			{
					$sIdentity .= $aChars[rand(0,count($aChars)-1)];
			}
		
		return sha1(microtime().$sIdentity);
	}
}
?>

Reageren