Categorieën >
PHP >
Simpel php loginsysteem
Onderwerp: Simpel php loginsysteem
Door: jasper56
Op: 08/02/2010 17:40
|
|
offline
|
Nieuw lid
|
Ik heb voor een opdracht een simpel loginsysteem gemaakt, maar omdat ik nog maar net begonnen ben met PHP en MySQL was ik benieuwd wat ik nog zou kunnen verbeteren.
Dit is de code die ik nu heb:
index.php
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST'){
//login
mysql_connect ("localhost", "root", "****") or die (mysql_error());
//echo" connected to MySQL<br />" ;
mysql_select_db("DB") or die (mysql_error());
//echo "Connect to DB<br />";
$username = strip_tags(mysql_real_escape_string($_POST['username']));
$password = strip_tags(mysql_real_escape_string($_POST['password']));
$password2 = strip_tags(mysql_real_escape_string($_POST['password']));
$password = md5('grootgeheim'.$password);
$password2 = sha1('grootgeheim'.$password2);
$resultc = mysql_query("select count(*) FROM users where username='$username' and password='$password' and password2='$password2' ") or die (mysql_error());
$res = mysql_result($resultc, 0);
//print_r($res);
if($res == 1) {
session_start();
$_SESSION['id'] = md5('ghjh78fgs53bghg5454bsio'.$username);
$result = mysql_query("SELECT * FROM users where username='$username' and password='$password' and password2='$password2' ") or die (mysql_error());
$row = mysql_fetch_array($result) or die (mysql_error());
$_SESSION['rights'] = $row['rights'];
if($row['rights'] == "1") $rights = "Gebruiker";
if($row['rights'] == "2") $rights = "Moderator";
if($row['rights'] == "3") $rights = "Administratotr";
echo "Username: ".$row['username']." <br /> \n";
echo "Password: ".$row['password']." <br /> \n";
echo "Password2: ".$row['password2']." <br /> \n";
echo "real_name: ".$row['real_name']." <br / \n>";
echo "Rights: ".$rights."<br /> \n";
echo "<br /> \n";
echo "Session value's<br /> \n";
echo "Session rights: ".$_SESSION['rights']."<br /> \n";
echo "Session ID: ".$_SESSION['id']."<br /> \n";
echo "<a href=\"logout.php\">Log out</a> \n";
}
else{
exit("Weg wezen");
}
}
else{
?>
<form id="loginform" method="post" action="">
Username: <input type="text" name="username" /><br />
Password: <input type="password" name="password" /><br />
<input type="submit" value="Login" />
<?php
}
?>
<?php if($_SERVER['REQUEST_METHOD'] == 'POST'){ //login //echo" connected to MySQL<br />" ; //echo "Connect to DB<br />"; $password = md5('grootgeheim'.$password); $password2 = sha1('grootgeheim'.$password2); $resultc = mysql_query("select count(*) FROM users where username='$username' and password='$password' and password2='$password2' ") or die (mysql_error()); //print_r($res); if($res == 1) { $_SESSION['id'] = md5('ghjh78fgs53bghg5454bsio'.$username); $result = mysql_query("SELECT * FROM users where username='$username' and password='$password' and password2='$password2' ") or die (mysql_error()); $_SESSION['rights'] = $row['rights']; if($row['rights'] == "1") $rights = "Gebruiker"; if($row['rights'] == "2") $rights = "Moderator"; if($row['rights'] == "3") $rights = "Administratotr"; echo "Username: ".$row['username']." <br /> \n"; echo "Password: ".$row['password']." <br /> \n"; echo "Password2: ".$row['password2']." <br /> \n"; echo "real_name: ".$row['real_name']." <br / \n>"; echo "Rights: ".$rights."<br /> \n"; echo "Session value's<br /> \n"; echo "Session rights: ".$_SESSION['rights']."<br /> \n"; echo "Session ID: ".$_SESSION['id']."<br /> \n"; echo "<a href=\"logout.php\">Log out</a> \n"; } else{ } } else{ ?> <form id="loginform" method="post" action=""> Username: <input type="text" name="username" /><br /> Password: <input type="password" name="password" /><br /> <input type="submit" value="Login" /> <?php } ?>
logout.php
<?php
session_start();
if(isset($_SESSION['id']) == 'true'){
if(session_destroy()){
echo "Session sucesfully destroid";
}
else{
echo "Can't destroy the session";
}
}
else{
echo "Not logged in";
}
?>
<?php if(isset($_SESSION['id']) == 'true'){ echo "Session sucesfully destroid"; } else{ echo "Can't destroy the session"; } } else{ } ?>
|
|
|
|
offline
|
PHP beginner
|
Zou je dit niet bij showcase neerzetten?
|
|
|
|
offline
|
Admin
|
@ jelmer, showcase is meer voor dingen die af zijn, niet zoals dit.
@ jasper, je kunt ook je eigen functie maken. Dat doe je zo
function naarDatabase($string){
$string = mysql_real_escape_string($string);
$string = strip_tags($string);
return $string;
}
function naarDatabase($string){ return $string; }
Dan vervolgens doe je gewoon
$username = naarDatabase($_POST['username']);
$username = naarDatabase($_POST['username']);
Met de rest natuurlijk ook. Waarom? Simpel. Stel je besluit nog iets te doen met alles wat je de database in schuift, dan hoef je alleen die functie aan te passen en dan word alles meteen goed gedaan. Hier maakt dat nog niet zoveel uit, maar als je heel veel dingen hebt, kun je die functie overal gebruiken, en dus heel snel alles veranderen door dat ene ding aan te passen
verder:
if(isset($_SESSION['id']) == 'true'){
// mag gewoon worden:
if(isset($_SESSION['id'])){
if(isset($_SESSION['id']) == 'true'){ // mag gewoon worden: if(isset($_SESSION['id'])){
Dan doe je ook "$row = mysql_fetch_array". Je kunt beter 'array' vervangen door 'assoc'. Assoc is sneller, en dan gebruik je het zo:
$row['kolomnaam']. Hetzelfde als nu dus. als je 'array' heb, werkt $row[0] en $row[3] enzo ook, maar die gebruik je niet dus dat remt onnodig af
Voor de rest ziet het er prima uit
|
Door: jasper56
Op: 08/02/2010 22:13
Laatste wijziging: 08/02/2010 22:20
|
|
offline
|
Nieuw lid
|
@martijn
dank je wel voor je reactie,
En is er misschien nog iets dat ik het beter kan beveiligen?? Had wel al het een en ander op internet opgezocht maar kon er niet echt goed uitkomen hoe ik het beter kan beveiligen.
edit,
Heb het nu toegepast, is nu het volgende geworden:
<?php
function naarDatabase($string){
$string = mysql_real_escape_string($string);
$string = strip_tags($string);
return $string;
}
if($_SERVER['REQUEST_METHOD'] == 'POST'){
//login
mysql_connect ("localhost", "root", "****") or die (mysql_error());
//echo" connected to MySQL<br />" ;
mysql_select_db("vanoeffelhaarlem") or die (mysql_error());
//echo "Connect to DB<br />";
$username = naarDatabase($_POST['username']);
$password = naarDatabase($_POST['password']);
$password2 = naarDatabase($_POST['password']);
$password = md5('grootgeheim'.$password);
$password2 = sha1('grootgeheim'.$password2);
$resultc = mysql_query("select count(*) FROM users where username='" . $username . "' and password='" . $password . "' and password2='" . $password2 . "' ") or die (mysql_error());
$res = mysql_result($resultc, 0);
//print_r($res);
if($res == 1) {
session_start();
$_SESSION['id'] = md5('ghjh78fgs53bghg5454bsio'.$username);
$result = mysql_query("SELECT * FROM users where username='".$username."' and password='".$password."' and password2='".$password2."' ") or die (mysql_error());
$row = mysql_fetch_assoc($result) or die (mysql_error());
$_SESSION['rights'] = $row['5'];
if($row['5'] == "1") $rights = "Gebruiker";
if($row['5'] == "2") $rights = "Moderator";
if($row['5'] == "3") $rights = "Administratotr";
echo "Username: ".$row['1']." <br /> \n";
echo "Password: ".$row['2']." <br /> \n";
echo "Password2: ".$row['3']." <br /> \n";
echo "real_name: ".$row['4']." <br / \n>";
echo "Rights: ".$rights."<br /> \n";
echo "<br /> \n";
echo "Session value's<br /> \n";
echo "Session rights: ".$_SESSION['rights']."<br /> \n";
echo "Session ID: ".$_SESSION['id']."<br /> \n";
echo "<a href=\"logout.php\">Log out</a> \n";
}
else{
exit("Weg wezen");
}
}
else{
?>
<form id="loginform" method="post" action="">
Username: <input type="text" name="username" /><br />
Password: <input type="password" name="password" /><br />
<input type="submit" value="Login" />
</form>
<?php
}
?>
<?php function naarDatabase($string){ return $string; } if($_SERVER['REQUEST_METHOD'] == 'POST'){ //login //echo" connected to MySQL<br />" ; //echo "Connect to DB<br />"; $username = naarDatabase($_POST['username']); $password = naarDatabase($_POST['password']); $password2 = naarDatabase($_POST['password']); $password = md5('grootgeheim'.$password); $password2 = sha1('grootgeheim'.$password2); $resultc = mysql_query("select count(*) FROM users where username='" . $username . "' and password='" . $password . "' and password2='" . $password2 . "' ") or die (mysql_error()); //print_r($res); if($res == 1) { $_SESSION['id'] = md5('ghjh78fgs53bghg5454bsio'.$username); $result = mysql_query("SELECT * FROM users where username='".$username."' and password='".$password."' and password2='".$password2."' ") or die (mysql_error()); $_SESSION['rights'] = $row['5']; if($row['5'] == "1") $rights = "Gebruiker"; if($row['5'] == "2") $rights = "Moderator"; if($row['5'] == "3") $rights = "Administratotr"; echo "Username: ".$row['1']." <br /> \n"; echo "Password: ".$row['2']." <br /> \n"; echo "Password2: ".$row['3']." <br /> \n"; echo "real_name: ".$row['4']." <br / \n>"; echo "Rights: ".$rights."<br /> \n"; echo "Session value's<br /> \n"; echo "Session rights: ".$_SESSION['rights']."<br /> \n"; echo "Session ID: ".$_SESSION['id']."<br /> \n"; echo "<a href=\"logout.php\">Log out</a> \n"; } else{ } } else{ ?> <form id="loginform" method="post" action=""> Username: <input type="text" name="username" /><br /> Password: <input type="password" name="password" /><br /> <input type="submit" value="Login" /> </form> <?php } ?>
|
Door: TotempaaltJ
Op: 09/02/2010 08:57
Laatste wijziging: 09/02/2010 09:06
|
|
offline
|
PHP interesse
|
Er klopt iets niet; waarom sla je het wachtwoord twee keer op in de database, een keer met sha1 en een keer met md5? Als iemand al je database hackt en hij krijgt een van deze wachtwoorden (kleine kans) weet hij ze dus allebei. Waarom twee opslaan?
Edit: or die (mysql_error()); gebruiken in een live script is niet zo handig, dan kunnen de gebruikers meteen zien wat de error is en daar eventueel misbruik van maken.
Ik zou het vervangen door een eigen error_report functie:
function ReportSQLError($error) {
$file = 'sqllog.txt';
$datetime = date("d/m/y H:i:s")
$logentry = "[" . $datetime . "] " . $error . "\n";
file_put_contents($file, $logentry, FILE_APPEND);
mail('jouw_email', 'MySQL Error in Login.php', $logentry);
}
function ReportSQLError($error) { $file = 'sqllog.txt'; $datetime = date("d/m/y H:i:s") $logentry = "[" . $datetime . "] " . $error . "\n"; file_put_contents($file, $logentry, FILE_APPEND); mail('jouw_email', 'MySQL Error in Login.php', $logentry); }
De mail-functie moet je even naar behoren aanpassen.
Wat dit doet is: Het schrijft de error en datum weg in het bestand sqllog.txt en mailt jou de error.
|
Door: Wave6
Op: 09/02/2010 09:25
|
|
offline
|
PHP beginner
|
Je moet niet aan andere programmeurs vragen of je code beter kan. Namelijk, het kan altijd beter! Hoe goed je ook programmeert! Er is altijd wel 1 slimmerik die het net even beter weet;)
|
|
|
|
offline
|
MySQL beginner
|
@D_O
Uit eindelijk is de code zo minimaal dat ie niet meer kleiner kan, en moeilijk te verbeteren is  en dan snap ik er niks meer van XD
offtopic: Altijd als ik zelf een ledensysteem maak.. gebruik ik Sessies inplaats van coockies.. Maar wat raden jullie nou eigenlijk aan?? Ikzelf vind Sessies echt heelrijk lopen.. maar brengt dit nou eigenlijk problemen met zich mee??
Om hier een discussie te voorkomen.. gelieve me een PB te sturen =)
|
Door: jasper56
Op: 09/02/2010 17:39
Laatste wijziging: 09/02/2010 17:41
|
|
offline
|
Nieuw lid
|
@TotempaaltJ
Dank je wel, ga ik zeker toepassen in me scripts, alleen waarom zou je het en mailen en opslaan in een .txt. Een hacker kan dan toch ook op zoek gaan naar me errorlogs? en hoe roep je jouw functie aan, gewoon zo: ReportSQLError(mysql_error());???
@D_O
Ik vraag of ik dit beter/anders kan doen omdat ik nog niet zo ervaren ben met php en ik graag wil weten hoe andere mensen dit doen.
|
Door: TotempaaltJ
Op: 09/02/2010 18:03
Laatste wijziging: 09/02/2010 18:06
|
|
offline
|
PHP interesse
|
jasper56 schreef: @TotempaaltJ
Dank je wel, ga ik zeker toepassen in me scripts, alleen waarom zou je het en mailen en opslaan in een .txt. Een hacker kan dan toch ook op zoek gaan naar me errorlogs? Je moet $file aanpassen naar een bestand dat niet in de home-directory van je website staat, dus als je website staat in /jasper56/http_files, hem bijv zetten in /jasper56/log.txt of /jasper56/logs/log.txt oid, dan kan een hacker er niet bij.
jasper56 schreef: en hoe roep je jouw functie aan, gewoon zo: ReportSQLError(mysql_error());??? Jup, helemaal perfect
jasper56 schreef: offtopic: Altijd als ik zelf een ledensysteem maak.. gebruik ik Sessies inplaats van coockies.. Maar wat raden jullie nou eigenlijk aan?? Ikzelf vind Sessies echt heelrijk lopen.. maar brengt dit nou eigenlijk problemen met zich mee?? Sessies, altijd! Cookies worden namelijk opgeslagen op de computer van de gebruiker en kan hij dus zomaar aanpassen en daarmee zichzelf bijv in Admin ofzo veranderen. Sessies worden, daarentegen, opgeslagen op de server en kan de gebruiker dus niet aanpassen.
Overigens maakt de sessie standaard ook gebruik van cookies, maar dan staat er maar een ding in: het unieke id van de sessie, zodat hij weet welke sessie hij moet hebben.
|
|
|
|
offline
|
Admin
|
onjuist van de sessies  sessie is ook een cookie. Alleen een heel stuk lastiger te bereiken. Iig niet voor de gemiddelde gebruiker
|
|
|
|
offline
|
Nieuw lid
|
wat is eigenlijk veiliger om te gebruiken, md5, sha1 of een combinatie van beide??
|
Je moet ingelogd zijn om een reactie te kunnen posten...
|
|
|