webForumDet fria alternativet

Problem med inloggning

Databaser & SQL

15 svar · 708 visningar · startad av Guldstrand

Medlem sedan juli 20041 271 inlägg
Frågan#1

Försöker använda följande kod till en inloggning, (med aktiveringsmail).
Verkar dock inte få det att fungera, får bara "fel användarnamn eller lösenord".

Tacksam för all hjälp.

<?php
session_start(); // Alltid överst på sidan 
 
error_reporting(E_ALL); 
ini_set("display_errors", "1");
 
include "includes/mysql.php"; // Databasanslutningen
 
// Inloggning
if (isset($_POST['submit'])){ 
  $password = md5($_POST['losenord']);
  $epost = db_escape($_POST['epost']);
  $sql = "SELECT id, aktiv, losenord, epost FROM annonsorer
         WHERE epost='$epost'
         AND losenord='{$password}' AND aktiv = '1'";
  $result = mysql_query($sql) or die("SQL: $sql<br />" . mysql_error());
  //$aktiv = mysql_result($result, 0, 'aktiv'); 

  
  // Hittades inte användarnamn och lösenord
  // skicka till formulär med felmeddelande
  if (mysql_num_rows($result) == 0){
    header("Location: logga_in.php?badlogin=");
    exit;
  } 
 
// Är kontot inte aktiverat skicka personen till sida med info om att kontot inte är aktiverat  
  if ($result['aktiv'] == '0') {
    header("Location: ejaktiverat.php");
    exit;
  }
  
  // Sätt sessionen med unikt index
  $_SESSION['sess_id'] = mysql_result($result, 0, 'id');
  $_SESSION['sess_user'] = db_escape($_POST['epost']);
  header("Location: mitt_konto.php");
  exit; 
}
 
// Utloggning
if (isset($_GET['logout'])){
  session_unset();
  session_destroy();
  header("Location: index.php");
  exit;
}
?>
Medlem sedan juni 200032 967 inlägg
#2

Och när du kör sql-frågan för sig själv händer vad?

Medlem sedan juni 20014 421 inlägg
#3

Varför har du måsvingar runt password?

Medlem sedan juli 20041 271 inlägg
#4

@nders skrev:

Och när du kör sql-frågan för sig själv händer vad?

Jag körde frågan ...

// Inloggning 
if (isset($_POST['submit'])){ 
  $password = md5($_POST['losenord']); 
  $epost = db_escape($_POST['epost']); 
  $sql = "SELECT id, aktiv, losenord, epost FROM annonsorer 
         WHERE epost='$epost' 
         AND losenord='{$password}' AND aktiv = '1'"; 
  $result = mysql_query($sql) or die("SQL: $sql<br />" . mysql_error()); 
  //$aktiv = mysql_result($result, 0, 'aktiv');

i en "echo", och fick:

SELECT id, aktiv, losenord, epost FROM annonsorer WHERE epost='test@test.se' AND losenord='827ccb0eea8a706c4c34a16891f84e7b' = 'SELECT id, aktiv FROM annonsorer WHERE epost='test@test.se' AND losenord='827ccb0eea8a706c4c34a16891f84e7b''; Resource id #4 = mysql_query(SELECT id, aktiv, losenord, epost FROM annonsorer WHERE epost='test@test.se' AND losenord='827ccb0eea8a706c4c34a16891f84e7b') or die('SQL: SELECT id, aktiv, losenord, epost FROM annonsorer WHERE epost='test@test.se' AND losenord='827ccb0eea8a706c4c34a16891f84e7b'
' . mysql_error()); = mysql_result(Resource id #4, 0, 'aktiv);

colione skrev:

Varför har du måsvingar runt password?

Bra fråga... :r

Medlem sedan juni 200032 967 inlägg
#5

Snälla, skriv ut bara $sql, och exekvera den i något vettigt verktyg. Det är bara en massa php-kladd i dina inlägg... :(

Medlem sedan juli 20041 271 inlägg
#6

@nders skrev:

Snälla, skriv ut bara $sql, och exekvera den i något vettigt verktyg. Det är bara en massa php-kladd i dina inlägg... :(

Vadå "kladd"..?

Körde frågan direkt i phpmyadmin, och fick.

MySQL returnerade ett tomt resultat (dvs inga rader). (Frågan tog 0.0003 sek)

SELECT id, aktiv, losenord, epost
FROM annonsorer
WHERE epost = '$epost'
AND losenord = '$password'
AND aktiv = '1'
LIMIT 0 , 30

(Är fortfarande novis när det gäller php samt mysql.) :r

Medlem sedan juni 200032 967 inlägg
#7

skrev du verkligen ut frågan med echo? du har ju fortfarande php-variablerna i det du postar nu?

edit: php är kladd. våra ögon och hjärnor kan inte automatiskt parsa php-kod. punkt 3 i denna lista har gått dina ögon förbi - läs gärna resten också.

Medlem sedan juli 20041 271 inlägg
#8

Kan fortfarande inte logga in. :(

Användarnamn: test@test.nu
Lösenord: 12345
MD5: 06a2fcaaabeb16e45411d80f68f2df78

CREATE TABLE `annonsorer` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `admin` enum('ja','nej') NOT NULL default 'nej',
  `losenord` varchar(32) NOT NULL default '',
  `namn` varchar(50) NOT NULL default '',
  `gatuadress` varchar(50) NOT NULL default '',
  `postnummer` varbinary(10) NOT NULL default '',
  `ort` varchar(50) NOT NULL default '',
  `telefon` varchar(20) NOT NULL default '',
  `epost` varchar(50) NOT NULL default '',
  `ipadress` varchar(20) NOT NULL default '',
  `tillagd` datetime NOT NULL default '0000-00-00 00:00:00',
  `status` enum('väntar','godkänd') NOT NULL default 'väntar',
  `aktiv` int(11) NOT NULL default '0',
  `md5` varchar(32) NOT NULL default '',
  `link` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;

-- 
-- Data i tabell `annonsorer`
-- 

INSERT INTO `annonsorer` VALUES (12, 'nej', '12345', 'test', 'test', 0x3132333435, 'test', '12345', 'test@test.nu', 'min ipadress', '2008-01-15 14:12:30', 'godkänd', 1, '06a2fcaaabeb16e45411d80f68f2df78', 0);

Förstår inte varför. :(

Medlem sedan juni 20014 421 inlägg
#9

För att du kollar av din md5 mot lösenordsfältet i databasen och inte md5-fältet...sen kan man ju fundera på varför du ska hasha lösenordet men ändå spara det i klartext....

Medlem sedan juli 20041 271 inlägg
#10

colione skrev:

För att du kollar av din md5 mot lösenordsfältet i databasen och inte md5-fältet...sen kan man ju fundera på varför du ska hasha lösenordet men ändå spara det i klartext....

Som nämnt ovan, så är jag fortfarande rätt novis inom php och mysql, men jag försöker.

Är tacksam för hjälp med hur jag löser detta.

Medlem sedan juni 20014 421 inlägg
#11

du ändrar din sql-fråga så att frågan ställs mot md5-fältet.

Medlem sedan juli 20041 271 inlägg
#12

colione skrev:

du ändrar din sql-fråga så att frågan ställs mot md5-fältet.

Förstår det, men hur? :r
Det snurrar riktigt ordentligt i skallen just nu.

Medlem sedan juli 20011 222 inlägg
#13

Istället för

losenord = '$password'

skriver du

md5 = '$password'

i sql-satsen dvs. Eftersom du kör md5() på indatan från formuläret så kommer du per automatik inte få någon träff vid jämförelse.
När du kollar upp $password mot losenord gör det detsamma som att jämföra 06a2fcaaabeb16e45411d80f68f2df78 med 12345

Medlem sedan juli 20041 271 inlägg
#14

Ok! Nu har jag detta:

// Inloggning
if (isset($_POST['submit'])){ 

  $password = md5($_POST['losenord']);
  $epost = db_escape($_POST['epost']);

  $sql = "SELECT id, aktiv, md5, epost FROM annonsorer
         WHERE epost='$epost'
         AND md5='$password' 
         AND aktiv = '1'";
  $result = mysql_query($sql) or die("SQL: $sql<br />" . mysql_error());

Får dock fortfarande "fel användarnamn eller lösenord".

Guldstrand sliter sig i håret...

Medlem sedan juni 20014 421 inlägg
#15
  $sql = "SELECT id, aktiv, md5, epost FROM annonsorer 
         WHERE epost='$epost' 
         AND md5='$password' 
         AND aktiv = '1'"; 
  echo $sql;

Som vi bad dig om för ett tag sen.

Medlem sedan mars 20034 471 inlägg
#16

Guldstrand, det verkar som om du inte riktigt förstått det här med md5 och vitsen med att använda det. Det kan nog vara en del av ditt problem. Det du BÖR lagra i databasen är det krypterade lösenordet, INTE lösenordet. Dvs, man registrerar sig genom att fylla i någon form, tex:

Namn: ................... <-- Textfield name="user"
Losen: ................... <-- Textfield name="pass"
Epost: ................... <-- Textfield name="email"
//Och diverse annat

I din PHP-kod, när du tar hand om datat från formen så gör du bland annat:

$cryptPass = md5($_POST['pass']);  //Vilket du gör
//...
$sql = "INSERT INTO Users(Name, pass, email, ....) 
          VALUES ('".$_POST['user']."', '".$cryptPass."', '".$_POST['email']."', ...)"
//...

Dvs du måste lagra det krypterade lösenordet.

När du sedan vill logga in, har du en motsvarande form:
Namn: ................... <-- Textfield name="user"
Losen: ................... <-- Textfield name="pass"

När du ska se om lösenordet är rätt jämför du det (krypterade) lösenord du hämtar från databasen med $cryptPass som räknas ut likadant som i registreringssidan, nämligen:

$cryptPass = md5($_POST['pass']);

Jag gissar att ditt problem kan bero på att du antingen jämför ett krypterat lösenord mot ett okrypterat, eller ett krypterat med ett två gånger krypterat pga att du inte fattat HUR du ska använda md5. :)

Edit: La till ett gäng borttappade '.

329 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
204 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)