login systeem

Geschreven door: Peter Prijs
Geschreven op: 25.03.2006 20:42


Beschrijving:
login systeem gemaakt door een newbie
Mijn verhaal

Ik heb dit login systeem gemaakt en wil graag jullie mening over het geheel.

Ben een complete Newbie met php en Mysql maar ben nu 2 weken aan het lezen geweest en 2 dagen aan het tikken geweest.

Nu wil ik graag weten of dit een veilige manier is om een login te maken.

P.s. Ik hoop ook dat dit het juiste plekje hiervoor is.
Tabel in je database maken.

Een sql dump van de tabel geeft het volgende:


-- Tabel structuur voor tabel `gebruikers`
-- 

CREATE TABLE `gebruikers` (
`UserId` int(11) NOT NULL auto_increment,
`NicknameGebruiker` varchar(15) NOT NULL,
`WachtwoordGebruiker` varchar(500) NOT NULL,
`NaamGebruiker` varchar(40) NOT NULL,
`AdresGebruiker` varchar(40) NOT NULL,
`PostcodeGebruiker` varchar(7) NOT NULL,
`PlaatsGebruiker` varchar(30) NOT NULL,
`TelefoonnummerGebruiker` varchar(11) NOT NULL,
`FaxnummerGebruiker` varchar(11) NOT NULL,
`EmailAdresGebruiker` varchar(30) NOT NULL,
PRIMARY KEY (`UserId`),
UNIQUE KEY `NaamGebruiker` (`NaamGebruiker`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;


een betandeje voor de verbinding maken

data.inc

<?php
$server = "";
$gebruiker= "";
$wachtwoord= "";
$db = "";
?>


Vul op de lege plekken je gegevens in.
de login pagina

login.php


<?php
session_start();//een sessie starten
include('data.inc');// de gegevens laden voor mysql aanlog
if(isset($_SESSION['pass'])){// controle of er al ingelogd is d.m.v. controle of sessie al een password toegeken heeft gekregen.
Print"U bent al in gelogd.";
}else{
if(isset($_POST['submit'])){
print"u bent ingelogd!";
}else{require('loginform.html');// login weergeven als je nog geen sesie heby met een password variabele
}
}

if(isset($_POST['submit'])){// kijken of loginform.html al gesubmit is
if((!empty($_POST['gebruikersnaam']))&&(!empty($_POST['wachtwoord']))){// controleren of 1 van de 2 velden niet leeg is
if ($dbc=@mysql_connect($server,$gebruiker,$wachtwoord)){// proberen verbinding te maken
if (!@mysql_select_db($db)){//Voor als er geen verbinding met de tabel in dedatabase gemaakt kan worden
die('

Kan de database niet selecteren.
Probeer het nogmaals of neem contact op met de systeem beheerder
Druk op de --> Vorige <-- toets om het opnieuw te proberen.
');
}
}else{//Voor als er geen verbinding met de database gemaakt kan worden
die('

Er kan geen verbinding gemaakt worden met de database
');
}
//De opgehaalde gegevens aan een variabele toewijzen.
$gebruiker=$_POST['gebruikersnaam'];
$qryOphalenInlogGegevens= "SELECT * FROM gebruikers WHERE NicknameGebruiker =('$gebruiker')";
//De opgehaalde gegevens aan een variabele toewijzen.

If ($r=mysql_query($qryOphalenInlogGegevens)){
// De opgehaalde waarde weergeven
while($rlogin = mysql_fetch_array($r)){
if($rlogin['WachtwoordGebruiker']===md5($_POST['wachtwoord'])){
// De waarde meegeven aan de sesie zodat de gegevens indien nodig gebruikt kunnen worden
$_SESSION['username']=$gebruiker;
$_SESSION['pass']=$rlogin['WachtwoordGebruiker'];
$_SESSION['naam']=$rlogin['NaamGebruiker'];
$_SESSION['adres']=$rlogin['AdresGebruiker'];
$_SESSION['postcode']=$rlogin['PostcodeGebruiker'];
$_SESSION['plaats']=$rlogin['PlaatsGebruiker'];
$_SESSION['telefoon']=$rlogin['TelefoonnummerGebruiker'];
$_SESSION['faxnummer']=$rlogin['FaxnummerGebruiker'];
$_SESSION['emailadres']=$rlogin['EmailAdresGebruiker'];
mysql_close();
print"$PHP_SELF";
}else{
mysql_close();
echo"

foutief wachtwoord
";
}
}
}
}else{//De tekst voor als een gebruikersnaam of wachtwoord of beide vergeten worden.
echo"

Vul een gebruikersnaam en een wachtwoord in anders kan u niet aangemeld worden.
";
}
}
?>


de vraag van mij ?

Is dit nu een velige methode.

En zijn er nog dingen waar ik op moet letten.

P.s. Ik weet dat er nog een logout ontbreekt maar ik wil eerst is weten hoe veilig de login is.

Met vriendelijke Groet,

Peter
kan je hem editten met <?php enz. er voor?
Ipv md5 kan je beter sha1 gebruiken, die is net wat veiliger. Verder word er eigenlijk niks gecontrolleerd in jou systeem. Verder worden jou $_POST's niet beveiligd.

Verder zet je _alles_ in een sessie, wat ook niet een van de handigste dingen is.

Ik heb eventjes snel wat in elkaar gezet, ook niet helemaal netjes en practisch maar het geeft wellicht wat ideeën.


<?php
    session_start();
    error_reporting(E_ALL);
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Inlog Systeem</title>
</head>
<body>
<H1>Welkom!</H1>

<?php
if(isset($_POST['login']))
{
	if(empty($_POST['gebruikersnaam']) || empty($_POST['wachtwoord']))
	{
		echo 'U moet wel alle velden invullen!';
		exit;
	}
	
	$dbserver 		= '';
	$dbgebruiker 	= '';
	$dbwachtwoord 	= '';
	$dbtabel		= '';

	$dbh = mysql_connect($dbserver, $dbgebruiker, $dbwachtwoord) or die
		("Sorry, we konden geen verbinding maken met de databaseserver! Controlleer je instellingen.");

	$db = mysql_select_db($dbtabel) or die
		("We konden wel verbinding maken met de databaseserver, alleen konden we de juiste database niet vinden!");
	
	$gebruikersnaam	= mysql_real_escape_string($_POST['gebruikersnaam']);
	$wachtwoord		= mysql_real_escape_string($_POST['wachtwoord']);	
		
	$query 		= "SELECT * FROM gebruikers WHERE gebruikersnaam = '".$gebruikersnaam."' AND wachtwoord = '".sha1($wachtwoord)."'";
	$resultaat 	= mysql_query($query) or die(mysql_error());
	
	if($resulaat && (mysql_num_rows($resultaat) == 1))
	{
		$rij = mysql_fetch_array($resultaat))
		$gebruikersID				= $rij['gebruikersID'];
   		$_SESSION['gebruikersID'] 	= $gebruikersID;   			
	}else{
		echo '<p>Uw gebruikersnaam en/of wachtwoord zijn niet correct!</p>';
	}
}else{
	
	?>
	<p>De volgende paginas zijn beveiligd en u dient hier in te loggen. Dat kan met uw eigen gebruikersnaam en wachtwoord.
	
	
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
	<table border="0" cellspacing="5" cellpadding="0">
		<tr>
			<td width="150"><label for="gebruikersnaam">Uw Gebruikersnaam:</label></td>
			<td><input type="text" title="Vul hier uw gebruikersnaam in." name="gebruikersnaam"></td>
		</tr>
		<tr>
			<td width="150">Uw Wachtwoord:</td>
			<td><input type="password" title="Vul hier uw wachtwoord in." name="wachtwoord"></td>
		</tr>
		<tr>
			<td></td>
			<td><input type="submit" value="Inloggen" name="login"></td>
		</tr>
	</table>
</form>

<?php	
}
?>

</body>
</html>


Kijk ook eens hoe ik het hier opgelost heb. Daar heb ik het nog mooier/veiliger met random strings, omgezet naar sha1() en in de database geschreven.
Mijn sessie probleem is opgelost.

Was een variabele aan het declareren die niet bestond stom he !!!

Arjan

Ziet er spannend uit weet alleen nog niet wat het allemaal betekend.

Wat misschien wel belangerijk is om te weten is dat ik dit puur als beveiliging wil hebben voor de informatie .mensen kunnen zich niet registreren of zo.

Diegene die erop gaan werken krijgen een Gebruikersnaam en wachtwoord van mij toegekend.
Peter graag je script posten als een script en niet als een tutorial ;)
Persoonlijk zie ik liever scripts in de database van een wat hoger niveau. Andere gaan jou systeem dan gebruiken en (persoonlijk) zou ik dat niet kunnen aanraden.
Sorry admin volledig mee eens
het zal niet meer voorkomen.

Arjan Kapteijn schreef op 25.03.2006 23:14
Persoonlijk zie ik liever scripts in de database van een wat hoger niveau. Andere gaan jou systeem dan gebruiken en (persoonlijk) zou ik dat niet kunnen aanraden.


Arjan dit vind ik een beetje jammer probeer een volledig zelf gemaakt scriptje te laten analyseren door de mensen met know how gebruik daar als basis een goed werkend mdbtje voor die ik werkend wil krijgen in deze voor mij nieuwe taal en ik wordt afgeschoten als of ik een ervaren script schrijver ben die beginners fouten maakt of lees ik je reactie nu verkeerd?????
Je leest mijn reactie verkeerd. Je moet tutorials, scriptdatabase en forum los van elkaar zien.

(onderstaande is wat ik zou willen zien, persoonlijke mening dus)

Het forum is bedoeld voor iedereen die hulp nodig heeft bij het bedenken, ontwerpen en bouwen van een script. Wat dat betreft ben jij een uitstekend voorbeeld van wat voor soort mensen ik het liefst zie.. Iemand die zelf moeite doet, dingen uitgezocht heeft en gewoon lekker aan de slag gaat. En jij hebt daarbij onze hulp nodig en dat is geweldig. Dat jou systeem niet helemaal perfect is, tja... iedereen moet het leren en daarbij help ik graag (in dit geval wellicht niet op een vriendelijke manier, ik verwijs jou naar andere voorbeelden... normaal zou ik zelf wat code verbeteren maar atm te druk met school).

De tutorial database (en scriptlibery) is bedoeld voor 'kennisoverdrag', persoon x legt aan andere uit hoe functie x werkt bijvoorbeeld. Of hoe je het beste een probleem kunt oplossen. Mensen (met vaak nog minder phpkennis dan jou) halen daar hun kennis vandaan. Om die kennis over te kunnen brengen moet je natuurlijk zelf wel die kennis hebben. Op dat moment ben JIJ namelijk de leraar die andere uit gaat leggen hoe iets werkt.

En zeg nou zelf... als jij op school Engels krijgt van de locale schoonmaken dan heb je echt een probleem. Om iemand iets uit te leggen moet je het namelijk zelf wel goed kunnen. Hetzelfde geld voor de scriptlibery, als je daar een script post die onveilig/niet goed is heb je een probleem. Andere copy-pasten dat script en gaan het gebruiken zonder dat zij weten dat het onveilig is.

Begrijp mij dus niet verkeer... Op het forum wil iedereen elkaar helpen. Maar je moet het forum en de script/tutorial -database los van elkaar zien.

Je hebt een bestand genaamd data.inc
Dat bestand met je password is voor iedereen te lezen. Gebruik nooit ,inc op het eind. Maak er bijvoorbeeld data.inc.php van, dan wordt ie eerst geparsed en dan is ie niet zomaar te lezen.

Reageren