Avatar billede retake Nybegynder
22. januar 2008 - 09:12 Der er 11 kommentarer og
2 løsninger

Login samlignings problem

Ok jeg har et stort problem. Når jeg opretter en bruger på min hjemmeside og logger ind skal jeg huske upper and lower case. men jeg vil havde så man kan skrive både upper og lower case og logge ind. Kan nogle af jer hjælpe med det.

$username = $_POST['username'];
    $password = md5($_POST['password']);
   
    // if the username and / or password is empty report it to user and return
   
    if(!$username || !$password){
        Java::Alert("Du har ikke skrevet i alle felter");
        Java::GoToURL("../index.php?page=main");
        die;
    }
   
    // Searches the database for a user ho match the posted username
   
    $result = mysql_query("SELECT * FROM users WHERE username = '$username' LIMIT 1");
   
    // Loops through the result to match a user and password, then starts a session to keep them logged in
   
    while($r=mysql_fetch_assoc($result)){
   
        if(($r['username'] == $username) && ($r['password_crypto'] == $password)){
Avatar billede leif Seniormester
22. januar 2008 - 09:15 #1
Kig på http://dk.php.net/manual/da/function.strtolower.php

Det er den jeg plejer at bruge
Avatar billede phliplip Nybegynder
22. januar 2008 - 09:33 #2
Når du gemmer password i databasen skal du bruge md5(strtolower($password)).

Det samme gælder i login delen, $password = md5(strtolower($_POST['password']));

Ikke at jeg personligt anbefaler det, og du burde også overveje at bruge et salt.

Salt kan du finde mere om på nettet :)
Avatar billede phliplip Nybegynder
22. januar 2008 - 09:35 #3
I øvrigt.. hvorfor loope når du ved at du har max ét resultat - LIMIT 1...

if(mysql_num_rows($result)) {
  $r = mysql_fetch_assoc($result);
  if(($r['username'] == $username) && ($r['password_crypto'] == $password)){

  [...]
}
Avatar billede retake Nybegynder
22. januar 2008 - 09:36 #4
kunne også bare gøre sådan.

if((strtolower($r['username']) == strtolower($username)) && ($r['password_crypto'] == $password)){

man tak havde ikke lige tænkt over at bruge strtolower
Avatar billede retake Nybegynder
22. januar 2008 - 09:37 #5
hurtig spørsmål hvordan får jeg første bukstav til at være stort?! for nu står alt småt når men logger ind :)
Avatar billede pr1nsen Nybegynder
22. januar 2008 - 14:34 #6
det her burde gerne virke...

$navn = "peter";
$total_laengde = strlen($navn)-1;
$forbogstav = substr("$navn", 0, 1);
$resten = substr("$navn", 1, $total_laengde);

$forbogstav = strtoupper($forbogstav);
$navn = "$forbogstav$resten";
echo $navn;
Avatar billede phliplip Nybegynder
22. januar 2008 - 15:30 #7
Hvad med at bruge:

$navn = 'philip espersen';

ucfirst($navn);
// Philip espersen
eller

ucwords($navn);
// Philip Espersen
Avatar billede retake Nybegynder
22. januar 2008 - 20:27 #8
tak :P philiplip du fortjæner vis de points mange tak for hjælpen! :P
Avatar billede phliplip Nybegynder
23. januar 2008 - 00:26 #9
Syntes leif skal smide et svar, han var den første til at komme med et brugbart svar.
Avatar billede leif Seniormester
23. januar 2008 - 07:06 #10
phliplip -> Lad os dele

retake -> Du ville kun lave strtolower på brugernavnet ik ? Ellers bliver det et sikkerheds issue, da du så lige pludselig minimere antallet af mulige password.
Avatar billede phliplip Nybegynder
23. januar 2008 - 08:42 #11
leif: Så skidt da..

retake: Som leif siger, og som jeg også har anbefalet.

Password: Ingen streng manipulering, md5 med et salt. Evt. sha-2 (sha-512) kryptering, da der findes rainbow tabeller ude på nettet at en rimelig anseelig størrelse. Rainbow tabeller er databaser over md5 strenge og deres oprindelige værdi. Og derfor anbefales det også at du bruge et tilfældigt salt.

Username: Syntes jeg heller ikke du skal gøre lowercase, du skal bare gøre strengene lowercase i sammenlignings øjeblikket. Mener ikke at MySQL er casesensitive når man sammenligner - hæng mig ikke op på det. Men du kan bruge  LOWER(), for at være på den sikre side.

$result = mysql_query("SELECT * FROM users WHERE LOWER(username) = '" . strtolower($username) . "' LIMIT 1");

På den måde får du brugerens brugernavn på den måde som han oprindeligt skrev det, men sammenligner lowercase. Med f.eks. email-adresser ville jeg nok køre den igennem strtolower() inden jeg gemmer det i databasen, nu tænker jeg på hvis du bruger email adresse som login.

For at vende tilbage til salt; så kort fortalt genererer du en tilfældig værdi klistrer det ind i foran password og krypterer passwordet, med f.eks. md5 (husk hvad jeg sagde om SHA-2).
Derefter gemmer du den krypterede streng (hash-værdien hedder det rigtigt) og saltet i databasen for den enkelt bruger.

Når du så skal sammenligne tager du og finder brugeren, den SQL ovenover. Tager salt fra dataset'et og klistrer det ind foran brugerens indtastede password fra login, kører MD5 på den streng og sammenligner med den hash der ligger gemt ved brugeren i databasen. Er de ens er passwordet korrekt.
Avatar billede retake Nybegynder
23. januar 2008 - 09:15 #12
Hvem skulle havde de points :) jeg er lidt forviret.

Nå men det du siger er at jeg skal kryptere password med MD5 og så kryptere det igen med en forudbestemt kode?! eller fanger jeg den ikke rigtig?
Avatar billede phliplip Nybegynder
24. januar 2008 - 12:20 #13
<?php

$username = 'min@mail.dk';
$password = 'SuperHemmeligtPassword';
$salt = rand(100, 999);
// $salt bliver bedre hvis det en funktion der
// genererer tilfældige strenge, det må du selv finde

$hash = md5($salt . $password);

mysql_query("INSERT INTO users (id, username, password, salt) VALUES (null, '" . $username . "', '" . $password . "', '" . $salt . "')");

?>

<?php

$_POST['username'] = 'min@mail.dk';
$_POST['password'] = 'SuperHemmeligtPassword';

$result = mysql_query("SELECT id, password, salt FROM users WHERE username='" . $username . "' LIMIT 0,1");

if(mysql_num_rows($result)) {
  $user = mysql_fetch_assoc($result);
  if(md5($user['salt'] . $_POST['password']) == $user['password']) {
    echo 'Velkomen ' . $user['username'];
  } else {
    echo 'Forkert password!';
  }
} else {
  echo 'Ingen bruger med det username';
}

?>

Så har du vist også fået rigeligt for det 15 points :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester