Filtrer les authentifications (par ip OU par utilisateur)

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

21 févr. 2005, 16:17

Comme je devais faire cette manipulation dans la journée et que je n'ai toujours pas eu de réponse, j'ai été contraint de développer un petit module pour le faire. Rien de très sorcier, mais je vous en fais profiter tout de même.

Voici le problème:
- Un intranet.
- 1. De l'intérieur on y accède directement (sans authentification).
- 2. De l'extérieur on peut également y accéder, mais cela nécessite une authentification HTTP.

Le point 1 peut être facilement réalisé avec un .htaccess. Le point 2 également. Le point 1 et 2 peuvent être facilement conjonctés (je sais ça n'existe pas, mais c'est clair, ça veut dire faire un "ET" :p), mais je n'ai pas trouvé le moyen de les disjoncter. En gros que ceux qui viennent de l'extérieur ne se voient pas systématiquement fermer la porte, ni rentrer sans authentitifaction http. Et que ceux de l'intérieur par contre n'aient pas besoin de s'authentifier.


C'est chose faite avec ce chti module:
<?php

// ----------------- CONFIGURATION -----------------

$mask_ip = '127.*'; // la liste des IP n'ayant pas besoin de s'authentifier * représente n'importe quelle série de caractères, le masque est un préfixe.
$valid_username = 'monlogin';
$md5_password = md5('mon mot de passe'); // plutot que de mettre md5('mon mot de passe'), il vaudra mieux mettre directement le résultat du md5 (si jamais quelqu'un voit la source du script - on n'est jamasi à l'abri d'une faiblesse - il ne saura pas pour autant comment se logger les prochaines fois).



// --------------------- CORE ----------------------

$ip = $_SERVER['REMOTE_ADDR'];
$username = $_SERVER['PHP_AUTH_USER'];
$password = $_SERVER['PHP_AUTH_PW'];

if (!isset($realm)) $realm = 'Limited access for '.$ip;

$mask_ip = str_replace('.', '\.', $mask_ip);
$mask_ip = str_replace('*', '.*', $mask_ip);

if (!preg_match('/^'.$mask_ip.'$/', $ip)) {
    if ($username!=$valid_username || md5($password)!=$md5_password) {
        header('WWW-Authenticate: Basic realm="'.$realm.'"');
        header('HTTP/1.0 401 Unauthorized');
        echo 'Authorized personel only';
        exit;
    }
}

?>
En incluant ceci dans vos pages, ceux qui ont une IP commençant par "127." seront directement accueillis, les autres seront soumis à une authentification, et n'auront accès aux pages qu'en tapant le bon login/mdp. Sinon ils auront un message "Authorized personel only".


Ce script simpliste suffit dans mon cas. S'il est impossible (j'en doute, c'est plus une question de temps qu'autre chose dans mon cas) de le faire directement avec Apache, on peut au moins le faire en PHP. Et il sera alors peut-être intéressant d'améliorer la configurabilité (genre lui faire gérer des .htpasswd c'est facile ils sont en md5).

ViPHP
fab
ViPHP | 2657 Messages

21 févr. 2005, 16:31

beau boulot :) , seule probleme avec ton code c'est que tu es obliger de l'inclure dans tes fichiers non ?

PS : et le tag résolu

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

21 févr. 2005, 16:33

beau boulot :) , seule probleme avec ton code c'est que tu es obliger de l'inclure dans tes fichiers non ?
Bien entendu :?
PS : et le tag résolu
Mon problème n'est pas résolu >< je veux le résoudre par la config apache ce n'est qu'une rustine temporaire pour moi :P