Domanda

Chiunque può vedere qualcosa di sbagliato in questo script di accesso:

public function login($username, $pass, $remember) {
  // check username and password with db
  // else throw exception  
  $connect = new connect(); 
  $conn = $connect->login_connect();      
  // check username and password
  $result = $conn->query("select * from login where
                          username='".$username."' and
                          password=sha1('".$pass."')");
  if (!$result) {
    throw new depException('Incorrect username and password combination. Please try again.');
  } else {
    echo $username, $pass;
  }

Per spiegare:

Al momento lo script sta permettendo nulla attraverso. In altre parole, la query sta tornando vale per qualsiasi nome utente e la password che sono passati ad esso. Ho messo l'istruzione echo proprio come un assegno - ovviamente lo script avrebbe continuato in circostanze normali

So che la classe di connessione e il metodo login_connect stanno lavorando perché li uso in uno script registro che sta lavorando bene. depException è solo un'estensione della classe Exception.
L'account di accesso di funzione () è parte della stessa classe che contiene il registro () che sta lavorando bene.
So che le due variabili ($ username e $ Pass) sono sempre alla funzione perché l'istruzione echo loro è l'output con precisione. (La variabile $ ricordare non è necessario per questa parte dello script. Viene usato in seguito per un processo mi ricordo).
Sono perplesso. Si prega di aiutare!

UPDATE

Grazie per quelle risposte. Mi è stato sempre confuso con ciò che la query stava tornando. Lo script completo non verificare la presenza di quante righe vengono restituiti e questo è dove il controllo avrebbe dovuto essere fatto. Tutto sta ora lavorando a parte il mio funzione ricordati di me. Forse qualcuno potrebbe aiutare in questo?!?! Ecco lo script completo:

public function login($username, $pass, $remember) {
  // check username and password with db
  // else throw exception  
  $connect = new connect(); 
  $conn = $connect->login_connect();      
  // check username and password
  $result = $conn->query("select * from login where
                          username='".$username."' and
                          password=sha1('".$pass."')");
  if (!$result) {
    throw new depException('Incorrect username and password combination. Please try again.');
  }       
  if ($result->num_rows>0) {
    $row = $result->fetch_assoc();
    //assign id to session
    $_SESSION['user_id'] = $row[user_id];        
    // assign username as a session variable
    $_SESSION['username'] = $username;        
    // start rememberMe
    $cookie_name = 'db_auth';
    $cookie_time = (3600 * 24 * 30);*/ // 30 days
    // check to see if user checked box
    if ($remember) {
      setcookie ($cookie_name, 'username='.$username, time()+$cookie_time);
    }
    // If all goes well redirect user to their homepage.
    header('Location: http://localhost/v6/home/index.php');   
  } else {
    throw new depException('Could not log you in.);
  }
}

Grazie mille per il vostro aiuto.

UPDATE 2!

Grazie per il vostro aiuto che ho ottenuto la parte principale di questo script di lavoro. Tuttavia, il bit ricordati di me, alla fine ancora non vuole lavorare. Qualcuno mi potrebbe dare una mano a risolvere la cosa? $ Username, $ pass e $ ricordare sono tutti brevi nomi di variabili che ho assegnato prima di passarli alla funzione per salvare la scrittura $ _POST [ 'username'] ecc ogni volta. $ Ricordare si riferisce a una casella di controllo.

È stato utile?

Soluzione

Che cosa significa il ritorno $conn->query(), un oggetto risorsa MySQL come mysql_query() fa? Se è così allora che sarà confrontare sempre "vero". mysql_query() restituisce solo FALSE se la query completamente non riesce, come ha un errore di sintassi o una tabella non esiste.

Per controllare se hai dei risultati è necessario cercare di recuperare una riga dal set di risultati e vedere se si ottiene qualcosa, tramite qualunque sia il vostro equivalente di mysql_fetch_row() è.

Importante: Lo script è vulnerabile a attacchi di SQL injection , o anche nomi utente proprio strano come o'neil con un apostrofo. Si dovrebbe sfuggire tutte le variabili in una query con mysql_real_escape_string() (o equivalente) per assicurarsi che la vostra richiesta non venga incasinato da caratteri speciali. O, meglio ancora, utilizzare le istruzioni preparate che assomigliano

select * from login where username=? and password=sha1(?)

Re: AGGIORNAMENTO

Le variabili da un modulo sono disponibili sia tramite $_GET o $_POST, a seconda di quale metodo è stato utilizzato per inviare il modulo. Prova if (isset($_POST['remember'])) per vedere se la casella di controllo è stata verificata.

Importante: Vedo che si è tentato di utilizzare un $remember nuda per vedere se la casella di controllo è stata controllata. Questo mi fa pensare che si sta cercando di sfruttare la register_globals caratteristica in PHP che rende le variabili GET e POST accessibile tramite i nomi delle variabili regolari. Se questo è il caso si dovrebbe prestare attenzione al monito nel manuale di PHP!

  

ATTENZIONE

     

[register_globals] è stato deprecato a partire dal PHP 5.3.0 e rimosso come di PHP 6.0.0. Basandosi su questa caratteristica è altamente sconsigliato.

Usa $_GET e $_POST invece. Potrei dirti come fare il lavoro if ($remember), in realtà, ma data la intrinseca male-ness di register_globals Non ho intenzione! ; -)

Altri suggerimenti

La vostra query è aperto per sql-iniezioni ...

  

SELECT * FROM
utenti
Dove   username = '' o 'A' = 'a '
  E la password =   sha1 ( ' guessAnyPassword ')

Mi piacerebbe anche controllare il risultato, e baso l'azione su quanti record sono stati restituiti.

if (mysql_num_rows($result) > 0)

In PHP maggior parte delle query restituiscono False solo se c'è stato un errore di eseguirle. La query restituisce un valore, probabilmente un array vuoto di valori. Questo non è un valore falso per quanto riguarda la vostra istruzione if è interessato.

Controlla quante righe vengono restituiti. La funzione per fare questo dipenderà dalla vostra livello di astrazione (collegare classe ecc ...)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top