Question

J'ai besoin du script d'authentification suivant. Je suis faible à php / pdo, donc je ne sais pas comment demander le nombre de lignes égal à un, puis définir l'identifiant de session à partir des résultats de la requête. Je dois non seulement définir le $ _SESSION ['userid'], mais également le ['company'] et le ['security_id'], ainsi que les résultats.

voici ce que j'ai:

$userid   = 

J'ai besoin du script d'authentification suivant. Je suis faible à php / pdo, donc je ne sais pas comment demander le nombre de lignes égal à un, puis définir l'identifiant de session à partir des résultats de la requête. Je dois non seulement définir le $ _SESSION ['userid'], mais également le ['company'] et le ['security_id'], ainsi que les résultats.

voici ce que j'ai:

<*>

Informations facultatives: Navigateur: Firefox

POST['userid']; $password =

J'ai besoin du script d'authentification suivant. Je suis faible à php / pdo, donc je ne sais pas comment demander le nombre de lignes égal à un, puis définir l'identifiant de session à partir des résultats de la requête. Je dois non seulement définir le $ _SESSION ['userid'], mais également le ['company'] et le ['security_id'], ainsi que les résultats.

voici ce que j'ai:

<*>

Informations facultatives: Navigateur: 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"; }

Informations facultatives: Navigateur: Firefox

Était-ce utile?

La solution

N'UTILISEZ JAMAIS CE CODE!

Vous avez une très grave injection SQL ouverte à cet endroit. Chaque entrée d'utilisateur que vous prenez, que ce soit à partir de cookies ou de CGI, ou , doit être nettoyée avant d'être utilisée dans une instruction SQL. Je pourrais facilement pénétrer dans ce système en tentant une connexion avec un nom d'utilisateur tel que:

user'; UPDATE contractors SET password = '1337'

... après quoi je pourrais ensuite me connecter en tant que personne. Désolé si je parais agressif, mais ce code fait comme oublier de ne pas verrouiller la porte d'entrée de votre entreprise, qui ne contient probablement même pas de système d'alarme.

Notez que le fait que l’entrée provienne de l’utilisateur ou non importe peu (c’est peut-être dans une zone pré-remplie, masquée). Du point de vue de la sécurité, tout élément provenant de l'extérieur de doit être considéré comme contenant des entrées malveillantes de l'utilisateur.

Pour autant que je sache, vous devez utiliser la quote. de PDO pour assainir correctement la chaîne. (Dans mysql, cela se ferait avec mysql_real_escape_string () .) Je ne suis pas un expert en AOP, remarquez, corrigez-moi si je me trompe ici.

De même, vous ne devriez probablement pas stocker de mot de passe directement dans la base de données, mais plutôt utiliser une fonction de hachage pour créer un mot de passe masqué, puis créer également un hachage à partir du mot de passe fourni par l'utilisateur et faire correspondre les hachages. Vous pouvez utiliser la fonction PHP hash pour le faire.

Pour ce qui est des autres problèmes, je ne sais pas si votre approche sur SQL SELECT est la meilleure. Je voudrais simplement sélectionner le mot de passe de l'utilisateur correspondant et essayer de le faire correspondre dans le programme. Je ne pense pas non plus que la méthode que vous utilisiez soit défectueuse, mais cela ne semble pas aussi logique, et il y a donc plus de chances que moi manque un bogue - ce qui dans le cas de Les mots de passe et les identifiants créeraient une fenêtre pour les exploits.

Pour faire comme vous le souhaitez, vous devez noter que le résultat que vous obtenez du PDO la requête est une PDOStatement , qui ne semble pas avoir de fonction fiable pour compter directement le montant des lignes de résultat. Ce que vous devez utiliser est fetchAll , qui renvoie un tableau des lignes, et compter cela. Cependant, comme je l'ai dit, tout me semble être ouvert aux échecs, donc je me sentirais plus en sécurité en vérifiant le mot de passe dans le code. À mon goût, il y a trop de distance entre le mot de passe correspondant au mot de passe et le mot de passe correspondant.

Donc, pour obtenir le mot de passe résultant pour l'ID utilisateur, vous pouvez utiliser le de la suite code> fetch () qui renvoie le contenu de la colonne à partir du résultat. Utilisez par exemple PDO :: FETCH_ASSOC pour les obtenir dans un tableau associatif basé sur les noms de colonne.

Voici comment résoudre ce problème:

$userid_dirty   = 

N'UTILISEZ JAMAIS CE CODE!

Vous avez une très grave injection SQL ouverte à cet endroit. Chaque entrée d'utilisateur que vous prenez, que ce soit à partir de cookies ou de CGI, ou , doit être nettoyée avant d'être utilisée dans une instruction SQL. Je pourrais facilement pénétrer dans ce système en tentant une connexion avec un nom d'utilisateur tel que:

user'; UPDATE contractors SET password = '1337'

... après quoi je pourrais ensuite me connecter en tant que personne. Désolé si je parais agressif, mais ce code fait comme oublier de ne pas verrouiller la porte d'entrée de votre entreprise, qui ne contient probablement même pas de système d'alarme.

Notez que le fait que l’entrée provienne de l’utilisateur ou non importe peu (c’est peut-être dans une zone pré-remplie, masquée). Du point de vue de la sécurité, tout élément provenant de l'extérieur de doit être considéré comme contenant des entrées malveillantes de l'utilisateur.

Pour autant que je sache, vous devez utiliser la quote. de PDO pour assainir correctement la chaîne. (Dans mysql, cela se ferait avec mysql_real_escape_string () .) Je ne suis pas un expert en AOP, remarquez, corrigez-moi si je me trompe ici.

De même, vous ne devriez probablement pas stocker de mot de passe directement dans la base de données, mais plutôt utiliser une fonction de hachage pour créer un mot de passe masqué, puis créer également un hachage à partir du mot de passe fourni par l'utilisateur et faire correspondre les hachages. Vous pouvez utiliser la fonction PHP hash pour le faire.

Pour ce qui est des autres problèmes, je ne sais pas si votre approche sur SQL SELECT est la meilleure. Je voudrais simplement sélectionner le mot de passe de l'utilisateur correspondant et essayer de le faire correspondre dans le programme. Je ne pense pas non plus que la méthode que vous utilisiez soit défectueuse, mais cela ne semble pas aussi logique, et il y a donc plus de chances que moi manque un bogue - ce qui dans le cas de Les mots de passe et les identifiants créeraient une fenêtre pour les exploits.

Pour faire comme vous le souhaitez, vous devez noter que le résultat que vous obtenez du PDO la requête est une PDOStatement , qui ne semble pas avoir de fonction fiable pour compter directement le montant des lignes de résultat. Ce que vous devez utiliser est fetchAll , qui renvoie un tableau des lignes, et compter cela. Cependant, comme je l'ai dit, tout me semble être ouvert aux échecs, donc je me sentirais plus en sécurité en vérifiant le mot de passe dans le code. À mon goût, il y a trop de distance entre le mot de passe correspondant au mot de passe et le mot de passe correspondant.

Donc, pour obtenir le mot de passe résultant pour l'ID utilisateur, vous pouvez utiliser le de la suite code> fetch () qui renvoie le contenu de la colonne à partir du résultat. Utilisez par exemple PDO :: FETCH_ASSOC pour les obtenir dans un tableau associatif basé sur les noms de colonne.

Voici comment résoudre ce problème:

<*>

Bien sûr, le code peut être nettoyé un peu, mais cela devrait expliquer ce qui doit être fait. Notez que, puisque le mot de passe est haché et que n'est jamais utilisé dans le code SQL , il n'a pas réellement besoin d'être nettoyé. Mais je l’ai laissé là au cas où, puisque dans le code original, il était utilisé dans la requête.

Notez que tout le code concernant le stockage des mots de passe doit être modifié pour stocker le hachage au lieu du mot de passe. Il serait également très judicieux d’utiliser un sel ajouté au mot de passe. avant le hachage.

De plus, j’ai fourni le code simplement à des fins pédagogiques. Je pensais que ce code était le moyen le plus clair d’expliquer comment faire. Donc, ne confondez pas ce site avec un service demandant du code. :)

POST['userid']; $password_dirty =

N'UTILISEZ JAMAIS CE CODE!

Vous avez une très grave injection SQL ouverte à cet endroit. Chaque entrée d'utilisateur que vous prenez, que ce soit à partir de cookies ou de CGI, ou , doit être nettoyée avant d'être utilisée dans une instruction SQL. Je pourrais facilement pénétrer dans ce système en tentant une connexion avec un nom d'utilisateur tel que:

user'; UPDATE contractors SET password = '1337'

... après quoi je pourrais ensuite me connecter en tant que personne. Désolé si je parais agressif, mais ce code fait comme oublier de ne pas verrouiller la porte d'entrée de votre entreprise, qui ne contient probablement même pas de système d'alarme.

Notez que le fait que l’entrée provienne de l’utilisateur ou non importe peu (c’est peut-être dans une zone pré-remplie, masquée). Du point de vue de la sécurité, tout élément provenant de l'extérieur de doit être considéré comme contenant des entrées malveillantes de l'utilisateur.

Pour autant que je sache, vous devez utiliser la quote. de PDO pour assainir correctement la chaîne. (Dans mysql, cela se ferait avec mysql_real_escape_string () .) Je ne suis pas un expert en AOP, remarquez, corrigez-moi si je me trompe ici.

De même, vous ne devriez probablement pas stocker de mot de passe directement dans la base de données, mais plutôt utiliser une fonction de hachage pour créer un mot de passe masqué, puis créer également un hachage à partir du mot de passe fourni par l'utilisateur et faire correspondre les hachages. Vous pouvez utiliser la fonction PHP hash pour le faire.

Pour ce qui est des autres problèmes, je ne sais pas si votre approche sur SQL SELECT est la meilleure. Je voudrais simplement sélectionner le mot de passe de l'utilisateur correspondant et essayer de le faire correspondre dans le programme. Je ne pense pas non plus que la méthode que vous utilisiez soit défectueuse, mais cela ne semble pas aussi logique, et il y a donc plus de chances que moi manque un bogue - ce qui dans le cas de Les mots de passe et les identifiants créeraient une fenêtre pour les exploits.

Pour faire comme vous le souhaitez, vous devez noter que le résultat que vous obtenez du PDO la requête est une PDOStatement , qui ne semble pas avoir de fonction fiable pour compter directement le montant des lignes de résultat. Ce que vous devez utiliser est fetchAll , qui renvoie un tableau des lignes, et compter cela. Cependant, comme je l'ai dit, tout me semble être ouvert aux échecs, donc je me sentirais plus en sécurité en vérifiant le mot de passe dans le code. À mon goût, il y a trop de distance entre le mot de passe correspondant au mot de passe et le mot de passe correspondant.

Donc, pour obtenir le mot de passe résultant pour l'ID utilisateur, vous pouvez utiliser le de la suite code> fetch () qui renvoie le contenu de la colonne à partir du résultat. Utilisez par exemple PDO :: FETCH_ASSOC pour les obtenir dans un tableau associatif basé sur les noms de colonne.

Voici comment résoudre ce problème:

<*>

Bien sûr, le code peut être nettoyé un peu, mais cela devrait expliquer ce qui doit être fait. Notez que, puisque le mot de passe est haché et que n'est jamais utilisé dans le code SQL , il n'a pas réellement besoin d'être nettoyé. Mais je l’ai laissé là au cas où, puisque dans le code original, il était utilisé dans la requête.

Notez que tout le code concernant le stockage des mots de passe doit être modifié pour stocker le hachage au lieu du mot de passe. Il serait également très judicieux d’utiliser un sel ajouté au mot de passe. avant le hachage.

De plus, j’ai fourni le code simplement à des fins pédagogiques. Je pensais que ce code était le moyen le plus clair d’expliquer comment faire. Donc, ne confondez pas ce site avec un service demandant du code. :)

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.'; }

Bien sûr, le code peut être nettoyé un peu, mais cela devrait expliquer ce qui doit être fait. Notez que, puisque le mot de passe est haché et que n'est jamais utilisé dans le code SQL , il n'a pas réellement besoin d'être nettoyé. Mais je l’ai laissé là au cas où, puisque dans le code original, il était utilisé dans la requête.

Notez que tout le code concernant le stockage des mots de passe doit être modifié pour stocker le hachage au lieu du mot de passe. Il serait également très judicieux d’utiliser un sel ajouté au mot de passe. avant le hachage.

De plus, j’ai fourni le code simplement à des fins pédagogiques. Je pensais que ce code était le moyen le plus clair d’expliquer comment faire. Donc, ne confondez pas ce site avec un service demandant du code. :)

Autres conseils

Le manuel php est une excellente ressource pour apprendre PHP. On dirait que vous connaissez un peu le code SQL et que vous avez entendu parler de PDO, ce qui est un bon début. Si vous recherchez "PDO" sur Google ou recherchez le terme dans le manuel PHP, vous trouverez le PDO. section du manuel. Il semble que vous ayez trouvé la fonction - > query . Vous devez donc maintenant voir ce qui est renvoyé. En allant à la page de manuel de cette fonction, nous voyons qu'elle renvoie un objet PDOStatement . Le mot PDOStatement est utilement lié à la page correspondante du manuel, qui répertorie les méthodes disponibles sur cet objet. Il existe une méthode rowCount () qui fera probablement ce que vous voulez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top