Avatar billede DePlex Nybegynder
23. april 2011 - 14:15 Der er 7 kommentarer

tabel = 1 selvom den er 0?

Jeg har mit login hvor man skal have aktiveret sin account. Dette gøres ved at et nummer i min tabel bliver ændret fra 0 til 1, men selvom mit felt er = 0 bliver jeg logget ind. Her er min kode:

<?php
function getDBH() {
    static $DBH = null;
    if (is_null($DBH)) {
        $DBH = new mysqli('', '', '', '');
    }
    if (mysqli_connect_errno()) {
    printf('Connecting error');
    exit();
}else{
    return $DBH;
}
}
function login($mail, $pass){
    $dbh = getDBH();
    functions('varSec');
    if (preg_match ('%^[A-Za-z0-9._\%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$%', security($mail))) {
        functions('passSec');
        $pass = security(passSec($pass));
$stmt = $dbh->prepare('SELECT `id`, `navn`, `pass`, `mail`, `admin`, `ip`, `aktivering` FROM users WHERE mail = ? AND pass = ?');
  $stmt->bind_param('ss', $mail, $pass);
  $stmt->execute();
    $stmt->store_result();
    if($stmt->num_rows == 1){
    $stmt->bind_result($id, $navn, $pass, $mail, $admin, $ip, $aktiveret);
      $stmt->fetch();
      $stmt->free_result();
      if(isset($id, $navn, $pass, $mail, $admin, $ip, $aktiveret)){
          if($aktiveret == 1){
              functions('ipTjek');
              $ipTjek = ipTjek($_SERVER['REMOTE_ADDR'], $_SERVER['REMOTE_ADDR']);
              if($ipTjek == 'Accepted'){
                  functions('adminTjek');
              $rank = adminTjek($mail, $admin);
              $info = array('Rank'=>$rank, 'Ip'=>$_SERVER['REMOTE_ADDR'], 'Navn'=>$navn, 'Mail'=>$mail, 'Id'=>$id);
              unset($pass);
              return $info;
              }else{
              functions('errorTjek');
              return $error = error('ipError'); 
              }
          }else{
          functions('errorTjek');
          return $error = error('aktiveringsError');
          }
      }else{
      functions('errorTjek');
      return $error = error('stringError');
      }
    }else{
    functions('errorTjek');   
    return $error = error('noMatch');
    }
    }else{
    functions('errorTjek');
    return $error = error('emailError');
   
    }
}
?>

Hvad er fejlen? Og hvad kan jeg ellers gøre for at optimere og gør min kode mere sikker.

//DePlex
Avatar billede intenz Novice
23. april 2011 - 15:17 #1
Det er vel ikke så mærkeligt siden du ikke tjekker feltet i tabellen?

$stmt = $dbh->prepare('SELECT `id`, `navn`, `pass`, `mail`, `admin`, `ip`, `aktivering` FROM users WHERE mail = ? AND pass = ?');
Avatar billede DePlex Nybegynder
23. april 2011 - 16:21 #2
Det gør jeg da. Det er aktivering som ændres fra 0 til 1.
Avatar billede mediman Nybegynder
23. april 2011 - 23:04 #3
Når man fejlfinder er det altid en god ide at teste på variablers aktuelle værdi. Den kan ofte vise sig at være anderledes end 'jamen jeg troede da ...'

I det aktuelle tilfælde kan du jo f.eks. prøve med echo $aktiveret umiddelbart inden if($aktiveret == 1){ for at se hvilken værdi $aktiveret reelt har efter SELECT sætningen.

I det mindste giver det et fingerpeg om hvor fejlen skal søges.
Avatar billede DePlex Nybegynder
24. april 2011 - 08:09 #4
Når jeg prøver at udksrive den, kommer der intet. Det vil sige, at den ikke er sat. Men hvorfor, er den ikke det? Man får jo automatisk error, hvis der er eventuelle stavefejl i ens sql, når man bruger mysqli.
Avatar billede wanze Nybegynder
25. april 2011 - 06:39 #5
Med den smule kode du har smidt er det ikke til at sige, hvad problemet er, men hvis $aktiveret ikke er sat, så bliver følgende kode vel udført:

}else{
functions('errorTjek');
return $error = error('aktiveringsError');
}

Derudover er der ikke så meget vi kan sige om det. Først og fremmest fordi vi ikke ved, hvad dine to metoder functions() og error() returnerer, og endnu vigtigere, hvordan du kontrollerer om en bruger er logget ind vha. login()-funktionen. Hvad er kriteriet for, at de er logget ind? Hvis error('aktiveringsError' returnerer en streng med teksten "Error", og du kontrollerer om brugeren er logget ind med

if (login($mail, $pass)) { print "Logget ind"; }

så vil der jo blive udskrevet "Logget ind" selvom oplysningerne er forkerte, idet login($mail, $pass) vil blive evalueret til strengen "Error".

Du kan sandsynligvis ikke få mere hjælp med de sparsomme informationer du kommer med.
Avatar billede DePlex Nybegynder
25. april 2011 - 11:15 #6
Jeg har selv givet op så jeg poster lige resten af min kode. Altså functionen error er bare en function der giver en string med en error message. Her er min kode som kører functionen login:

<?php
session_start();
if(!$_SESSION['login']){
    function functions($value)
{
    require("functions/" . $value . ".php");   
}
functions('login');
functions('ipTjek');
$ipTjek = ipTjek($_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_X_FORWARDED_FOR'], $_SERVER['HTTP_CLIENT_IP']);
if($ipTjek == 'Accepted'){
    if(isset($_POST['submit'])){
        if (isset($_SESSION['token']) && $_POST['token'] == $_SESSION['token']){
        unset($_SESSION['token']);
        unset($token);
            if (isset($_SESSION['HTTP_USER_AGENT'])){
            if ($_SESSION['HTTP_USER_AGENT'] == md5($_SERVER['HTTP_USER_AGENT'])){
                $login = login($_POST['mail'],$_POST['pass']);
                if(isset($login['Id']) && isset($login['Rank']) && isset($login['Navn']) && isset($login['Ip']) && isset($login['Mail'])){
                    $_SESSION['id'] = $login['Id'];
                    $_SESSION['navn'] = $login['Navn'];
                    $_SESSION['rank'] = $login['Rank'];
                    $_SESSION['ip'] = $login['Ip'];
                    $_SESSION['mail'] = $login['Mail'];
                    echo 'Du er nu logget ind.';
                }else{
                    echo $login;
                }
            }else{
                echo 'Session Hijack forsøg opdaget!';
            }
            }else{
            echo 'User agent failed.';
            }
        }else{
            echo 'Cross site request forgeries forsøg opdaget.';
        }
    }else{
$token = $_SESSION['token'] = md5(uniqid(rand(), true));
$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
$html = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
$html .= '<html xmlns="http://www.w3.org/1999/xhtml">';
$html .= '<head>';
$html .= '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
$html .= '<title>Untitled Document</title>';
$html .= '</head>';
$html .= '<body>';
$html .= '<form method ="POST" action ="' . $_SERVER['PHP_SELF'] . '">';
$html .= '<table>';
$html .= '<tr><td>Mail:</td><td><input type = "text" name = "mail" /></td></tr>';
$html .= '<tr><td>Password:</td><td><input type = "password" name = "pass" /></td></tr>';
$html .= '</table>';
$html .= '<input type = "hidden" name = "token" value ="' . $token . '">';
$html .= '<input type = "submit" name = "submit" value = "Login" />';
$html .= '</form>';
$html .= '</body>';
$html .= '</html>';
echo $html;
    }
}else{
echo $ipTjek;   
}
}else{
    echo 'Du er allerede logget ind!';
}
?>

Som du kan se tjekker jeg også i denne kode om alle variablerne er sat, og får igen ingen error.
Avatar billede wanze Nybegynder
25. april 2011 - 15:51 #7
Du viser jo stadig ikke de kode-dele jeg nævner.

Du siger du ingen error får. Prøv at sætte die("Det stoppede her"); ind lige efter linjen }else{ før functions('errorTjek'); og se resultatet.

}else{
functions('errorTjek');
return $error = error('aktiveringsError');
}

Hvis du siger at $aktiveret ikke er 1, så vil denne kodeblok også blive udført.
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