Intro
C'est bizarre, j'aurais juré avoir déjà fait ce sujet quelque part Oo
Je n'aime pas PHP, pour plusieurs raisons, qui lorsque je les recroiserais je ne manquerais pas de venir les reporter ici.
D'autres ont déjà fait des articles là dessus, je ne suis ni le premier ni le dernier.
PHP n'a pas que des tords mais quand bien même … c'est grave pour une langage si répandu >.< (et dangereux)
EDIT: (╯°□°)╯︵ ┻━┻ Ces émoticônes conviennent très bien à l'immense bêtise de PHP. ಠ_ಠ
Vif du sujet
1) Allant de l'énorme faille (selon moi) que PHP exécutera un bloc (délimité par "{ }" ) même si rien ne le précède, du style :
{
echo 'PHP m\'exécute !! Trololol';
}
Ce qui permettrait entre autres, sur simple faute de frappe, d'exécuter du code admin.
if($admin); # Oups faute de frappe
{
afficherCodeLanceMissile();
}
Aie … car oui on peut aussi faire un if sans bloc derrière.
/double-facepalm
2) Plus récemment, je voulais juste remplacer dans une chaine de caractères par un autre et mettre devant le caractère remplacer sa position …
Bon bah en Python, je sais faire ça en une ligne sans devoir aller dans le doc. (fonctionne en python 2 et 3)
name = 'v' + ''.join(str(n)+'_' if c == '-' else c for n, c in enumerate(id))
En PHP, passage j'ai pensé à un preg_replace_callback avec les flags permettant de capturer la position de ce que la REGEX allait trouver, donc je dois déjà me rendre dans la doc pour savoir quel est le nom du flag … pour me rendre compte que preg_replace_* n'accepte pas de flag <_<
Bon alors obligé de faire un hack avec preg_match_all, qui soit dit en passant à un fonctionnement trop zarb :/
Non on ne peut pas faire
$a = preg_match_all(…);
mais on doit faire
preg_match_all(…, $a);
Pourquoi ?? Sérieusement >
donc même si je voulais le faire en une ligne comme en Python je pourrais pas :[ (me créant une variable inutilement au passage) (Pareil pour quelques autres fonctions
)
Ce qui donne donc en PHP : (barbare)
$name = $id;
preg_match_all('#-#', $id, $r, PREG_OFFSET_CAPTURE);
for($i = 0, $count = count($r[0]); $i < $count; $i++) $name = substr_replace($name, $r[0][$i][1].'_', $r[0][$i][1]+$i, 1);
$name = 'v'.$name;
(Si quelqu'un veut une explication du code, qu'il demande (pareil pour la version Python))
EDIT: Par chance pour moi, je viens de remarquer que ce code ne fonctionnerait pas avec une chaine de caractères de plus de 11 caractères (car l'emplacement des '-' vaudrait un nombre (et un plus un chiffre)) donc décaler de $i ne suffit plus, mais dans mon cas à moi, mes chaines ne font jamais plus de 11 caractères, sauvé ! pas besoin de changer le code (le code python ne souffre pas de ce prob)
Si quelqu'un a plus simple, je suis preneur. (Sans rajouter 20 lignes) (et si c'est juste pour des noms de variables, j'm'en fou
ou des optimisations mineurs, du genre:
j'aurais pu rajouter 'v' au début et décaler $i et $count de +1 mais ça embrouillerait le truc déjà assez complex,
j'aurais aussi pu utiliser while pour itérer à l'envers mais ça aurait aussi complexifier la chose)
3)
En Python 2 et 3 :
>>> len('[faites tourner] ALERTE CITOYENNE: NON À ACTA S')
47
>>> len('Charlie Chaplin - The Great Dictator - Final Sp')
47
en PHP:
echo strlen('[faites tourner] ALERTE CITOYENNE: NON À ACTA S'),'<br />'; # Affiche 48
echo strlen('Charlie Chaplin - The Great Dictator - Final Sp'); # Affiche 47
Euuuh ? Je ne cherche même plus à comprendre
(Je m'en fou que le "À" soit probablement codé sur 2 octets (si c'est ça), il m'énerve c'tout ! >
)
4) De la difficulté d'implémenter l'UTF-8 (donc l'Unicode) en PHP:
http://www.phpwact.org/php/i18n/utf-8 En 2013, vous rendez-vous compte ?
5) Ok il semblerait que ce CRÉTIN de http_build_request agisse un peu comme magic_quote puis il urlencode une partie donc on peut pas juste urldecode le tout, stripslashes, puis de nouveau urlencode, il faut donc faire une atrocité du genre :
str_replace('%5C%27', '%27', http_build_request([…]) # Note : %5C%27 correspond à \'
( Post original :
http://www.olissea.com/mb/links/1/?ZWtwow )
6) En vlà une bien bonne
Vous êtes assis, c'est bon ?
Afficher les erreurs PHP, c'est pas juste "pas bien", c'est pas juste "risquer de dévoiler des failles" ou "comment votre programme fonctionne", non non, c'est bien "mieux" que ça.
C'est
carrément directement mettre une faille XSS à disposition :'D
Ah que c'est
chouette nul à chier PHP … J'vous jure ! J'en ai fait des erreurs dans ma vie, mais celle là … Elle est grosse.
$a = array();
$a["lol<b>mdr"];
Affichera:
Citation :Notice: Undefined index: lolmdr in … code on line X
Prouvant bien que l'HTML a été interprété, ooooh la belle faille XSS.
Shaarlien lié : http://www.olissea.com/mb/links/1/?CyDcGA
7) htmlspecialchars
sous certaines conditions (qui me sont inconnues) renvoie une chaîne vide sans prévenir ! Bon débogage !
EDIT: Shaarlien à propos d'htmlspecialchars
PHP m'épatera toujours. Langage de suicidaire moi j'dis
Attention, je prévois du troll