2017-09-13 2 views
0

J'ai un script PHP simple qui montre quelques informations à un utilisateur. Je veux raccourcir cette information autant que possible si la même page est demandée avec cURL ou sauvegardée avec Wget.Détecter en PHP si la page est accessible avec cURL ou Wget

J'ai vu plusieurs questions similaires sur Stackoverflow, mais ils ont quelques extras comme "I want to block cURL" ou "rediriger une demande de formulaire si ...". Les réponses indiquent généralement qu'il n'est pas possible de détecter une requête cURL de manière fiable, car cURL permet à l'utilisateur de modifier tous les paramètres de requête et de prétendre être un navigateur. C'est bon pour moi, je ne veux pas bloquer cURL, je veux offrir un service supplémentaire pour une demande générique cURL (et Wget).

+0

Si votre utilisateur est assez intelligent pour automatiser, alors fournissez une URL différente à cette fin? c'est-à-dire des pages séparées pour la consommation humaine et des pages pour la consommation de logiciel en fournissant une API. –

+0

Il ne devrait pas être nécessaire d'être assez intelligent;) Un exemple de service est ifconfig.io → Demande via le navigateur: beaucoup d'informations. Demande via cURL: L'adresse IP seulement. Je veux atteindre le même comportement utile. – pixelbrackets

Répondre

2

S'il n'est pas configuré, cURL et Wget utilisent une chaîne personnalisée »User Agent« pour leurs requêtes. Par exemple curl/7.47.0 ou Wget/1.17.1 (linux-gnu). Vous pouvez tester cette facilité sur https://requestb.in.

Plusieurs applications peuvent accéder à la chaîne User Agent dans l'en-tête de la demande. En PHP c'est disponible dans la variable $_SERVER['HTTP_USER_AGENT'].

Donc, pour détecter une cURL ou Wget demande et offrent un contenu différent, vous pouvez utiliser

<?php 

// Catch cURL/Wget requests 
if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/^(curl|wget)/i', $_SERVER['HTTP_USER_AGENT'])) { 
    echo 'Hi curl user!'; 
} 
else { 
    echo 'Hello browser user!'; 
} 

?> 

Dans mon application, je perçois la demande cURL puis laisser le processus die() dans la boucle if. Donc, si c'est juste un navigateur, la condition ne correspond pas et exécute tout le code PHP suivant. Comme indiqué précédemment, cURL et Wget permettent à l'utilisateur de définir un agent utilisateur arbitraire. Mais pour le service demandé, cette solution est suffisante.