web-dev-qa-db-fra.com

Testez si la chaîne est encodée en URL PHP

Comment puis-je tester si une chaîne est encodée en URL?

Laquelle des approches suivantes est la meilleure?

  • Recherchez dans la chaîne des caractères qui seraient encodés, qui ne le sont pas, et s'il en existe, ce n'est pas encodé, ou
  • Utilisez quelque chose comme ça que j'ai fait:

function is_urlEncoded($string){
 $test_string = $string;
 while(urldecode($test_string) != $test_string){
  $test_string = urldecode($test_string);
 }
 return (urlencode($test_string) == $string)?True:False; 
}

$t = "Hello World > how are you?";
if(is_urlEncoded($sreq)){
 print "Was Encoded.\n";
}else{
 print "Not Encoded.\n";
 print "Should be ".urlencode($sreq)."\n";
}

Le code ci-dessus fonctionne, mais pas dans les cas où la chaîne a été doublement codée, comme dans ces exemples:

  • $t = "Hello%2BWorld%2B%253E%2Bhow%2Bare%2Byou%253F";
  • $t = "Hello+World%2B%253E%2Bhow%2Bare%2Byou%253F";
20
Psytronic

Vous ne saurez jamais avec certitude si une chaîne est encodée en URL ou si elle était censée avoir la séquence %2B dedans. Au lieu de cela, cela dépend probablement de la provenance de la chaîne, c'est-à-dire si elle a été fabriquée à la main ou à partir d'une application.

Est-il préférable de rechercher dans la chaîne des caractères qui seraient encodés, qui ne le sont pas, et s'il en existe, ce n'est pas encodé.

Je pense que c'est une meilleure approche, car elle s'occuperait des choses qui ont été faites par programme (en supposant que l'application n'aurait pas laissé de caractère non codé).

Une chose qui sera source de confusion ici ... Techniquement, le % "devrait être" encodé s'il sera présent dans la valeur finale, car il s'agit d'un caractère spécial. Vous devrez peut-être combiner vos approches pour rechercher des caractères à coder et valider que la chaîne se décode correctement si aucun n'est trouvé.

10
jheddings

j'ai une astuce:

vous pouvez le faire pour empêcher un double encodage. Chaque fois, décodez d'abord puis codez à nouveau;

$string = urldecode($string);

Alors refaites

$string = urlencode($string);

En procédant de cette façon, nous pouvons éviter le double encodage :)

33
Irfan

Voici quelque chose que je viens de mettre en place.

if ( urlencode(urldecode($data)) === $data){
    echo 'string urlencoded';
} else {
    echo 'string is NOT urlencoded';
}
12
AMB

Je pense qu'il n'y a aucun moyen infaillible de le faire. Par exemple, tenez compte des éléments suivants:

$t = "A+B";

S'agit-il d'une URL codée "A B" ou doit-elle être codée en "A% 2BB"?

5
Kaivosukeltaja

Qu'en est-il de:

if (urldecode(trim($url)) == trim($url)) { $url_form = 'decoded'; }
  else { $url_form = 'encoded'; }

Ne fonctionnera pas avec un double encodage mais cela est hors de toute façon je suppose?

3
Sebastian

eh bien, le terme "URL encodée" est un peu vague, peut-être qu'une simple vérification d'expression régulière fera l'affaire

$is_encoded = preg_match('~%[0-9A-F]{2}~i', $string);
3
user187291

Il n'y a aucun moyen fiable de le faire, car il existe des chaînes qui restent les mêmes tout au long du processus de codage, c'est-à-dire est-ce que "abc" est codé ou non? Il n'y a pas de réponse claire. De plus, comme vous l'avez rencontré, certains personnages ont plusieurs encodages ... Mais ...

Votre schéma de décodage, vérification, codage et vérification échoue en raison du fait que certains caractères peuvent être codés de plusieurs manières. Cependant, une légère modification de votre fonction devrait être assez fiable, vérifiez simplement si le décodage modifie la chaîne, si c'est le cas, elle a été encodée.

Ce ne sera bien sûr pas infaillible, car "10 + 20 = 30" renverra vrai (+ sera converti en espace), mais nous ne faisons en fait que de l'arithmétique. Je suppose que c'est ce que vous essayez de contrer, je suis désolé de dire que je ne pense pas qu'il existe une solution parfaite.

HTH.

Éditer:
. S'il n'y en a pas, essayez de décoder et voyez si la chaîne change. Cela ne traitera toujours pas l'arithmétique ci-dessus (ce qui est impossible), mais ce sera, espérons-le, suffisant.

3
falstro

Le code @ user187291 fonctionne et échoue uniquement lorsque + n'est pas codé.

Je sais que c'est un très vieux poste. Mais cela a fonctionné pour moi.

$is_encoded = preg_match('~%[0-9A-F]{2}~i', $string);
if($is_encoded) {
 $string  = urlencode(urldecode(str_replace(['+','='], ['%2B','%3D'], $string)));
} else {
  $string = urlencode($string);
}
2
B L Praveen

envoyer une variable qui marque le décodage lorsque vous obtenez déjà des données d'une URL.

?path=folder/new%20file.txt&decode=1
1
phpBananas

J'ai trouvé.
L'URL est pour Exapmle: https://example.com/xD?foo=bar&uri=https%3A%2F%2Fexample.com%2FxD
Vous avez besoin de $ _GET ['uri'] trouvé est codé ou non:

preg_match("/.*uri=(.*)&?.*/", $_SERVER['REQUEST_URI'], $r);
if (isset($_GET['uri']) && urldecode($r['1']) === $r['1']) {
  // Code Here if url is not encoded
}
0
MDReal

J'utilise le test suivant pour voir si les chaînes ont été urlencodées:

if(urlencode($str) != str_replace(['%','+'], ['%25','%2B'], $str))

Si une chaîne a déjà été encodée en url, les seuls caractères qui seront modifiés par le double codage sont% (qui démarre toutes les chaînes de caractères codées) et + (qui remplace les espaces.) Modifiez-les en arrière et vous devriez avoir la chaîne d'origine.

Faites-moi savoir si cela fonctionne pour vous.

0
Hoytman