INTERDIRE LE PASSAGE DE FONCTION DANS UNE URL

- - Dernière réponse : cs_christophedlr
Messages postés
257
Date d'inscription
samedi 3 janvier 2004
Statut
Membre
Dernière intervention
30 mai 2016
- 30 mai 2016 à 14:58
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/55117-interdire-le-passage-de-fonction-dans-une-url

Je ne vois pas ce que cela protège. Aucune explication précise. Dans l'exemple, ça bloque les requêtes autres que sur celles de l'index ainsi que les paramètres GET. Ça pourrait se résumer par http://pastebin.com/P95PAnXy
Et enfin, en quoi il est obligatoire d'utiliser une meta refresh? header() est parfaitement utilisable dans le cas présent.
de 1 : header location ne peu pas etre utiliser puisque d'autre fonction php son utiliser avant celle ci
de 2 : le délimiteur étant dans l'exemple .be, si l'url est http://www.monsite.be, le simple fait de mettre un ? dans l'url et ou tout autre signe ou commande fait automatiquement rediriger
de 3 : j'aie préciser que cela s'utilise sur des url propre qui rewriter donc sans paramètre au départ d'où l'intérêt de la fonction
cs_emilia123
Messages postés
122
Date d'inscription
mercredi 19 décembre 2001
Statut
Membre
Dernière intervention
5 janvier 2009
-
Bonjour,

Il y a un problème à pratiquement chaque ligne :( ca ne PEUT PAS être un code initié.

1) aucune classe ni fonction PHP => c'est à banir d'un développement "initié"

2) il n'y a aucun commentaire dans le code => c'est obligatoire dans un développement "initié"

3) parfois il y a utilisation des "..." et parfois des '...' Pour une simplification de la lecteur, il faudrait essayer d'utiliser tout le temps le même (et de préférence les simples quotes)

4) dans le code :
----------------------------
$url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
$chaine = $url;
----------------------------
à quoi sert la variable "$url" ?
A rien, elle est simplement recopiée dans $chaine puis n'est plus utilisée...on peut donc mettre $chaine sur la 1ere ligne, cela évitera d'utiliser de la mémoire pour rien.

5) dans le code :
----------------------------
$extension = $tab[count($tab)-1];
----------------------------
Il n'y a aucune vérification sur l’existence de la case du tableau... même si cela ne semble pas pouvoir se produire il faut prendre l'habitude d'effectuer des vérifications.

6) ce type de condition
----------------------------
if($extension)
----------------------------
est vraiment à bannir...
Exemple : si je passe http://www.monsite.be/0 (c'est un zero à la fin) alors il la vérification échoue, alors que pourtant il y a bien du code apres le délimiteur.
dans les conditions il faut TOUJOURS être strict c'est à dire :
- TOUJOURS comparer 2 éléments entre eux
- TOUJOURS comparer le type de ces 2 éléments (test strict)
donc la cela pourrait être :
----------------------------
if (trim($extension)!=='')
----------------------------
on compare $extension à la chaine de texte ''et surtout le fait d'utiliser !(ou) force aussi PHP à comparer le type des 2 éléments.

7) il faut utiliser des noms de variables qui sont compréhensible
par exemple :
- avec "$extension" on pourrait penser à l'extension du nom de domaine, mais ca n'est pas le cas (quel est le rapport entre une extension et le texte à la fin d'une URL ?)
- avec "$chaine" qui est générique et qui ne dit pas ce qu'il y a dans la variable

8) dans le code
--------------------------
echo '<meta http-equiv="refresh" content="0;URL=l'adresse de votre choix">';
--------------------------
pourquoi ne pas utiliser une variable à la place de "l'adresse de votre choix".. c'est vraiment pas top d'avoir à rechercher dans le code HTML une variable à adapter.
Il y a des variables déclarées mais qui ne servent pas, là c'est le contraire, cela pourrait servir mais il n'y a rien.

9) enfin le meta :
--------------------------
echo '<meta http-equiv="refresh" content="0;URL=l'adresse de votre choix">';
--------------------------
Si ce "code" est utilisé n'importe où dans la page, au mieux il sera juste inefficace...
Pourquoi ne pas utiliser "header(...)" en vérifiant que les entêtes n'ont pas déjà été envoyées ?
Le fait d'utiliser un simple "meta" fait que l'intégralité du code PHP est exécuté même si l'url est censée être "protégée".

10) enfin et pour finir... le principe de fonctionnement du code PHP
Au lieu de faire des explodes et des tests bizarres sur des variables écrites en dur dans le code... il faudrait partir des variables "server" que proposer PHP à savoir :
$_SERVER['REQUEST_URI'] => url apres le nom de domaine
ou
$_SERVER['QUERY_STRING'] => url après le ? (si il y en a un)
du coup un simple "trim(...)" sur l'une des 2 variables au dessus donne un résultat beaucoup plus précis et ne nécessite aucune adaptation du délimiteur ni aucun découpage de chaine.

Désolés d'être brutale comme cela, mais parler de sécurité, indiquer un niveau "initié" mais avec un "code" comme celui présenté, ce n'est pas bon.
Un utilisateur débutant pourrait penser que c'est un exemple à suivre alors que non.

conseils :
1) créer une classe et des fonctions pour regrouper tout ton code
2) vérifier quelque chose de précis (utiliser des tests stricts )
3) être un peu plus pointilleux (simple quote, nom des variables, utilisation des variable, etc)
4) revoir un peu la logique de fonctionnement (quelle variable tester, et comment effectuer la redirection)

bonne continuation

EM.
le fait d'utiliser les guillemets et apostrophes évite d'utiliser les antislash ensuite pourquoi toujours cherché à faire des codes hyper compliqués quand de simple fonction fonctionne très bien, fonction url est présent car il est utiliser ailleurs pour d'autre nécessité
cs_emilia123
Messages postés
122
Date d'inscription
mercredi 19 décembre 2001
Statut
Membre
Dernière intervention
5 janvier 2009
-
heuu comment dire...
Si tu ne prends pas en compte les commentaires (enfin si tu les rejettes tous) ce n'est pas la peine qu'on perdre du temps à t'en faire.
Donc je dirais même, pourquoi nous montrer ton "code" ?

--------------------------
le fait d'utiliser les guillemets et apostrophes évite d'utiliser les antislash
--------------------------
rien à voir avec les antislashs....
les guillemets demandent PHP de rechercher des variables dans le texte ($...) et à faire les remplacements qui s'imposent.
Avec les simples quottes, PHP ne fait aucun traitement.

Cela ne doit pas être une question de "confort".

De plus il y a une perte de performances lorsque des variables sont incluses dans les guillemets en comparaison d'une concaténation simple.

--------------------------
pourquoi toujours cherché à faire des codes hyper compliqués
--------------------------
C'est justement parce que ton code est trop compliqué (par rapport à ce qu'il fait) qu'on te fait des remarques.
Après si tu penses que c'est inutile de :
- faire des vérifications propres,
- vérifier l'existence des variables,
- être constant dans l'écriture du code PHP,
- utiliser le moins possible de valeur en dur,
- ou être pointilleux dans les noms utilisés
... alors tu vas au devant de gros problèmes avec tes développements avec :
- des failles de sécurité
- des problème de fonctionnement,
- des problème de relecture de ton code après 1 mois sans y avoir touché, etc...

Exemple de test "simple" et de faille de sécurité :
Par exemple oui, pour PHP 0=='mot de passe super sécurisé'
C'est une faille de sécurité très basique et très facile à exploiter.
Tu peux tester ici :
http://sandbox.onlinephpfunctions.com/code/26b0f9aaa9ecea8304dcd34dc27166448fc97fec

--------------------------
url est présent car il est utiliser ailleurs pour d'autre nécessité
--------------------------
Et alors?
Si tu utilises une même donnée à 20 endroits, tu utiliserais donc 20 variables?
Tu nous montres un code que tu considères en "initié", il doit donc être propre.

EM.