wget erreur 400 de PHP, 200 à partir de la ligne de commande

voix
0

A partir de la ligne de commande (via SSH sur mon serveur) cela fonctionne:

wget https://www.example.com/script?paramA=1234&paramB=ABCD

de PHP sur le même serveur:

$url = https://www.example.com/script?paramA=1234&paramB=ABCD;
exec(/usr/bin/wget $url);

Je reçois:

HTTP request sent, awaiting response... 400 Bad Request
2018-11-07 15:01:21 ERROR 400: Bad Request.

Qu'est-ce qui se passe ici?

Créé 07/11/2018 à 20:09
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
2

Voyons voir, ce qui est différent entre les deux?

wget "https://www.example.com/script?paramA=1234&paramB=ABCD"

CONTRE

$url = "https://www.example.com/script?paramA=1234&paramB=ABCD";
exec("/usr/bin/wget $url");

Prenons votre code PHP: Si vous imprimez echo $urlvous obtiendrez:

https://www.example.com/script?paramA=1234&paramB=ABCD

Littéralement.

Alors, qu'est - ce qui se passe dans votre appel exec alors? si vous echo "/usr/bin/wget $url"vous obtiendrez:

/usr/bin/wget https://www.example.com/script?paramA=1234&paramB=ABCD

Littéralement. Maintenant, quelle est la différence entre

wget "https://www.example.com/script?paramA=1234&paramB=ABCD"

et

/usr/bin/wget https://www.example.com/script?paramA=1234&paramB=ABCD

Bien sûr , il est le chemin: /usr/binmais ... Si vous l' essayez, vous verrez que ce n'est pas votre problème ...

Quoi d'autre ? Les citations. L'URL de votre commande shell est enveloppé entre guillemets, alors que ce n'est pas, dans celui généré par votre code PHP.

Comme mentionné par @ArtisticPhoenix dans les commentaires, vous pouvez utiliser la fonction php escapeshellarg()sur votre variable $ url. Il ajoutera les guillemets autour de votre URL (et assurez - vous que votre chaîne reste une chaîne, pour éviter l' injection, par exemple) et votre commande devrait fonctionner correctement.

Si vous voulez savoir ce qui se passe ici, c'est que le &symbole dans votre URL est analysée par la console qui exécutent deux commandes au lieu d'un seul. Votre appel url (avec paramBmanquant et une autre commande paramB=ABCDqui crée une variable dans votre shell. Vous pouvez le voir en tapant echo $paramBqui imprimeront ABCD dans votre console. L'API que vous appelez dépend probablement paramBd'être présent, par conséquent, vous retournant une 400 erreur .

J'espère que cela t'aides. Bonne chance.

Créé 07/11/2018 à 20:56
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more