Bienvenue sur PEBKAC.fr, le site qui recense les anecdotes où l’on se moque des utilisateurs ne maîtrisant pas l’outil informatique. PEBKAC est un acronyme signifiant « Problem Exists Between Keyboard And Chair ».
Le problème se situe entre la chaise et le clavier : soumettez vos histoires, donnez votre avis !
Ce site n'est pas le site original pebkac.fr. Je publie ici la liste des PEBKAC que j'ai pu sauvegarder avant que le site original ne soit mis hors ligne.
En cherchant des informations sur Internet, je suis arrivé sur un forum. Un message d'un sujet comportait un lien vers, si j'en croyais le contenu dudit message, un tutoriel pour réaliser l'action que je souhaitais faire (toujours sur le même forum).

Après avoir cliqué sur le lien, j'arrive sur une page blanche comportant du code PHP. Au vu du contenu, très limite.
Premier PEBKAC.

Après un rapide coup d’œil, je repère la ligne : « $result = mysql_fetch_array(mysql_query("SELECT id [...] WHERE target_id = '$target_id'")); »
Et « $target_id » provenant de $_REQUEST et sécurisé par le traditionnel « is_numeric() ». Second PEBKAC.
PEBKAC #7246 proposé par mini le 18/03/2013 | 13 commentaires | 👍🏽 👎🏽 +112
Captain Obvious!
Captain Obvious!
Captain Obvious!
Commentaire #83874 écrit par Moot le 18/03/2013 à 17h38 | 👍🏽 👎🏽
Moi non plus je ne parle pas cette langue, help !
Commentaire #83878 écrit par Gruck le 18/03/2013 à 17h46 | 👍🏽 👎🏽
On affiche pas du PHP en sauvage normalement, le PHP est interprété coté serveur, donc si tu veux le montrer directement, tu opte pour une citation dans un message ou un truc du genre.

Et pour le mysql_ c'est l'ancienne méthode pour se connecter aux base de données.
Avec le gros problème que là le PEBKAC utilise directement le code envoyé par l'utilisateur dans $target_id, le tout sécurisé avec une fonction is_numeric() qui n'est pas fait pour ça à la base.

On va dire que c'est du mauvais code comme ce que les Pierrafeu nous sortirais.
(son is_numeric() le rattrape par les cheveux, sinon c'étais la maxi faille de sécu sur la BDD)
Commentaire #83879 écrit par blag le 18/03/2013 à 17h58 | 👍🏽 👎🏽
Merci je peux maintenant voter sans hésitation ;o)
Commentaire #83880 écrit par Gruck le 18/03/2013 à 18h03 | 👍🏽 👎🏽
Exact, j'étais déjà en train de rédiger le PEBKAC avant de repérer le is_numeric.

Mais ce n'est pas un code affiché par un utilisateur. C'était, si j'ai bien compris, le code du forum censé m'emmener à la page souhaitée (et le target_id son identifiant).
Commentaire #83884 écrit par mini le 18/03/2013 à 18h28 | 👍🏽 👎🏽
je m'y connait quasi pas en dev web, de fait pourrait on me détailler pourquoi utiliser is_numeric() est mauvais pour sécuriser une entrée utilisateur qui doit être exclusivement numérique ? le but est bien d'éviter les injections sql non ? qu'utilise t'on traditionnellement ?
Commentaire #83901 écrit par DePassage le 18/03/2013 à 21h40 | 👍🏽 👎🏽
Parce que is_numeric() valide les chaînes binaires, hexadécimale, octales ainsi que les nombres comportant une partie exponentielle ou décimale. C'est la seule explication que je vois.
Personnellement j'utiliserais ctype_digit().
Commentaire #83906 écrit par John le 18/03/2013 à 22h09 | 👍🏽 👎🏽
Tiens, je ne connaissais pas ctype_digit(), mais attention, ça ne valide que les chaines avec caractères numériques, pas les vrais int.

un is_numeric($var) suivi d'un $var=intval($var) ne serait-il pas la meilleure solution ?
Commentaire #83919 écrit par TuXiC69 le 19/03/2013 à 05h38 | 👍🏽 👎🏽
Vas-y blag, te gène pas, pique moi mon job :D !
Tu veux ma cape aussi tant que t'y es ?
Commentaire #83920 écrit par Captain Obvious le 19/03/2013 à 05h49 | 👍🏽 👎🏽
> ça ne valide que les chaines avec caractères numériques, pas les vrais int.

C'est pas faux, mais c'est ce qu'on peut attendre d'au moins $_GET et $_POST il me semble.
Ceci dit le premier commentaire de la page du manuel PHP pour ctype_digit() (#108712" rel="external nofollow" class="outbound">http://www.php.net/manual/fr/function.ctype-digit.php#108712) fournit une fonction toute bête pour valider correctement dans tous les cas.

Sinon si tu utilises is_numeric() il faut utiliser intval() derrière, on est d'accord.
Commentaire #83992 écrit par John le 19/03/2013 à 13h56 | 👍🏽 👎🏽
@Captain Obvious
En fait je le fait surtout pour le slip et les collant...
Commentaire #84097 écrit par blag le 19/03/2013 à 20h12 | 👍🏽 👎🏽
« c'est l'ancienne méthode pour se connecter aux base de données. »
Waouw, je prend un coup de vieux, là. (Et j'ai 19 ans)
Commentaire #84988 écrit par ProgVal le 24/03/2013 à 00h55 | 👍🏽 👎🏽
Oui, mais je maintien, c'est une ancienne méthode, qui ne devrais plus être utilisé (et si tu savais le nombre d'horreur que j'ai vu avec les mysql_...).

J'appuie mon propos directement par la doc PHP (oui, je vais pas faire les choses à moitié) :
Cette extension est obsolète depuis PHP 5.5.0 et n'est pas recommandée pour écrire vos nouvelles lignes de code, sachant qu'elle sera supprimée dans un futur proche.
cf : http://www.php.net/manual/fr/intro.mysql.php

À la place il est recommandé de passer à PDO (ce que j'utilise), ou à mysqli_ (et pas comme un sauvage si possible...).
Commentaire #84996 écrit par blag le 24/03/2013 à 03h05 | 👍🏽 👎🏽