Domanda

Ho bisogno del seguente script di autenticazione finito. Sono debole a php / pdo, quindi non so come chiedere il numero di righe uguale a una e quindi impostare l'ID di sessione dai risultati della query. Devo solo impostare $ _SESSION ['userid'] ma anche ['company'] e ['security_id'] anche dai risultati.

ecco quello che ho:

$userid   = 

Ho bisogno del seguente script di autenticazione finito. Sono debole a php / pdo, quindi non so come chiedere il numero di righe uguale a una e quindi impostare l'ID di sessione dai risultati della query. Devo solo impostare $ _SESSION ['userid'] ma anche ['company'] e ['security_id'] anche dai risultati.

ecco quello che ho:

<*>

Informazioni opzionali: Browser: Firefox

POST['userid']; $password =

Ho bisogno del seguente script di autenticazione finito. Sono debole a php / pdo, quindi non so come chiedere il numero di righe uguale a una e quindi impostare l'ID di sessione dai risultati della query. Devo solo impostare $ _SESSION ['userid'] ma anche ['company'] e ['security_id'] anche dai risultati.

ecco quello che ho:

<*>

Informazioni opzionali: Browser: Firefox

POST['pass']; if ( $userid != "" || $password != "" ) { $sql = "SELECT * FROM contractors WHERE userid = '" . $userid . "' AND password = '" . $password . "'"; $result = $dbh->query( $sql ); } else { echo "login failed. Your fingers are too big"; }

Informazioni opzionali: Browser: Firefox

È stato utile?

Soluzione

NON USARE MAI QUESTO CODICE!

Hai un'iniezione di SQL molto seria aperta lì. Ogni input dell'utente che prendi, sia da cookie o CGI, sia ovunque , deve essere disinfettato prima di essere utilizzato in un'istruzione SQL. Potrei facilmente entrare in quel sistema tentando un login con un nome utente come:

user'; UPDATE contractors SET password = '1337'

... dopodiché ho potuto accedere come chiunque. Scusate se sembro aggressivo, ma quello che fa quel codice è come dimenticare di bloccare la porta principale della vostra azienda che probabilmente non contiene nemmeno un sistema di allarme.

Nota che non importa se l'input proviene effettivamente dall'utente o meno (forse è in un pre-compilato, nascosto da). Dal punto di vista della sicurezza, qualsiasi cosa che provenga da qualsiasi parte al di fuori di deve essere considerata contenente input dannosi da parte dell'utente.

Per quanto ne so, è necessario utilizzare la quote della funzione PDO per disinfettare correttamente la stringa. (In mysql, questo sarebbe fatto con mysql_real_escape_string () .) Non sono un esperto di DOP, intendiamoci, qualcuno per favore correggi se sbaglio qui.

Inoltre, probabilmente non dovresti memorizzare alcuna password direttamente nel database, ma piuttosto utilizzare una funzione hash per creare una password mascherata, quindi creare un hash dalla password fornita dall'utente e abbinare gli hash. Puoi usare la funzione PHP hash per farlo.

Per quanto riguarda gli altri problemi, non so se l'approccio che hai su SQL SELECT sia l'approccio migliore. Vorrei solo selezionare la password dell'utente corrispondente e provare ad abbinarla nel programma. Non penso che ci sia alcun difetto nel metodo che stai usando, ma non sembra logico e quindi c'è una maggiore possibilità che me manchi qualche bug - che in caso di password e accessi creerebbero una finestra per exploit.

Per farlo a modo tuo, devi notare che il risultato che stai ottenendo dal PDO query è un PDOStatement , che non sembra avere una funzione affidabile per contare direttamente l'importo delle righe dei risultati. Quello che devi usare è fetchAll che restituisce un array di righe e contalo. Tuttavia, come ho detto, tutto ciò mi sembra aperto per errori, quindi mi sentirei più sicuro nel controllare la password nel codice. Per i miei gusti, c'è troppa distanza dall'attuale corrispondenza di corrispondenza delle password, in un posto così critico per la sicurezza.

Quindi, per ottenere la password risultante per l'id utente, è possibile utilizzare di PDOStatement code> fetch () che restituisce il contenuto della colonna dal risultato. Utilizzare ad esempio PDO :: FETCH_ASSOC per inserirli in un array associativo basato sui nomi delle colonne.

Ecco come risolverlo:

$userid_dirty   = 

NON USARE MAI QUESTO CODICE!

Hai un'iniezione di SQL molto seria aperta lì. Ogni input dell'utente che prendi, sia da cookie o CGI, sia ovunque , deve essere disinfettato prima di essere utilizzato in un'istruzione SQL. Potrei facilmente entrare in quel sistema tentando un login con un nome utente come:

user'; UPDATE contractors SET password = '1337'

... dopodiché ho potuto accedere come chiunque. Scusate se sembro aggressivo, ma quello che fa quel codice è come dimenticare di bloccare la porta principale della vostra azienda che probabilmente non contiene nemmeno un sistema di allarme.

Nota che non importa se l'input proviene effettivamente dall'utente o meno (forse è in un pre-compilato, nascosto da). Dal punto di vista della sicurezza, qualsiasi cosa che provenga da qualsiasi parte al di fuori di deve essere considerata contenente input dannosi da parte dell'utente.

Per quanto ne so, è necessario utilizzare la quote della funzione PDO per disinfettare correttamente la stringa. (In mysql, questo sarebbe fatto con mysql_real_escape_string () .) Non sono un esperto di DOP, intendiamoci, qualcuno per favore correggi se sbaglio qui.

Inoltre, probabilmente non dovresti memorizzare alcuna password direttamente nel database, ma piuttosto utilizzare una funzione hash per creare una password mascherata, quindi creare un hash dalla password fornita dall'utente e abbinare gli hash. Puoi usare la funzione PHP hash per farlo.

Per quanto riguarda gli altri problemi, non so se l'approccio che hai su SQL SELECT sia l'approccio migliore. Vorrei solo selezionare la password dell'utente corrispondente e provare ad abbinarla nel programma. Non penso che ci sia alcun difetto nel metodo che stai usando, ma non sembra logico e quindi c'è una maggiore possibilità che me manchi qualche bug - che in caso di password e accessi creerebbero una finestra per exploit.

Per farlo a modo tuo, devi notare che il risultato che stai ottenendo dal PDO query è un PDOStatement , che non sembra avere una funzione affidabile per contare direttamente l'importo delle righe dei risultati. Quello che devi usare è fetchAll che restituisce un array di righe e contalo. Tuttavia, come ho detto, tutto ciò mi sembra aperto per errori, quindi mi sentirei più sicuro nel controllare la password nel codice. Per i miei gusti, c'è troppa distanza dall'attuale corrispondenza di corrispondenza delle password, in un posto così critico per la sicurezza.

Quindi, per ottenere la password risultante per l'id utente, è possibile utilizzare di PDOStatement code> fetch () che restituisce il contenuto della colonna dal risultato. Utilizzare ad esempio PDO :: FETCH_ASSOC per inserirli in un array associativo basato sui nomi delle colonne.

Ecco come risolverlo:

<*>

Naturalmente, il codice può essere ripulito un po ', ma ciò dovrebbe spiegare cosa deve essere fatto. Si noti che poiché la password è sia con hash che mai utilizzata in SQL , in realtà non è necessario pulirla. Ma l'ho lasciato lì per ogni evenienza, poiché nel codice originale era usato nella query.

Si noti che tutto il codice relativo all'archiviazione delle password deve essere modificato per memorizzare l'hash anziché la password. Inoltre, sarebbe un'ottima idea utilizzare un salt aggiunto alla password prima dell'hash.

Inoltre, ho fornito il codice semplicemente per scopi didattici: pensavo solo che il codice fosse il modo più chiaro per spiegare come farlo. Quindi non confondere questo sito come servizio per richiedere il codice. :)

POST['userid']; $password_dirty =

NON USARE MAI QUESTO CODICE!

Hai un'iniezione di SQL molto seria aperta lì. Ogni input dell'utente che prendi, sia da cookie o CGI, sia ovunque , deve essere disinfettato prima di essere utilizzato in un'istruzione SQL. Potrei facilmente entrare in quel sistema tentando un login con un nome utente come:

user'; UPDATE contractors SET password = '1337'

... dopodiché ho potuto accedere come chiunque. Scusate se sembro aggressivo, ma quello che fa quel codice è come dimenticare di bloccare la porta principale della vostra azienda che probabilmente non contiene nemmeno un sistema di allarme.

Nota che non importa se l'input proviene effettivamente dall'utente o meno (forse è in un pre-compilato, nascosto da). Dal punto di vista della sicurezza, qualsiasi cosa che provenga da qualsiasi parte al di fuori di deve essere considerata contenente input dannosi da parte dell'utente.

Per quanto ne so, è necessario utilizzare la quote della funzione PDO per disinfettare correttamente la stringa. (In mysql, questo sarebbe fatto con mysql_real_escape_string () .) Non sono un esperto di DOP, intendiamoci, qualcuno per favore correggi se sbaglio qui.

Inoltre, probabilmente non dovresti memorizzare alcuna password direttamente nel database, ma piuttosto utilizzare una funzione hash per creare una password mascherata, quindi creare un hash dalla password fornita dall'utente e abbinare gli hash. Puoi usare la funzione PHP hash per farlo.

Per quanto riguarda gli altri problemi, non so se l'approccio che hai su SQL SELECT sia l'approccio migliore. Vorrei solo selezionare la password dell'utente corrispondente e provare ad abbinarla nel programma. Non penso che ci sia alcun difetto nel metodo che stai usando, ma non sembra logico e quindi c'è una maggiore possibilità che me manchi qualche bug - che in caso di password e accessi creerebbero una finestra per exploit.

Per farlo a modo tuo, devi notare che il risultato che stai ottenendo dal PDO query è un PDOStatement , che non sembra avere una funzione affidabile per contare direttamente l'importo delle righe dei risultati. Quello che devi usare è fetchAll che restituisce un array di righe e contalo. Tuttavia, come ho detto, tutto ciò mi sembra aperto per errori, quindi mi sentirei più sicuro nel controllare la password nel codice. Per i miei gusti, c'è troppa distanza dall'attuale corrispondenza di corrispondenza delle password, in un posto così critico per la sicurezza.

Quindi, per ottenere la password risultante per l'id utente, è possibile utilizzare di PDOStatement code> fetch () che restituisce il contenuto della colonna dal risultato. Utilizzare ad esempio PDO :: FETCH_ASSOC per inserirli in un array associativo basato sui nomi delle colonne.

Ecco come risolverlo:

<*>

Naturalmente, il codice può essere ripulito un po ', ma ciò dovrebbe spiegare cosa deve essere fatto. Si noti che poiché la password è sia con hash che mai utilizzata in SQL , in realtà non è necessario pulirla. Ma l'ho lasciato lì per ogni evenienza, poiché nel codice originale era usato nella query.

Si noti che tutto il codice relativo all'archiviazione delle password deve essere modificato per memorizzare l'hash anziché la password. Inoltre, sarebbe un'ottima idea utilizzare un salt aggiunto alla password prima dell'hash.

Inoltre, ho fornito il codice semplicemente per scopi didattici: pensavo solo che il codice fosse il modo più chiaro per spiegare come farlo. Quindi non confondere questo sito come servizio per richiedere il codice. :)

POST['pass']; $success = false; // This is to make it more clear what the result is at the end if ($userid != "" || $password != "") { $userid = $dbh->quote($userid_dirty); $passwordhash = hash('sha256',$password_dirty); $sql = "SELECT userid, passwordhash, company, security_id FROM contractors WHERE userid = ".$userid; $result = $dbh->query( $sql ); if ($result) { // Check if result not empty, that userid exists $result_array = $result->fetch(PDO::FETCH_ASSOC); if ($result_array['PASSWORDHASH'] == $passwordhash) { // login success $success = true; // do all the login stuff here... // such as saving $result_array['USERID'], $result_array['COMPANY'], $result_array['SECURITY_ID'] etc. } // else fail, wrong password } // else fail, no such user } else { // fail, userid or password missing echo ' please enter user id and password.'; } if (!$success) { echo ' login failed.'; }

Naturalmente, il codice può essere ripulito un po ', ma ciò dovrebbe spiegare cosa deve essere fatto. Si noti che poiché la password è sia con hash che mai utilizzata in SQL , in realtà non è necessario pulirla. Ma l'ho lasciato lì per ogni evenienza, poiché nel codice originale era usato nella query.

Si noti che tutto il codice relativo all'archiviazione delle password deve essere modificato per memorizzare l'hash anziché la password. Inoltre, sarebbe un'ottima idea utilizzare un salt aggiunto alla password prima dell'hash.

Inoltre, ho fornito il codice semplicemente per scopi didattici: pensavo solo che il codice fosse il modo più chiaro per spiegare come farlo. Quindi non confondere questo sito come servizio per richiedere il codice. :)

Altri suggerimenti

Il manuale di php è una risorsa eccellente per l'apprendimento di PHP. Sembra che tu sappia un po 'di SQL e hai sentito parlare di DOP, il che è un buon inizio. Se cerchi su Google "PDO" o cerchi il termine nel manuale di PHP, troverai il PDO sezione del manuale. Sembra che tu abbia trovato la funzione - > query , quindi ora devi vedere cosa restituisce. Accedendo alla pagina di manuale di quella funzione , vediamo che restituisce un Oggetto PDOStatement . La parola PDOStatement è utilemente collegata alla relativa pagina del manuale, che elenca i metodi disponibili su quell'oggetto. Esiste un metodo rowCount () che probabilmente farà quello che vuoi.

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