2011-07-16 8 views
9

Je construis un site qui est conçu pour être administré depuis localhost, mais qui contient des pages qui exposent des données à Internet ou aux utilisateurs du réseau local. Est-ce que je peux compter sur $ _SERVER ['REMOTE_ADDR'] de PHP comme un moyen sûr/fiable d'identifier l'utilisateur comme localhost? Merci!

Edit: Pour clarifier les choses, je ne suis concerné par déterminer si la demande ou non originaire de localhost (peut-être il y a une meilleure façon).

+0

C'est assez fiable pour ça, oui. Et pas besoin de clarifier, nous avons compris;) –

Répondre

10

Cette variable est remplie avec des données fournies par Apache (ou un autre démon de serveur web) et devrait être fiable pour identifier l'adresse IP à l'autre extrémité de la connexion, oui. Vérifiez 127.x.x.x (presque toujours 127.0.0.1) et :: 1 (pour IPv6). Comme le dit Senica, il peut ne pas toujours exister (par exemple, lors de l'exécution à partir de la ligne de commande plutôt que via le serveur Web). Mais s'il est rempli, il devrait être fiable. Pour pouvoir faire semblant, quelqu'un a déjà besoin d'un accès assez étendu à votre réseau et votre système d'une manière que vous ne pouvez pas protéger contre PHP de toute façon.

+0

Merci pour la réponse. Ce site est destiné à être déployé auprès des clients pour une utilisation sur leurs propres serveurs. Je suis préoccupé par le fait que cette approche peut amener les clients à rencontrer un comportement incohérent à travers les configurations de serveur (puisque je ne peux pas garantir que quelque chose sera même retourné) – leo

+1

Ensuite, vous devriez faire les vérifications comme définies ci-dessus. Si REMOTE_ADDR n'est pas défini, il ne s'agit pas d'une requête HTTP. Les chances de ce sont minces à aucun (et toute personne capable d'exécuter votre script de cette façon devrait être suffisamment compétent pour être conscient que les vérifications IP existent). Ne vous inquiétez pas des cas de bordure. Si vous vérifiez pour 127.x.x.x et :: 1, vous aurez couvert toutes les configurations raisonnables. –

+0

Merci d'avoir allégé ma paranoïa. – leo

0

Non. Cela dépend du serveur Web, qu'il serve ou non remote_addr.

RETRACT QUE. ..Was pense à HTTP_REFERER.

Il devrait vous donner l'adresse IP ... oui. Rappelez-vous qu'il pourrait y avoir un proxy.

+0

'HTTP_REFERER' dépend réellement du navigateur, pas du serveur. –

-1

Cela ne s'applique généralement pas aux connexions de localhost mais vous devez prendre en compte les proxies. Si l'extrémité distante utilise un proxy HTTP, $_SERVER['REMOTE_ADDR'] contiendra l'adresse IP de ce proxy plutôt que l'adresse IP du client lui-même.

Cependant, si elle est un proxy qui a des paramètres de confidentialité désactivé, vous pouvez avoir une chance d'obtenir IP du client en utilisant l'extrait suivant:

// will be set by the proxy if no privacy is enabled: 
if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
    return $_SERVER['HTTP_X_FORWARDED_FOR']; 
} else if(isset($_SERVER['REMOTE_ADDR'])) { 
    return $_SERVER['REMOTE_ADDR']; 
} 

Mais si votre client utilise un proxy HTTP avec confidentialité activé, alors vous n'aurez pas la chance d'obtenir l'IP des clients.


Conseil de sécurité (@deceze merci) Notez que si vous comptez sur l'en-tête HTTP_X_FORWARDED_FOR, il sera facile pour les attaquants d'usurper leur propriété intellectuelle. Bien que cela soit possible en utilisant d'autres techniques, il sera très facile d'utiliser l'en-tête HTTP_X_FORWARDED_FOR. Tu étais prévenu. Mais de toute façon une application web ne devrait jamais utiliser les informations IP pour la sécurité, donc c'est juste une note de côté

+0

1) En utilisant les en-têtes X-Forwarded-For * au lieu de * REMOTE_ADDR, vous donnez à tout le monde un excellent moyen d'usurper leur adresse IP très facilement; si du tout l'utilise * en plus de * REMOTE_ADDR comme méta-informations 2) 'isset &&! empty' est redondant, juste'! vide' fera très bien l'affaire. – deceze

+0

@deceze Beaucoup, merci pour l'indice d'usurpation! Je n'ai jamais pensé à cela .... Pour 2.), ce n'est pas correct, ils ne sont pas les mêmes: vérifier [ce violon] (http://phpfiddle.org/lite/code/6c9-8zz) – hek2mgl

+0

J'ai dit ' isset &&! empty' est inutile, pas qu'ils soient identiques. – deceze

Questions connexes