Bonjour à tous,

J'ai créé une page web en PHP qui se charge de lire une base de données, et retourne le résultat en un fichier XML (via header content xml).
Le fichier XML se génère bien, pas de souci.

Ensuite j'utilise ce fichier XML en l'appelant dans un script jquery/ajax (distant ou pas, peu importe) dans une autre page.

Ma question est la suivante :
Comment empêcher n'importe qui d'accéder à ce fichier XML (en lisant mon code source par exemple), à l'exception du fichier javascript lui-même. Je voudrais que personne n'arrive à ouvrir le fichier XML en tapant l'URL dans son navigateur.

Car j'ai voulu bêtement interdire l'accès au fichier PHP par restriction IP, mais ça a eu pour résultat d'empêcher le script de s'éxécuter (Logique !) :/

Existe-t-il une solution ?

Merci de votre aide !

5 réponses


PhiSyX
Réponse acceptée

Le lien que je t'ai filé, montre un code qui te permet de vérifier si une requête a l'header X-Requested-With: XMLHttpRequest

Mais comment génère t on un header spécifique ?

Et plus haut dans le lien que je t'ai filé, il y a l'explication:

PhiSyX, Il y a 20 jours
Lorsque tu fais une requête ajax avec jquery, celui-ci envoit un header spécifique qui est X-Requested-With: XMLHttpRequest.
Il te suffit de vérifier au niveau de PHP si l'header existe, et si c'est le cas, tu ne rediriges pas.

Bonsoir.
Tu pourrais par exemple créer un espace membres, ce qui permettrait déja de limiter l'accès à la page aux utilisateurs connectés, et par la suite tu pourras encore plus limiter selon tes désirs.
Ce que tu peux faire aussi, c'est vérifier si la requête sur cette page est bien faite en ajax, ce qui évitera d'y accéder en tapant simplement l'adresse dans l'url du navigateur.

Merci de ta réponse.

Alors pour te répondre en transparence, le but n'est pas d'autoriser des utilisateurs.

En réalité il s'agit d'une liste de points cartographiques Google Maps, qui contient adresses, téléphones, URL...

Je fais une requête Ajax du type :
type: "GET",
url: "monfichier.xml",
dataType: "xml",
success: function(xml) {
...
}

Tout fonctionne bien.
Mais j'ai peur que l'on lise dans le code source et voir dans le js l'URL du fichier XML.

Je veux éviter cela et garder l'URL du XML confidentielle.

Tu peux limiter la resource en vérifiant que la requête a un header spécifique. (Comme l'a proposé Lartak)
Voir ici: https://www.grafikart.fr/forum/topics/24828#p99886

Ce que tu peux faire aussi c'est d'utiliser un système de jeton.
Si ton URL n'a pas un bon jeton de sécurité, tu ne rends pas la page.
Par exemple:

// JAVASCRIPT
window.jetondesecurite = '75745454dd84z6fe4efer5g4e654r98' // généré par PHP (session tout ça)
reqXhr('tonfichier.xml?jeton=' + window.jetondesecurite)
    .then(function success (resp) {
        // Traitement des données
        // Renouvellement du JETON de sécurité XHR ? ;-)
    })
    .catch(function failed (resp) {
        // Failed
        // Renouvellement du JETON de sécurité XHR ? ;-)
    })
# PHP
$sessionJeton = '75745454dd84z6fe4efer5g4e654r98';
$getJeton = '75745454dd84z6fe4efer5g4e654r98'; # OK
// $getJeton = '4684e6rg46e5r4g5er64h5rt64eh6et'; # Pas OK

if (isXhr() && $sessionJeton === $getJeton) {
    # je rend l'xml
}

Ta première suggestion, (celle de Lartak) a l'air la plus simple.
Mais comment génère t on un header spécifique ?

Je n'ai pas compris ce qui est dans le lien que tu m'as fourni ?

En gros on peut tester si une requête est de type Ajax ? (isAjax ?)