- Register
Lang: [automatic], [fr], [en], … | Go to the top!
Information: Register ot log in to be able to participate to Olissea forums.
BBS List:
[PHP] Je ne t'aime pas
Page 1 / 1
JeromeJ
[Avatar de JeromeJ]
posted on
10-21-2012 at 9:29 pm
Légende vivante
[Answer already read]
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 :D 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:

Quote:
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 :p



Attention, je prévois du troll 8D
------------------------------------------
"Olissea en force | (╯°□°)╯︵ ┻━┻ Hmm… ಠ_ಠ | Vertuous circles ☺"
JeromeJ
[Avatar de JeromeJ]
posted on
06-19-2013 at 5:21 am
Légende vivante
[Answer already read]
  • Ajout du point 5).
  • Amélioration de la mise en page.
------------------------------------------
"Olissea en force | (╯°□°)╯︵ ┻━┻ Hmm… ಠ_ಠ | Vertuous circles ☺"
JerryWham
posted on
06-20-2013 at 12:17 am
Nouveau
[Answer already read]
À la place de ta fonction :
$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;


j'aurais mis :
$name = '-tkdfjglka-tqdsfiti-tosqdtotutu-';
echo 'v'.preg_replace_callback('!(\w*)(?=-)(-)?!U', function ($match) use($name) {
if ($name[0] == '-' && $match[0] != '' && $match[0] != '-') return '0_'.$match[0].strpos($match[0].substr($name,1), $match[0].'-').'_';
elseif($match[0] != '' && $match[0] != '-') return $match[0].strpos($match[0].$name, $match[0].'-').'_';
 
}, $name);


Voilou
JeromeJ
[Avatar de JeromeJ]
posted on
06-20-2013 at 12:42 am
Légende vivante
[Answer already read]
Quote by "JerryWham":
A la place de ta fonction :
$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;


j'aurais mis :
[…]


Salut, merci pour ta réponse :)

Ceci dit, je n'obtiens pas la même résultat avec ta fonction qu'avec la mienne !

Quote:
v0_tkdfjglka9_0_tqdsfiti18_0_tosqdtotutu30_ # Avec la tienne
v0_tkdfjglka10_tqdsfit19_-tosqdtotu31_u- # Avec la mienne


C'est ptêt dût à une bêtise; faudrait que j'analyse ton code, il a l'air chouette :p.

Note: Mon mien bogue aussi avec les chaînes plus longues de 11 caractères (comme dit plus haut dans mon premier message), il ne se décale pas assez (comme on peut le voir avec 19_-) mais j'ai, par chance, seulement à faire à des chaînes de 11 caractères alors je m'en fou un peu ^^ (bouuh pas bien !)
------------------------------------------
"Olissea en force | (╯°□°)╯︵ ┻━┻ Hmm… ಠ_ಠ | Vertuous circles ☺"
Piiu

posted on
06-20-2013 at 12:33 pm
Acharné 4+
[Answer already read][CENSORED MESSAGE] (Display/Hide this message)
------------------------------------------
"K + P"
JeromeJ
[Avatar de JeromeJ]
posted on
09-10-2013 at 2:20 pm
Légende vivante
[Answer already read]
En vlà une bien bonne :D 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:

Quote:
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
------------------------------------------
"Olissea en force | (╯°□°)╯︵ ┻━┻ Hmm… ಠ_ಠ | Vertuous circles ☺"
Bronco
[Avatar de Bronco]
posted on
09-10-2013 at 6:00 pm
Indécis
[Answer already read]
Rhaaaa la mauvaise foi ! ^^
Même si le html a bien été interprété, il en va tout autrement du javascript, en effet:

<?php
$a=array();
echo $a["<script>alert('test');</script>"];
?>


ne fonctionne pas !
"Notice: Undefined index: <script>alert('test');</script> in C:\Dropbox\UwAmp\www\TEST\aeff.php on line 3"

Il n'y a donc pas de faille XSS réelle... ou alors montre-moi un code qui exploite cette faille (je peux me tromper et je suis très curieux !!! ^^):troll:
JeromeJ
[Avatar de JeromeJ]
posted on
09-11-2013 at 11:10 am
Légende vivante
[Answer already read]
Ah tiens bizarre … Chez moi ça s'exécute ! T'as essayé de me hacker ? :p lol

Bizarre, bizarre. Tu as quelle version de PHP ? Un gestionnaire d'erreur personnalisé ?
Moi j'ai 5.5 …

À moins que là tu l'aies fait sur une donnée sanitized ?

Shaarlien : http://www.olissea.com/mb/links/1/?HnCsbg

EDIT: Il semblerait que Bronco aie un ptit plugin local qui le protège ^^ c'est de la triche !
------------------------------------------
"Olissea en force | (╯°□°)╯︵ ┻━┻ Hmm… ಠ_ಠ | Vertuous circles ☺"
JeromeJ
[Avatar de JeromeJ]
posted on
09-12-2013 at 6:59 pm
Légende vivante
[Answer already read]
htmlspecialchars
sous certaines conditions (qui me sont inconnues) renvoie une chaîne vide sans prévenir ! Bon débogage !

PHP m'épatera toujours. Langage de suicidaire moi j'dis :p
------------------------------------------
"Olissea en force | (╯°□°)╯︵ ┻━┻ Hmm… ಠ_ಠ | Vertuous circles ☺"
JeromeJ
[Avatar de JeromeJ]
posted on
02-11-2014 at 6:06 pm
Légende vivante
[Answer already read]
(18:02:18) jeromej: tin quoi
(18:02:25) jeromej: allez encore un bon exemple d'anti-php
(18:02:37) jeromej: pourquoi je peux pas avoir un truc simple pour avoir un array_map sur les clés ?
(18:03:12) jeromej: en Python (3 uniquement je crois ? mais qui utilise encore Python2 anyway :p), j'ai qu'à faire un dict comprehension ^^
(18:03:24) jeromej: (et y a plein d'autres façons d'y parvenir aussi sinon je crois :p)
(18:03:56) jeromej: mais là c'est juste pain in the ass, ou alors avec de gros 'hack' ou faut modifier une variable par référence. Stupid!

EDIT: Pour les suicidaires ou les malchanceux étant forcé à faire un peu de PHP, voici la meilleure "solution"/hack que j'ai, finalement, trouvé personnellement : http://stackoverflow.com/a/13462039/1524913

Le code (En cas de lien mort) (Cliquer pour afficher)Le code (En cas de lien mort) (Cliquer pour cacher)
 
$arr = array('a','b','c','d');
$assoc_arr = array_reduce($arr, function ($result, $item) {
$result[$item] = (($item == 'a') || ($item == 'c')) ? 'yes' : 'no';
return $result;
}, array());
var_dump($assoc_arr); // array(4) { ["a"]=> string(3) "yes" ["b"]=> string(2) "no" ["c"]=> string(3) "yes" ["d"]=> string(2) "no" }
 

En Python : (Une des façons)
Click to display/hideCacher le spoiler
# Exemple un peu farfelu réalisé pour ressembler à la version PHP
 
# J'aurais pu utilisé une list pour conserver l'ordre mais je cherche à pouvoir modifier les clés!
my_dict = {0: 'a', 1: 'b', 2: 'c', 3: 'd'}
 
# Si j'avais utilisé une list, j'aurais utilisé enumerate(my_list) ici après le "in"
my_new_dict = {k:('yes' if (v == 'a' or v == 'c') else 'no') for k,v in my_dict.items()}
my_new_dict = {k:'yes' if v in 'ac' else 'no' for k,v in my_dict.items()} # Aurait également fonctionné
 
print(my_new_dict)
------------------------------------------
"Olissea en force | (╯°□°)╯︵ ┻━┻ Hmm… ಠ_ಠ | Vertuous circles ☺"
JeromeJ
[Avatar de JeromeJ]
posted on
02-11-2014 at 6:39 pm
Légende vivante
[Answer already read]
enumerate (de Python) en PHP : http://stackoverflow.com/a/3561009/1524913 (Derp, derp, …)

Code (En cas de lien mort) (Cliquer pour afficher)Code (En cas de lien mort) (Cliquer pour cacher)
 
// for i, val in enumerate(lst): # En Python
foreach(array_values($lst) as $i => $val) { // You have to use array_values to make sure to reset the keys
echo $i,' ',$val,'<br />';
}
 

La doc Python ne faisant pas très bel honneur à enumerate (je trouve), voici rapidement un exemple :
enumerate expliqué (Cliquer pour afficher)enumerate expliqué (Cliquer pour cacher)
 
my_list = ['a', 'b', 'c']
for n, element in enumerate(my_list):
print(n, element)
 
# Will output:
# 0 a
# 1 b
# 2 c
 

Bon, je dois avouer que celui-ci est moins clash, mais je préfèrerais toujours Python dans 99% des cas.

Autre comparaison pour le fun pour la route (Cliquer pour afficher)Autre comparaison pour le fun pour la route (Cliquer pour cacher)
Off topic:
if k.startswith('[') and k.endswith(']'): return d(k[1:-1]) # Python (Plus élégant et compréhensible :) na!)

if($k[0] == '[' && $k[-1] == ']') return d(substr($k, 1, -1)); // PHP

EDIT: LOL, j'avais oublié, PHP ne gère même pas les index négatifs x) looser!
if($k[0] == '[' && substr($k, -1) == ']') return d(substr($k, 1, -1)); // PHP
------------------------------------------
"Olissea en force | (╯°□°)╯︵ ┻━┻ Hmm… ಠ_ಠ | Vertuous circles ☺"
JeromeJ
[Avatar de JeromeJ]
posted on
02-11-2014 at 8:47 pm
Légende vivante
[Answer already read]
PHP ? Facile pour les débutants ?

Non, pardi ! ;D Vous devez être un véritable pro, des années d'expériences (et encore c'est pas sûr de suffir) afin d'apprendre à éviter toutes les failles présentes dans PHP. :3

Yum, yum: http://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html

mysql_real_escape_string ne vous protège pas. :o
------------------------------------------
"Olissea en force | (╯°□°)╯︵ ┻━┻ Hmm… ಠ_ಠ | Vertuous circles ☺"
JeromeJ
[Avatar de JeromeJ]
posted on
04-20-2014 at 8:29 pm
Légende vivante
[Answer already read]
Toujours à propos de l'UTF-8 : En fait, c'est pas juste qu'il est dur à implémenter en PHP, c'est aussi qu'en fait il supporte tout juste pas l'UTF-8 nativement.

Selon PHP, 1 byte = 1 caractère.

Done.

Oui, vous avez bien lu. Le grand n'importe quoi.

.-.
------------------------------------------
"Olissea en force | (╯°□°)╯︵ ┻━┻ Hmm… ಠ_ಠ | Vertuous circles ☺"
JeromeJ
[Avatar de JeromeJ]
posted on
06-25-2014 at 6:01 pm
Légende vivante
[Answer already read]
------------------------------------------
"Olissea en force | (╯°□°)╯︵ ┻━┻ Hmm… ಠ_ಠ | Vertuous circles ☺"
JeromeJ
[Avatar de JeromeJ]
posted on
03-24-2016 at 12:31 am
Légende vivante
[Answer already read]
TODO: Translate this page in English. :D
------------------------------------------
"Olissea en force | (╯°□°)╯︵ ┻━┻ Hmm… ಠ_ಠ | Vertuous circles ☺"
Page: 1
Answer this topic
Quick answer: