login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Simpel php loginsysteem

Offline jasper56 - 08/02/2010 17:40
Avatar van jasper56Nieuw 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
  1. <?php
  2.  
  3. if($_SERVER['REQUEST_METHOD'] == 'POST'){
  4. //login
  5. mysql_connect ("localhost", "root", "****") or die (mysql_error());
  6. //echo" connected to MySQL<br />" ;
  7. //echo "Connect to DB<br />";
  8.  
  9. $username = strip_tags(mysql_real_escape_string($_POST['username']));
  10. $password = strip_tags(mysql_real_escape_string($_POST['password']));
  11. $password2 = strip_tags(mysql_real_escape_string($_POST['password']));
  12.  
  13. $password = md5('grootgeheim'.$password);
  14. $password2 = sha1('grootgeheim'.$password2);
  15.  
  16. $resultc = mysql_query("select count(*) FROM users where username='$username' and password='$password' and password2='$password2' ") or die (mysql_error());
  17. $res = mysql_result($resultc, 0);
  18.  
  19. //print_r($res);
  20.  
  21.  
  22. if($res == 1) {
  23. $_SESSION['id'] = md5('ghjh78fgs53bghg5454bsio'.$username);
  24. $result = mysql_query("SELECT * FROM users where username='$username' and password='$password' and password2='$password2' ") or die (mysql_error());
  25. $row = mysql_fetch_array($result) or die (mysql_error());
  26.  
  27. $_SESSION['rights'] = $row['rights'];
  28.  
  29. if($row['rights'] == "1") $rights = "Gebruiker";
  30. if($row['rights'] == "2") $rights = "Moderator";
  31. if($row['rights'] == "3") $rights = "Administratotr";
  32.  
  33.  
  34.  
  35. echo "Username: ".$row['username']." <br /> \n";
  36. echo "Password: ".$row['password']." <br /> \n";
  37. echo "Password2: ".$row['password2']." <br /> \n";
  38. echo "real_name: ".$row['real_name']." <br / \n>";
  39. echo "Rights: ".$rights."<br /> \n";
  40. echo "<br /> \n";
  41. echo "Session value's<br /> \n";
  42. echo "Session rights: ".$_SESSION['rights']."<br /> \n";
  43. echo "Session ID: ".$_SESSION['id']."<br /> \n";
  44. echo "<a href=\"logout.php\">Log out</a> \n";
  45.  
  46.  
  47.  
  48. }
  49.  
  50. else{
  51. exit("Weg wezen");
  52. }
  53. }
  54. else{
  55. ?>
  56.  
  57. <form id="loginform" method="post" action="">
  58. Username: <input type="text" name="username" /><br />
  59. Password: <input type="password" name="password" /><br />
  60. <input type="submit" value="Login" />
  61.  
  62. <?php
  63. }
  64. ?>


logout.php
  1. <?php
  2.  
  3. if(isset($_SESSION['id']) == 'true'){
  4. echo "Session sucesfully destroid";
  5. }
  6. else{
  7. echo "Can't destroy the session";
  8. }
  9. }
  10. else{
  11. echo "Not logged in";
  12. }
  13.  
  14. ?>

15 antwoorden

Gesponsorde links
Offline Jelmerholland - 08/02/2010 19:25
Avatar van Jelmerholland PHP beginner Zou je dit niet bij showcase neerzetten?
Offline Martijn - 08/02/2010 19:37
Avatar van Martijn Crew PHP @ jelmer, showcase is meer voor dingen die af zijn, niet zoals dit.

@ jasper, je kunt ook je eigen functie maken. Dat doe je zo
  1. function naarDatabase($string){
  2. $string = mysql_real_escape_string($string);
  3. $string = strip_tags($string);
  4. return $string;
  5. }

Dan vervolgens doe je gewoon
  1. $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:
  1. if(isset($_SESSION['id']) == 'true'){
  2. // mag gewoon worden:
  3. 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
Bedankt door: jasper56
Offline jasper56 - 08/02/2010 22:13 (laatste wijziging 08/02/2010 22:20)
Avatar van jasper56 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:
  1. <?php
  2.  
  3.  
  4. function naarDatabase($string){
  5. $string = mysql_real_escape_string($string);
  6. $string = strip_tags($string);
  7. return $string;
  8. }
  9.  
  10. if($_SERVER['REQUEST_METHOD'] == 'POST'){
  11. //login
  12.  
  13. mysql_connect ("localhost", "root", "****") or die (mysql_error());
  14. //echo" connected to MySQL<br />" ;
  15. mysql_select_db("vanoeffelhaarlem") or die (mysql_error());
  16. //echo "Connect to DB<br />";
  17.  
  18. $username = naarDatabase($_POST['username']);
  19. $password = naarDatabase($_POST['password']);
  20. $password2 = naarDatabase($_POST['password']);
  21.  
  22. $password = md5('grootgeheim'.$password);
  23. $password2 = sha1('grootgeheim'.$password2);
  24.  
  25. $resultc = mysql_query("select count(*) FROM users where username='" . $username . "' and password='" . $password . "' and password2='" . $password2 . "' ") or die (mysql_error());
  26. $res = mysql_result($resultc, 0);
  27.  
  28. //print_r($res);
  29.  
  30.  
  31. if($res == 1) {
  32. $_SESSION['id'] = md5('ghjh78fgs53bghg5454bsio'.$username);
  33. $result = mysql_query("SELECT * FROM users where username='".$username."' and password='".$password."' and password2='".$password2."' ") or die (mysql_error());
  34. $row = mysql_fetch_assoc($result) or die (mysql_error());
  35.  
  36. $_SESSION['rights'] = $row['5'];
  37.  
  38. if($row['5'] == "1") $rights = "Gebruiker";
  39. if($row['5'] == "2") $rights = "Moderator";
  40. if($row['5'] == "3") $rights = "Administratotr";
  41.  
  42.  
  43.  
  44. echo "Username: ".$row['1']." <br /> \n";
  45. echo "Password: ".$row['2']." <br /> \n";
  46. echo "Password2: ".$row['3']." <br /> \n";
  47. echo "real_name: ".$row['4']." <br / \n>";
  48. echo "Rights: ".$rights."<br /> \n";
  49. echo "<br /> \n";
  50. echo "Session value's<br /> \n";
  51. echo "Session rights: ".$_SESSION['rights']."<br /> \n";
  52. echo "Session ID: ".$_SESSION['id']."<br /> \n";
  53. echo "<a href=\"logout.php\">Log out</a> \n";
  54.  
  55.  
  56.  
  57. }
  58.  
  59. else{
  60. exit("Weg wezen");
  61. }
  62. }
  63. else{
  64. ?>
  65.  
  66. <form id="loginform" method="post" action="">
  67. Username: <input type="text" name="username" /><br />
  68. Password: <input type="password" name="password" /><br />
  69. <input type="submit" value="Login" />
  70. </form>
  71. <?php
  72. }
  73. ?>
Offline TotempaaltJ - 09/02/2010 08:57 (laatste wijziging 09/02/2010 09:06)
Avatar van TotempaaltJ 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:
  1. function ReportSQLError($error) {
  2. $file = 'sqllog.txt';
  3. $datetime = date("d/m/y H:i:s")
  4. $logentry = "[" . $datetime . "] " . $error . "\n";
  5. file_put_contents($file, $logentry, FILE_APPEND);
  6. mail('jouw_email', 'MySQL Error in Login.php', $logentry);
  7. }

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. 
Bedankt door: jasper56
Offline Wave6 - 09/02/2010 09:25
Avatar van Wave6 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;)
Bedankt door: nathanael
Offline larssy1 - 09/02/2010 15:52
Avatar van larssy1 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 =)
Offline jasper56 - 09/02/2010 17:39 (laatste wijziging 09/02/2010 17:41)
Avatar van jasper56 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.

Offline TotempaaltJ - 09/02/2010 18:03 (laatste wijziging 09/02/2010 18:06)
Avatar van TotempaaltJ 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.
Bedankt door: jasper56
Offline Martijn - 09/02/2010 19:23
Avatar van Martijn Crew PHP onjuist van de sessies sessie is ook een cookie. Alleen een heel stuk lastiger te bereiken. Iig niet voor de gemiddelde gebruiker
Offline jasper56 - 09/02/2010 19:37
Avatar van jasper56 Nieuw lid wat is eigenlijk veiliger om te gebruiken, md5, sha1 of een combinatie van beide??
Offline Martijn - 09/02/2010 19:39
Avatar van Martijn Crew PHP sha1(). Mogelijk sha1(md5('string'), maar dat weet ik niet zeker
Offline TotempaaltJ - 09/02/2010 22:50
Avatar van TotempaaltJ PHP interesse
Martijn schreef:
onjuist van de sessies sessie is ook een cookie. Alleen een heel stuk lastiger te bereiken. Iig niet voor de gemiddelde gebruiker
Een sessie is een cookie op de server. Dus niet precies hetzelfde 
Voor mijn weten is sha1() het veiligst, en is dat nog niet gehackt, maar volgens mij is dat ook zo met md5... 
Offline larssy1 - 10/02/2010 09:28
Avatar van larssy1 MySQL beginner md5 werkt perfect bij mij, dus waarom zou je 'm niet gebruiken...

Het is een codering die na mijn weten nog niet mogelijk is om de md5 hash te converten naar het oorspronlijke woord..

Om terug te komen op je code..
Het enigste wat je dan eventueel zou kunnen veranderen is een function maken zoals eerder is gezegt voor regel 10 t/m 12

@sessies
Ja dus sessies veiligst opzich.. maar het nare is dat de sessie variablen af en toe verkeerd behandeld bij mij.. Ik kan bijv. $_SESSIE['naam'] een nieuwe waarde geven, maar af en toe geeft hij toch nog de oude waarde weer.
Offline jasper56 - 10/02/2010 16:24 (laatste wijziging 10/02/2010 19:59)
Avatar van jasper56 Nieuw lid heb me code aangepast, heb een aantal functie's gemaakt en een config bestand. Ben benieuwd wat jullie er van vinden.

index.php
  1. <?php
  2.  
  3. /**
  4.  * @author Jasper van Oeffel
  5.  * @copyright 2010
  6.  */
  7.  
  8.  
  9.  
  10. require_once('inc/config.php');
  11. require_once('inc/functions.php');
  12.  
  13. if($_SERVER['REQUEST_METHOD'] == 'POST'){
  14. //login
  15.  
  16. if(!setupDatabaseConnection()) die("Couldn't connect to the database");
  17.  
  18. $username = toDatabase($_POST['username']);
  19. $password = sha1('grootgeheim'.toDatabase($_POST['password']));
  20.  
  21. $resultc = mysql_query("select count(*) FROM users where username='" . $username . "' and password='" . $password . "' ") or die (ReportSQLError(mysql_error()));
  22. $res = mysql_result($resultc, 0);
  23.  
  24. //print_r($res);
  25.  
  26.  
  27. if($res == 1) {
  28. $_SESSION['id'] = md5('ghjh78fgs53bghg5454bsio'.$username);
  29. $result = mysql_query("SELECT * FROM users where username='".$username."' and password='".$password."' ") or die (ReportSQLError(mysql_error()));
  30. $row = mysql_fetch_assoc($result) or die (ReportSQLError(mysql_error()));
  31.  
  32. $_SESSION['rights'] = $row['rights'];
  33. $_SESSION['username'] = $row['username'];
  34. $_SESSION['real_name'] = $row['real_name'];
  35. $_SESSION['email'] = $row['email'];
  36.  
  37. if($row['rights'] == "1") $rights = "Gebruiker";
  38. if($row['rights'] == "2") $rights = "Moderator";
  39. if($row['rights'] == "3") $rights = "Administratotr";
  40.  
  41. echo "Username: ".$row['username']." <br /> \n";
  42. echo "Password: ".$row['password']." <br /> \n";
  43. echo "real_name: ".$row['real_name']." <br / \n>";
  44. echo "Rights: ".$rights."<br /> \n";
  45. echo "<br /> \n";
  46. echo "Session value's<br /> \n";
  47. echo "Session username: ".$_SESSION['username']."<br />\n";
  48. echo "Session real_name: ".$_SESSION['real_name']."<br />\n";
  49. echo "Session email: ".$_SESSION['email']."<br />\n";
  50. echo "Session rights: ".$_SESSION['rights']."<br /> \n";
  51. echo "Session ID: ".$_SESSION['id']."<br /> \n";
  52. echo "<a href=\"user_list.php\">User list</a><br /> \n";
  53. echo "<a href=\"logout.php\">Log out</a> \n";
  54.  
  55.  
  56. }
  57.  
  58. else{
  59. exit("Incorrect login");
  60. }
  61. }
  62. else{
  63. ?>
  64.  
  65. <form id="loginform" method="post" action="">
  66. Username: <input type="text" name="username" /><br />
  67. Password: <input type="password" name="password" /><br />
  68. <input type="submit" value="Login" />
  69. </form>
  70. <?php
  71. }
  72. ?>


config.php
  1. <?php
  2.  
  3. /**
  4.  * @author Jasper van Oeffel
  5.  * @copyright 2010
  6.  */
  7.  
  8. define("WEBMASTER_EMAIL", "je@email");
  9. define("HOME","http://mijndomein.nl/");
  10. //don't display error's
  11. //error_reporting(0);
  12.  
  13. //show all error's
  14.  
  15.  
  16. /**
  17.  * define's for the MySQL database
  18.  */
  19. define("DB_SERVER", "localhost");
  20. define("DB_USER", "root");
  21. define("DB_PASS", "evenWeggehaald");
  22. define("DB_NAME", "evenWeggehaald");
  23.  
  24. ?>


functions.php
  1. <?php
  2.  
  3. /**
  4.  * @author Jasper van Oeffel
  5.  * @copyright 2010
  6.  */
  7.  
  8. /**
  9.  * funtion to make database input safer
  10.  */
  11. function toDatabase($string){
  12. $string = mysql_real_escape_string($string);
  13. $string = strip_tags($string);
  14. return $string;
  15. }
  16.  
  17. /**
  18.  * function to repport MySQL error's to the webmaster
  19.  */
  20. function ReportSQLError($error) {
  21. $file = 'sqllog.php';
  22. $datetime = date("d/m/y H:i:s");
  23. $logentry = "[".$datetime."] ".$error."\n";
  24. file_put_contents($file, $logentry, FILE_APPEND);
  25. mail('jasper@vanoeffelhaarlem.nl', 'MySQL Error in Login.php', $logentry);
  26. return "There was an error with the MySQL database, the webmaster is informed";
  27. }
  28.  
  29. /**
  30.  * function that setup's a connection to the MySQL database
  31.  */
  32. function setupDatabaseConnection(){
  33. if((!mysql_connect(DB_SERVER, DB_USER, DB_PASS))||(!mysql_select_db(DB_NAME)))return false;
  34. else return true;
  35. }
  36.  
  37. /**
  38.  * function to secure the webpage
  39.  */
  40. function checkLogin($rights){
  41. if(isset($_SESSION['id'])){
  42. if($_SESSION['rights'] >= $rights) return true;
  43. else return false;
  44. }
  45. else return false;
  46. }
  47. ?>


beveiligde pagina
  1. <?php
  2.  
  3. /**
  4.  * @author Jasper van Oeffel
  5.  * @copyright 2010
  6.  */
  7.  
  8. require_once('inc/config.php');
  9. require_once('inc/functions.php');
  10. if(!checkLogin("2")) die("Good by");
  11. else echo "Welcome to the website";
  12. ?>
Offline TotempaaltJ - 10/02/2010 18:16
Avatar van TotempaaltJ PHP interesse Hmm, misschien kan je die beveiligde pagina ook nog loggen als er niet voldoende rights voor hebt, maar dan met een error als "Hacker Attempt by (ip-adres)". Dan zou je de ReportSQLError functie moeten veranderen in ReportError en nog een paar dingen daar moeten aanpassen (niet perse natuurlijk), maar het is altijd handig om zoveel mogelijk wat niet hoort te loggen; je zou in principe niet op die pagina moeten komen, dus dat is wss een hack poging 

Verder vind ik het een heel mooi script, mooier dan wat ik maak XD
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.302s