Multidesk.be » Forums » PHP » Registreer script

  • Pagina
  • 1 van 1
0 gasten lezen dit onderwerp.
^ Onderwerp geschreven door BoeMan op maandag 23 november 2009 om 22:17:02.
BoeMan heeft nog geen avatar toegevoegd
Multiviteit: 154
Hallo allemaal,
vandaag heb ik het begin van een registreer-script geschreven en al mijn error's werken goed als er iets niet goed ingevuld is.
Alleen bij de wachtwoorden heb ik nog een probleem.
Het script controleert op, paswoord1 = paswoord 2, of de paswoordvelden ingevuld zijn, en normaal ook of ze langer als 5 tekens lang zijn.
Alleen bij het laatste loopt het mis.
Als ik bijvoorbeeld, 12345 als paswoord neem, lukt het wel.
Maar als ik Gijs123 neem, dan lukt het niet, terwijl dit duidelijk langer is dan 5 tekens;)
Is het probleem misschien dat ik geen 5 letters heb en ook geen 5 cijfers? Dit zou niet de bedoeling mogen zijn.
Dit is de code:
PHP
  1.  
  2. <?php
  3. require_once("includes/inc_database.php");
  4.  
  5. if($_SERVER['REQUEST_METHOD'] == 'POST' && $_POST['btnRegister']){
  6.  
  7.         $Username         = addslashes($_POST['txtUsername']);
  8.         $Email     = addslashes($_POST['txtEmail']);
  9.         $Password1        = addslashes($_POST['Password1']);
  10.         $Password2    = addslashes($_POST['Password2']);
  11.         $Joindate         = date("m.d.y");
  12.  
  13.  
  14.         $Error = "";
  15.         $err = false;
  16.         //username
  17.         if(empty($Username))    { $Error .= "Geef aub een gebruikersnaam op.<br>"; $err=true; }
  18.         $GetUser = @mysql_query("select `id` from {$Prefix}users where username='$Username'");
  19.         $GetUser2 = @mysql_num_rows($GetUser);
  20.         if($GetUser2 != 0){ $Error .= "Username is al in gebruik, kies een andere.<br>"; $err=true; }
  21.         //email
  22.         if(empty($Email))              { $Error .= "Geef aub uw E-mail adres op."; $err=true; }
  23.         $GetEmail = @mysql_query("select `id` from {$Prefix}users where email='$Email'");
  24.         $GetEmail2 = @mysql_num_rows($GetEmail);
  25.         if($GetEmail2 != 0){ $Error .= "E-mailadres is al geregistreerd.<br>"; $err=true; }
  26.         //wachtwoord
  27.         if(empty($Password1))   { $Error .= "Geef aub uw wachtwoord nogmaals op.<br>"; $err=true; }
  28.         if(empty($Password2))   { $Error .= "Bevestig aub uw wachtwoord.<br>"; $err=true; }
  29.         if($Password1 != $Password2) {$Error .= "Geef aub 2 dezelfde paswoorden op.<br>"; $err=true; }
  30.         if($Password1 <5) { $Error .= "Je paswoord moet minstens 5 characters bevatten<br>"; $err=true; }
  31.         $Password3 = md5(sha1('$Password1'));
  32.         //activatiecode
  33.         $code .= "";
  34.         for ($i = 0; $i < 10; $i++) {
  35.                 $code .= rand(0,9);
  36.         }
  37.        
  38.         if($err == false){     
  39.                         $InsertUser = mysql_query("insert into {$Prefix}users (username,email,password,joined, activation) values ('$Username', '$Email', '$Password3','$Joindate', '$code')");
  40.                 $msg = "Je bent succesvol geregistreerd.";
  41.         }
  42.        
  43.        
  44.         }
  45. ?>
  46.  
^ Reactie #1 geschreven door Simon op maandag 23 november 2009 om 23:17:20.
Simon's avatar
Multiviteit: 3742
Bij je check op de lengte van het wachtwoord gebruik je dit:
PHP
  1. <?php
  2.  
  3. if( $Password1 < 5 )
  4. {
  5. }
  6.  
  7. ?>

Hiermee kijk je enkel of de waarde van Password1 kleiner is dan 5. Een string of een getal kleiner dan 4 zal dus vanzelfsprekend zorgen voor een error of een false. Probeer bijvoorbeeld eens 1234 als wachtwoord om je ervan te overtuigen dat deze voorwaarde enkel checkt op de waarde en niet op de lengte.

Om de lengte van de ingegeven waarde te bekijken gebruik je de functie strlen(). Je code zou er dus zo moeten uitzien:
PHP
  1. <?php
  2.  
  3. if( strlen($Password1) < 5 )
  4. {
  5. }
  6.  
  7. ?>
^ Reactie #2 geschreven door BoeMan op dinsdag 24 november 2009 om 17:37:02.
BoeMan heeft nog geen avatar toegevoegd
Multiviteit: 154
Dankjewel, nu werkt het;)
^ Reactie #3 geschreven door BoeMan op woensdag 25 november 2009 om 16:09:38.
BoeMan heeft nog geen avatar toegevoegd
Multiviteit: 154
Hey allemaal,

hier ben ik weer, ik heb toch nog een merkwaardig foutje gevonden in het script en database.
Als ik met de onderstaande code een persoon registreer, dan komt die helemaal in de database te staan, maar elke user krijgt blijkbaar hetzelfde wachtwoord
Bijlage: 5652ab0e4b5a5dab8124f72231456041.jpg
En dat is natuurlijk niet helemaal de bedoeling:)

PHP
  1.  
  2. <?php
  3. require_once("includes/inc_database.php");
  4.  
  5. if($_SERVER['REQUEST_METHOD'] == 'POST' && $_POST['btnRegister']){
  6.  
  7.         $Username         = addslashes($_POST['txtUsername']);
  8.         $Email     = addslashes($_POST['txtEmail']);
  9.         $Password1        = addslashes($_POST['Password1']);
  10.         $Password2    = addslashes($_POST['Password2']);
  11.         $Joindate         = date("m.d.y");
  12.  
  13.  
  14.         $Error = "";
  15.         $err = false;
  16.        
  17.         //username
  18.         if(empty($Username))    { $Error .= "Geef aub een gebruikersnaam op.<br>"; $err=true; }
  19.         $GetUser = @mysql_query("select `id` from {$Prefix}users where username='$Username'");
  20.         $GetUser2 = @mysql_num_rows($GetUser);
  21.         if($GetUser2 != 0){ $Error .= "Username is al in gebruik, kies een andere.<br>"; $err=true; }
  22.        
  23.         //email
  24.         if(empty($Email))              { $Error .= "Geef aub uw E-mail adres op."; $err=true; }
  25.         $GetEmail = @mysql_query("select `id` from {$Prefix}users where email='$Email'");
  26.         $GetEmail2 = @mysql_num_rows($GetEmail);
  27.         if($GetEmail2 != 0){ $Error .= "E-mailadres is al geregistreerd.<br>"; $err=true; }
  28.        
  29.         //wachtwoord
  30.         if(empty($Password1))   { $Error .= "Geef aub uw wachtwoord nogmaals op.<br>"; $err=true; }
  31.         if(empty($Password2))   { $Error .= "Bevestig aub uw wachtwoord.<br>"; $err=true; }
  32.         if($Password1 != $Password2) {$Error .= "Geef aub 2 dezelfde paswoorden op.<br>"; $err=true; }
  33.         if(strlen($Password1) <5) { $Error .= "Je paswoord moet minstens 5 characters bevatten<br>"; $err=true; }
  34.         $Password3 = md5(sha1('$Password1'));
  35.        
  36.         //activatiecode
  37.         $code .= "";
  38.         for ($i = 0; $i < 10; $i++) {
  39.                 $code .= rand(0,9);
  40.         }
  41.        
  42.         if($err == false){     
  43.                         $InsertUser = mysql_query("insert into {$Prefix}users (username,email,password,joined, activation) values ('$Username', '$Email', '$Password3','$Joindate', '$code')");
  44.                 $msg = "Je bent succesvol geregistreerd.";
  45.         }
  46.        
  47.        
  48.         }
  49. ?>
  50.  
^ Reactie #4 geschreven door BoeMan op woensdag 25 november 2009 om 17:03:45.
BoeMan heeft nog geen avatar toegevoegd
Multiviteit: 154
Ik denk dat het opgelost is door
PHP
  1.  
  2. $Password3 = md5(sha1('$Password1'));
  3.  

te vervangen door:
PHP
  1.  
  2. $Password3 = md5(sha1($_POST['$Password1']));
  3.  


is dit de juiste oplossing?
^ Reactie #5 geschreven door Kilian op woensdag 25 november 2009 om 18:53:03.
Kilian heeft nog geen avatar toegevoegd
Multiviteit: 1629
Neen, met het eerste hash je $Password1 als string. Iedereen zal dus hetzelfde wachtwoord krijgen.

Met het 2de zou je het ook kunnen oplossen, maar heb je je wachtwoord niet beveiligd met addslashes. Het correcte zou zijn:
PHP
  1. $Password3 = md5(sha1($Password1));


In het begin maak je $Password1 aan. Dit is je POST waarde met addslashes. Deze moet je dan ook hashen.

Moest het niet werken dan laat je maar iets weten!
Kilian
^ Reactie #6 geschreven door Martijn op donderdag 26 november 2009 om 21:51:25.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Overigens, een MD5 van een SHA1 hash maakt je encryptie niet veiliger, aangezien de kans op botsingen even groot blijft als wanneer je enkel MD5() gebruikt. Je kan die MD5() er dus gerust uitlaten ;-).

Waarom zou je overigens een MD5-hash willen van een ge-escapede string? Lijkt mij logischer om daar helemaal geen addslashes() op uit te voeren :-).
Met vriendelijke groeten,
Martijn Wouters
^ Reactie #7 geschreven door Kilian op donderdag 26 november 2009 om 22:17:28.
Kilian heeft nog geen avatar toegevoegd
Multiviteit: 1629
Is het door een dubbele hash uit te voeren niet lastiger om dmv rainbow tables en brute force het wachtwoord te kraken?
^ Reactie #8 geschreven door Martijn op vrijdag 27 november 2009 om 16:07:04.
Martijn heeft nog geen avatar toegevoegd
Multiviteit: 13785
Beheerder
Je hoeft het originele wachtwoord niet te hebben, je moet gewoon een string hebben die een exacte match oplevert :).
Met vriendelijke groeten,
Martijn Wouters
^ Reactie #9 geschreven door BoeMan op zaterdag 28 november 2009 om 22:09:31.
BoeMan heeft nog geen avatar toegevoegd
Multiviteit: 154
Hier ben ik weer, het registreren is volledig opgelost. Maar nu zit ik met een login probleem. Ik heb zelf een scriptje proberen te schrijven maar er zit blijkbaar nog een fout op lijn 20, unexpected ';', maar die vind ik toch niet direct.

login.php
PHP
  1.  
  2. <title>Mydream.com - login</title>
  3. <?php
  4. require_once("includes/inc_database.php");
  5.  
  6. $username = $_POST['username'];
  7. $password = sha1($_POST['wachtwoord']);
  8.  
  9. $check =("SELECT * FROM {$prefix}users WHERE username='".$username."' AND password='".$password."'");
  10. $result = mysql_query($check);
  11. $check_rows = mysql_num_rows($result);
  12. if ($check_rows < 1){
  13.         $Error = "This combination of username and password doesn't exist. Possible solutions:
  14.         - You are not registerd.
  15.         - Your account is not activated.";
  16.                                         }
  17.         if($Error =""){
  18.         $object = mysql_fetch_object($check);
  19.                                 $_SESSION['username']=$username;
  20.                                 $_SESSION['activation']=$object->activation;
  21.                             $_SESSION['hash']=(sha1($_SESSION['username'].$_SESSION['activation'].$_SERVER['REMOTE_ADDR']);
  22.                                 header("location:?page=profile");
  23.                                    }else{
  24.                                            echo $Error
  25.                                    }
  26. ?>
  27. <form name="loginform" method="post" action="?page=profile">
  28.   <table width="300" border="0" cellpadding="0" cellspacing="0">
  29.     <tr>
  30.       <td width="210">Username:</td>
  31.       <td>
  32.         <input name="username" type="text" id="username"></td></tr>
  33.     <tr>
  34.       <td>&nbsp;</td>
  35.       <td>&nbsp;</td>
  36.     </tr>
  37.     <tr>
  38.       <td>Password:</td>
  39.       <td>
  40.         <input name="password" type="password" id="password"></td></tr>
  41.     <tr>
  42.       <td>&nbsp;</td>
  43.       <td>&nbsp;</td>
  44.     </tr>
  45.     <tr>
  46.       <td>&nbsp;</td>
  47.       <td>
  48.         <input type="submit" name="submit" value="Login" /></td>
  49.     </tr>
  50.   </table>
  51. </form>
  52.  


functions.php
PHP
  1.  
  2. <?php
  3. function logged_in();
  4. global $_SESSION;
  5.         if ($_SESSION['hash'] && $_SESSION['username'] && $_SESSION['password']) {
  6.                
  7.                         if ($_SESSION['hash'] == sha1($_SESSION['username'].$_SESSION['activation']).$_SERVER['REMOTE_ADDR'])) {
  8.                                 return true;
  9.                         } else {
  10.                                 return false;
  11.                         }
  12.  
  13.         } else {
  14.        
  15.                 return false;
  16.                
  17.         }
  18. }
  19.  
  20. ?>
  21.  


Ik hoop dat iemand mijn vraag kan beantwoorden en misschien nog andere eventuele fouten melden:)

Mvg Gijs

Edit: verdorie, dit moest waarschijnlijk een nieuwe topic zijn.
Deze tekst werd het laatst bewerkt voor 1.45 % door BoeMan op zaterdag 28 november 2009 om 22:10:10.
  • Pagina
  • 1 van 1

Snel-antwoordformulier
Toon uitgebreid antwoordformulier Bericht nalezen Bericht plaatsen