web-dev-qa-db-fra.com

Autoriser les utilisateurs connectés qui n'appartiennent pas à la liste blanche

J'ai une configuration Apache où je liste blanche les adresses IP à un sous-dossier non-WordPress comme ceci:

<Directory /var/www/html/link>
Order allow,deny
Require all granted

#Our Network
Allow from ip-address/22
Allow from ip-address/24
Allow from ip-address/24
Allow from ip-address/24
#and even longer list of IPs and other folders
</Directory>

J'aimerais également autoriser les personnes qui n'appartiennent pas à ce bloc IP mais ont un compte utilisateur. Y a-t-il un moyen de faire ça?

1
bran

Méthode simple et rapide mais non sécurisée à 100%:

Cette méthode n'est pas sécurisée à 100%, mais pour la plupart des utilisateurs (comme 99%), cela fonctionnera.

Ici, vous utiliserez essentiellement un fichier .htaccess dans le répertoire restreint , par exemple: /var/www/html/link avec le code suivant:

    SetEnvIf Cookie "^.*wordpress_logged_in.*$" WP_LOGGED_IN=maybe

    Order allow,deny
    Require all granted

    # Our Network
    #Allow from ip-address/22
    #Allow from ip-address/24
    #Allow from ip-address/24
    #Allow from ip-address/24
    # and even longer list of IPs

    # Perhaps WordPress is logged in according to cookie: works for trivial cases, but not 100% secure
    Allow from env=WP_LOGGED_IN

Ainsi, au lieu de config Apache, vous placerez les réseaux IP autorisés dans ce fichier .htaccess (sans le bloc <Directory>), qui vérifiera également le cookie de connexion WordPress à l’aide de la directive SetEnvIf . Si l'adresse IP ne figure pas dans le cookie de correspondance et de connexion introuvable, ce code interdira l'accès aux visiteurs restants.

Aucune modification dans le fichier .htaccess du répertoire Web racine n'est nécessaire.

Méthode sécurisée:

Si vous avez besoin d'une méthode 100% sécurisée, il est préférable de le faire avec PHP.

Commencez par supprimer toutes les restrictions IP existantes (pour le répertoire correspondant) du fichier de configuration Apache.

Ensuite, utilisez le code suivant dans le fichier .htaccess de votre répertoire Web racine.

    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteBase /

        RewriteRule ^link/access\.php$ - [L]
        RewriteRule ^link/.*$ /link/access.php [L]

        # Your remaining rewrite rules for WordPress
    </IfModule>

Ensuite, dans le fichier /var/www/html/link/access.php, utilisez le code PHP suivant:

<?php

    function network_match( $ip, $networks ) {
        foreach( $networks as $network ) {
            $net_parts = explode( '/', $network );

            $net = $net_parts[0];
            if( count( $net_parts ) === 2 ) {
                $netmask = $net_parts[1];
                if( ( ip2long( $net ) & ~ ( ( 1 << ( 32 - $netmask ) ) - 1 ) ) === ( ip2long( $ip ) & ~ ( ( 1 << ( 32 - $netmask ) ) - 1 ) ) ) {
                    return true;
                }
            }
            else if( $ip === $net ) {
                return true;
            }
        }
        return false;
    }

    $networks = array(
        // Put your allowed networks HERE
        "192.168.0.0/24",
        "127.0.0.1"
    );

    $allowed = false;
    if( network_match( $_SERVER['REMOTE_ADDR'], $networks ) ) {
        $allowed = true;
    }
    else {
        // assuming WordPress is installed one directory above
        // if not, then change accordingly
        require_once dirname( dirname( __FILE__ ) ) . "/wp-load.php";
        if( is_user_logged_in() ) {
            $allowed = true;
        }
    }

    if( $allowed ) {
        // HERE you SERVE THE REQUESTED FILE WITH PHP
        echo "You are allowed";
    }
    else {
        die("Access denied!");
    }

En l'état actuel des choses, ce CODE réécrit fondamentalement en interne toutes les demandes dans le répertoire /var/www/html/link/ dans le fichier /var/www/html/link/access.php et vérifie l'autorisation d'accès IP et la connexion à WordPress.

Vous pouvez modifier ce PHP CODE (dans la ligne qui dit: // HERE you SERVE THE REQUESTED FILE WITH PHP) pour servir les fichiers demandés à partir du répertoire link.

Vous pouvez vérifier cette publication sur les fichiers du serveur à partir de PHP CODE .

2
Fayaz

Autant que je sache, le .htaccess (ou la configuration Apache) est prioritaire et vous ne pouvez pas le remplacer facilement. Il y a deux solutions:

1) Utilisez simplement le fichier simple-browser.php (modifiez le chemin du répertoire protégé selon vos besoins)

2) N'utilisez pas Apache config, utilisez plutôt .htaccess dans ce répertoire, voici comment:

créez .htaccess dans ce dossier:

<Directory "./">
Order allow,deny
Require all granted

#Our Network
Allow from ip-address/22
........
#DONT_REMOVE_ME_START
#DONT_REMOVE_ME_END
</Directory>

Tout d'abord, mettez le contenu ci-dessous dans votre functions.php et après cela, envoyez les utilisateurs à ce lien: yoursite.com/?check_permission:

define('path_to_target_htaccess',   ABSPATH.'path/to/protected/folder/.htaccess');

add_action('init', 'start_validation');
function start_validation(){
    if (isset($_GET['check_permission'])){
        if(is_user_logged_in()){

            $new_content=  str_replace(
                '#DONT_REMOVE_ME_START',  
                '#DONT_REMOVE_ME_START'."\r\n".'Allow from '.$_SERVER['REMOTE_ADDR'], 
                file_get_contents(path_to_target_htaccess)
            );
            file_put_contents(path_to_target_htaccess,  $new_content);
            header("location:  /path/to/folder"); exit;
        }
    }
}

p.s. une fois par semaine ou par jour, exécutez une fonction qui supprimera toutes les lignes entre #DONT_REMOVE_ME_START et #DONT_REMOVE_ME_END

0
T.Todua

Je ne me suis pas trouvé dans cette situation et je n'en sais pas plus sur WP qu'Apache, mais voici en gros comment je l'aborderais.

  1. Utilisez mod_setenvif pour définir une variable d’environnement basée sur l’URL demandée contenant un certain code. Dites "wp-login-! 637 # 6".
  2. Autoriser l'accès si la variable d'environnement est correcte. Cela va échouer.
  3. Redirection vers une page spéciale de l'installation WP, en transmettant l'URL d'origine sous forme de variable de requête, comme suit: Redirect "foo.html" "wp/specialpage?foo.html".
  4. Vous êtes maintenant dans WP et pouvez vérifier si l'utilisateur actuel est connecté. Si ce n'est pas le cas, autorisez la connexion ou affichez 'interdit'. Si vous êtes connecté, redirect vers l'URL d'origine, en ajoutant le code 'wp-login-! 637 # 6'
  5. Maintenant, vous êtes de retour à la première étape, mais cette fois, la variable d’environnement sera réglée correctement et vous aurez accès au fichier.
0
cjbj