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.
Un ami, développant un CMS personnel, me vante « l'ultra-méga-giga-téra sécurisation » de son bébé, notamment grâce à son idée géante de « variables dynamiques ». Il me met ainsi au défi de trouver une faille de sécurité dans son code.
En ouvrant le fichier login.php, je trouve cet extrait de code :

if ($logintest == $loginbdd OR $passtest == $passbdd) {
   $true = true;
   var $login = $true;
}
else {
   $true = false;
   $login = $true;
}

Je vois. Multiples PEBKAC.
PEBKAC #7521 proposé par caus909 le 10/04/2013 | 48 commentaires | 👍🏽 👎🏽 +227
Les variables dynamiques sont pourtant recommandées par la HADOPI, c'est le seul moyen de sécuriser une application.
Commentaire #88101 écrit par Christine A. le 10/04/2013 à 08h41 | 👍🏽 👎🏽
regarde le code d'un air bovin

Captain, je comprends pas D:
Commentaire #88106 écrit par ROB le 10/04/2013 à 08h59 | 👍🏽 👎🏽
crache son café partout sur son clavier

il a sa place sur The Daily WTF, celui-là !
Commentaire #88108 écrit par b0fh le 10/04/2013 à 09h06 | 👍🏽 👎🏽
fait la pose de super-héros avec le poing levé

A ton service, brave ROB !

- le test qui vérifie si le login OU le password sont corrects
- l'utilisation incohérente de var
- le $true = false absolument pas absurde
- l'anti-pattern classique à éviter a tout prix: if (truc) {r=true} else {r=false}, a remplacer systématiquement par r = truc

s'envole vers d'autres aventuresques aventures !
Commentaire #88109 écrit par Captain Obvious le 10/04/2013 à 09h12 | 👍🏽 👎🏽
En effet c'est très secure comme CMS, plus qu'à connaître un login et OSEF du MdP :)
Commentaire #88118 écrit par Shadam le 10/04/2013 à 09h41 | 👍🏽 👎🏽
Et si tu met en pass un truc comme azerty, ou 1234, qui correspond a 30 ou 40 comptes dans la DB, ça fait quoi?
Commentaire #88119 écrit par defunes43 le 10/04/2013 à 09h48 | 👍🏽 👎🏽
admin ?
Commentaire #88126 écrit par Acorah le 10/04/2013 à 10h14 | 👍🏽 👎🏽
Venez donc me remplacer dans une entreprise innovante dirigée par une personne qui pense comme vous : celle de mon cher ami
Commentaire #88132 écrit par Aaargh!!! le 10/04/2013 à 10h19 | 👍🏽 👎🏽
Dans ce cas, ça connecte sur le premier compte de la BDD (par l'id) ayant ce mot de passe.
Le pire, c'est qu'il ne m'a pas cru sur le coup, il a fallu une démonstration pour le lui prouver.
Il m'a d'ailleurs sorti d'autres idioties, l'une d'entre elle est déjà envoyée depuis quelques temps, je vais soumettre les autres ;).
Commentaire #88133 écrit par caus909 le 10/04/2013 à 10h25 | 👍🏽 👎🏽
Exact :).
Commentaire #88135 écrit par caus909 le 10/04/2013 à 10h34 | 👍🏽 👎🏽
CMS personnel... J'espère que ça ne va pas sortir de son ordi !

<HS>Clem, pendant quelques instants j'ai vu le code du PEBKAC en mode <code>, puis en revenant sur la page j'ai vu les markdown `...` autour, et là je ne les vois plus (Edit: je les vois). T'es en mode test de markdown sur les PEBKAC ?</HS>
Commentaire #88136 écrit par juu le 10/04/2013 à 10h39 | 👍🏽 👎🏽
"le $true = false absolument pas absurde" : le vrai Captain Obvious aurait dit "le $true = false absolument absurde"

Aussi, si truc est bien une expression conditionnelle on peut avoir r = truc, sinon il faut le caster en bool pour l'attribuer à r.
Commentaire #88137 écrit par juu le 10/04/2013 à 10h42 | 👍🏽 👎🏽
Des variables dynamiques ! C'est une révolution.

Moi qui croyais qu'on ne pouvait jamais changer la valeur d'une variable, ça va changer ma vie.
Commentaire #88140 écrit par FBM le 10/04/2013 à 10h46 | 👍🏽 👎🏽
Oh si, ça va sortir de son ordinateur (enfin , s'il le finit un jour), il pense même pouvoir réussir à détrôner tous les CMS actuels...
Pour les Markdown, de même chez moi. Clem ?
Commentaire #88142 écrit par caus909 le 10/04/2013 à 10h49 | 👍🏽 👎🏽
Une variable dynamique, c'est une variable dont le nom est variable (et il n'y en a pas dans ce pebkac) :-)
Par exemple en PHP :
 $a = 'truc';
 $$a = 'machin';
 echo $truc; // affichera "machin"
 

$$a est une variable dynamique car son nom dépend de la valeur de $a
Commentaire #88145 écrit par juu le 10/04/2013 à 10h59 | 👍🏽 👎🏽
Je crois qu'il a confondu avec $$var du PHP... Exemple :
$foo = 'bar';
 $bar = 42;
 echo $$foo;

On aura 42 en résultat.

Disclaimer : ça fait très longtemps (environ 10 ans) que je n'ai pas fait de PHP, je peux me tromper...
Edit : grillé le temps que j'écrive mon commentaire, mais mon exemple fonctionne dans l'autre sens.
Commentaire #88146 écrit par Acné le 10/04/2013 à 11h01 | 👍🏽 👎🏽
J'aurais juste une question aux gourous du PHP : le fait de déclarer une variable avec le var $login dans le bloc de condition, est-ce que ça restreint la visibilité de ladite variable au bloc ? C'est à dire, est-ce que $login sera toujours à true après l'exécution du code en exemple ?
Commentaire #88148 écrit par Acné le 10/04/2013 à 11h05 | 👍🏽 👎🏽
Si mes souvenirs sont bons, cela servait auparavant en PHP orienté objet (ce qui n'est pas le cas de ce PEBKAC) pour déclarer les variables de classes. Désormais, c'est déprécié. Dans le cas de ce PEBKAC, ce "var" n'a vraiment rien à faire là.
Commentaire #88150 écrit par caus909 le 10/04/2013 à 11h10 | 👍🏽 👎🏽
Woot, des balises codes dans les pebkac? Félicitation Clem !
Commentaire #88151 écrit par Link le 10/04/2013 à 11h12 | 👍🏽 👎🏽
Mon dieu, celui là c'est vraiment du lourd :)
Commentaire #88154 écrit par superzamp le 10/04/2013 à 11h22 | 👍🏽 👎🏽
Et surtout, si c'est ce $login qui fait valeur de validation, bah il est toujours true, dans le if et dans le else...
Commentaire #88155 écrit par Nouanda le 10/04/2013 à 11h37 | 👍🏽 👎🏽
ha non, merde, j'avais pas vu que c'était egal à $true pas à true... (mais quel crétin utilise des variables dont le nom est un mot clef....)
Commentaire #88156 écrit par Nouanda le 10/04/2013 à 11h38 | 👍🏽 👎🏽
Oh
My
God
Commentaire #88157 écrit par Necronours le 10/04/2013 à 11h39 | 👍🏽 👎🏽
C'est en fait ce qu'il entend par "variable dynamique".
Commentaire #88158 écrit par caus909 le 10/04/2013 à 11h42 | 👍🏽 👎🏽
C'est un test, pour voir.
Mais ça ne sera valable que pour le préformaté (<pre> et <code>). Pas poour les styles italic et bold.
Commentaire #88161 écrit par Clem le 10/04/2013 à 12h01 | 👍🏽 👎🏽
Oui ?
Commentaire #88172 écrit par FSM le 10/04/2013 à 12h42 | 👍🏽 👎🏽
Tu n'a le droit de "localiser" tes variables que avec de l'OO ou dans les fonctions procédurale.
Pour le reste la variable a une porté classique sur le code qui la suit (inclusion php comprise).
Commentaire #88180 écrit par blag le 10/04/2013 à 13h00 | 👍🏽 👎🏽
Et je parie que la variable contient le mot de passe en clair et non un hash.
Commentaire #88186 écrit par Ash_Crow le 10/04/2013 à 13h03 | 👍🏽 👎🏽
Comment oses-tu te faire passer pour le seul, l'unique, le tout puissant Permalien ?
Commentaire #88197 écrit par caus909 le 10/04/2013 à 13h33 | 👍🏽 👎🏽
C-C-C-C-COMBO !
Commentaire #88205 écrit par Arnith le 10/04/2013 à 14h00 | 👍🏽 👎🏽
Le mot de passe n'est pas exactement stocké en clair, mais c'est tout comme : il y a un salt (universel, il ne compte pas le faire générer à chaque installation ou à chaque utilisateur), et le mot de passe est stocké après concaténation du salt.
Exemple : si le salt est "banane" et le mot de passe "supertruc", alors en BDD sera stocké "bananesupertruc".
Commentaire #88206 écrit par caus909 le 10/04/2013 à 14h04 | 👍🏽 👎🏽
Ouais, un pointeur quoi... :)
Commentaire #88212 écrit par cpn42 le 10/04/2013 à 14h08 | 👍🏽 👎🏽
Ouaip... il est en clair donc...
Commentaire #88219 écrit par Myosotys le 10/04/2013 à 14h16 | 👍🏽 👎🏽
Ses initiales ne seraient pas Y. A. (prénom nom) ?
Commentaire #88233 écrit par Acorah le 10/04/2013 à 14h52 | 👍🏽 👎🏽
Pas du tout, tu connais quelqu'un de similaire ?
Commentaire #88237 écrit par caus909 le 10/04/2013 à 14h59 | 👍🏽 👎🏽
C'est d'ailleurs en variables dynamique qu'est écrit le pare-feu open-office.
Commentaire #88248 écrit par Blah le 10/04/2013 à 15h59 | 👍🏽 👎🏽
J'ai connu oui. Un patron d'une petite boite à Paris (toute petite, lui et que des stagiaires) qui faisait des choses... Il vendait de l'hébergement web en fait il refilait une offre pamplemousse et s'était inventé un partenariat. Il piquait même sans aucun scrupule de l'espace disque des clients quand il en avait besoin. Genre une maquette à présenter à un client potentiel : "il reste de la place chez XXX t'as qu'à mettre ton site dessus". Environnement de développement local ? De test ? C'est quoi ça ?
Il essayait de vendre des progiciels en php (gestion de fiches clients, CV, compte-rendus d'activité, ou autre) mais c'était des grosses bouses. Des trucs soi-disant modulaires bourrés de choses codées en dur...
J'en ai presque fait des cauchemards la nuit (oui j'ai commis l'erreur de faire un de mes stages là-bas, il arrivait à vendre sa boite le bougre, c'est une fois que tu commençais à bosser que tu voyais l'envers du décor).
Commentaire #88265 écrit par Acorah le 10/04/2013 à 17h42 | 👍🏽 👎🏽
Si tu recommences à appeler Permalien Dieu, il va t'en vouloir. Tout le monde sait que Permalien, lui, existe. (Même s'il existe moins qu'avant par ici. Elimalien, Elimalien, lama sabachthani ?)
Commentaire #88271 écrit par Geist le 10/04/2013 à 18h44 | 👍🏽 👎🏽
Euuuh non pas un pointeur. Si c'était un pointeur, alors on aurait :
$a = 'truc';
 $$a = $a;
 $a = 'machin';
 echo $$a; //Afficherait machin

C'ets plus une évaluation de la valeur (fonction eval() en JavaScript par exemple)
Commentaire #88274 écrit par tony83 le 10/04/2013 à 18h59 | 👍🏽 👎🏽
Je suis d'ailleurs déçu que le PEBKAC ne mette pas en scène cette véritable saloperie fonctionnalité de PHP que sont ces variables dynamiques.

Ça marche même avec de la récursion et de la concaténation, un vrai bonheur !
<?php
 function foo() { return "pro"; }
 function bar() { return "bleme"; }
 
 $baz = "taille";
 
 $taille = "gros";
 $probleme = pebkac;
 
 $grospebkac = "Oh mais quelle horreur !";
 
 echo "/n";
 echo ${$$baz.${foo().bar()}};
 
 // affiche "Oh mais quelle horreur !"
 ?>


J'ai volontairement oublié les guillemets autour de « pebkac » en ligne 8 parce que j'aime bien troller php et sa gestion toute molle des constantes. Ça fait un joli avertissement qui dit « assumed 'pebkac' » et ça me fait rire.
Commentaire #88289 écrit par Hart le 10/04/2013 à 21h01 | 👍🏽 👎🏽
Loin de moi cette idée, je suis juste le dieu de Necronours. Permalien, c'est le --N+1-- N+∞.
Commentaire #88294 écrit par FSM le 10/04/2013 à 22h23 | 👍🏽 👎🏽
@cpn42, pas vraiment, les pointeurs en PHP s'utilisent avec le signe &, du genre :
 $a = 'tata';
 $b = &$a;
 $b = 'baba';
 echo $a; // affiche baba
 unset($a);
 echo $b; // affiche baba
 
Commentaire #88302 écrit par juu le 11/04/2013 à 09h55 | 👍🏽 👎🏽
caus909:

Tu voulais dire hash(bananesupertruc), rassure moi ?

Captain Obvious:

- le test qui vérifie si le login OU le password ne sont même pas corrects, il faut mettre === en PHP, pour éviter certains problèmes :)
Commentaire #88314 écrit par n0p le 11/04/2013 à 11h01 | 👍🏽 👎🏽
Pas de hash n0p.
Dans le cas présent, l'opérateur d'identité n'est pas nécessaire, les cas où ça poserait problème ne peuvent pas survenir au vu du code plus en amont, je ne m'en souviens plus exactement, mais juste qu'il avait réglé certains trucs avant.
Commentaire #88315 écrit par caus909 le 11/04/2013 à 11h12 | 👍🏽 👎🏽
Vous êtes vraiment six à causer hébreu ? (Ou à avoir ce niveau de références ?) Si c'est le cas, je suis bluffé.

(Note pour la postérité : À l'heure où je tape cruellement et sans pitié ces lignes, y a six «thumbs up» à mon précédent commentaire.)
Commentaire #88325 écrit par Geist le 11/04/2013 à 13h05 | 👍🏽 👎🏽
@juu, pas vraiment des pointeurs non plus, puisque ce sont des références.
http://ch.php.net/manual/fr/language.references.php
Commentaire #88382 écrit par sebyx le 11/04/2013 à 15h16 | 👍🏽 👎🏽
It's getting old, pal. :(
Commentaire #88437 écrit par OzoneGrif le 11/04/2013 à 18h51 | 👍🏽 👎🏽
Ah exact, je voyais ça comme le cas le plus approchant, comparé aux variables dynamiques.
Commentaire #88465 écrit par juu le 11/04/2013 à 20h55 | 👍🏽 👎🏽