2 votes

Filtrer la chaîne $query_string dans Nginx

Comment pourrais-je filtrer au mieux le trafic en fonction de l'URI de la demande ? Ce que j'aimerais faire, c'est limiter l'accès au script. some-script.php lorsque seule une certaine liste d'arguments est donnée. Par exemple, permettre à tout le monde d'atteindre user_info avec associé user_id mais refuser à tous l'accès à action=admin_login à moins que leur adresse IP soit sur le réseau local.

Je sais. if est mauvais et allow all ne fonctionne pas comme indiqué ci-dessous mais je n'arrive pas à trouver ce que je veux faire.

location ~* /live/some-script\.php {

   // allow "?action=user_info&user_id=[0-9]{1,6}"
   if ($request_uri ~* "action=bwg_frontend_data" ) {
      allow all;
   }

  // deny everyone access to "?action=admin_login", but allow 192.168.100.0/24
  if ($request_uri ~* "?action=admin_login.*")
  {
      allow from 192.168.100.0/24;
  }

  return 403;
}

4voto

flaixman Points 201

Ce que vous essayez de faire correspondre n'est pas le $request_uri, mais le $query_string.

$request_uri dans votre cas est /live/some-script.php , tandis que $args est tout ce qui suit ? (manière simple de l'expliquer pour simplifier). Je vais laisser les liens sur où vous pouvez être aidé sur ce que vous voulez, comme je ne peux pas commenter votre poste parce que je n'ai pas assez de réputation.

Pour faire correspondre la chaîne de recherche :

https://gist.github.com/psd/3884613

Nginx - Redirection basée sur les paramètres de la chaîne de requête

Il y a aussi une autre façon de faire avec les erreurs personnalisées, mais je ne l'aime pas trop (vous pouvez l'utiliser si vous voulez, c'est une opinion personnelle) :

Les blocs d'emplacement de nginx peuvent-ils correspondre à une chaîne de requête d'URL ?

map $query_string $is_admin {
    ~ action=admin_login.* 1; # admin = 1
}
map $query_string $is_user {
    ~ action=bwg_frontend_data 1; #admin = 1
}
#default is empty, so it will not match the "if below".

Ensuite, dans votre code serveur, vous faites correspondre $is_admin et $is_user avec un if.

location ~* /live/some-script\.php {

   // allow "?action=user_info&user_id=[0-9]{1,6}"
   if ($is_user) {
      allow all;
   }

  // deny everyone access to "?action=admin_login", but allow 192.168.100.0/24
  if ($is_admin)
  {
      allow from 192.168.100.0/24;
      deny_all; #deny anyone but the allowed ones = https://support.hypernode.com/knowledgebase/blocking-allowing-ip-addresses-in-nginx/
  }

  return 403;
}

Je vous donne juste la manière théorique de le faire, comme je ne peux pas voir votre configuration complète, commentez juste si c'est correct ou non, ainsi je peux l'éditer en l'adaptant à ce que vous voulez. J'espère que c'est ce que vous demandez.

0 votes

Merci, c'est génial. J'ai dû remettre ce projet à plus tard hier, mais quand je m'y remettrai, je posterai les résultats.

1 votes

J'utiliserais $arg_action pour la correspondance au lieu de query_string . Ensuite, nginx extraira la valeur de l'argument et l'élément map peut être plus simple.

0 votes

J'ai du mal à ajouter le map{} dans ma configuration. Cet élément de configuration doit-il être ajouté dans une section spécifique de la configuration ? Le fichier dans mon message ci-dessus se trouve en fait dans un fichier "include" qui est extrait de la section server section dans sites-enabled/site.ssl .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X