IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IGN API Géoportail Discussion :

Sécurité et célérité proxy - GeoportalExtended - PHP - PERL/CGI - WFS


Sujet :

IGN API Géoportail

  1. #1
    Membre régulier
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2014
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mai 2014
    Messages : 128
    Points : 113
    Points
    113
    Par défaut Sécurité et célérité proxy - GeoportalExtended - PHP - PERL/CGI - WFS
    Bonjour,

    Le proxy nécessaire à la récupération de couches en dehors de celles fournies par l'IGN nécessite l'utilisation d'un "proxy", c'est une contrainte liée à l'utilisation de javascript (http://api.ign.fr/tech-docs-js/fr/we.../js/proxy.html).

    2 version d'un script de proxy sont proposées (http://api.ign.fr/tech-docs-js/fr/de...ownload.html):

    - l'une en PHP
    - l'autre en PERL (CGI)

    1 - as t-on quelque part une documentation sur la sécurisation de ces 2 scripts ? (l'url fournie en paramètre peut être n'importe laquelle, il convient de limiter cela #TODO dans le script PERL)

    Le script a t-il été vérifié par un expert ?

    La limitation du domaine de l'url fournie en paramètre ou même la fourniture de l'url compléte est elle suffisante (sachant que la limitation sur referer ... n'est pas réaliste) ?

    2 - as t-on constaté et mesuré les différences de performances ?

    Pour ma part, l'utilisation en CGI simple (ni mod_perl, ni fastcgi) du script PERL donne un rapport de x1/2 sur le temps de chargement et d'execution du script par rapport au script PHP (PHP/FCGI).

    3 - quelqu'un a modifié le script PERL pour fonctionnement en FCGI (à l'instar de l'utilisation du mod_perl)?

    Cordialement,

    Eric

  2. #2
    Membre chevronné Avatar de gcebelieu
    Homme Profil pro
    Ingénieur Géographe et Cartographe
    Inscrit en
    Novembre 2010
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Géographe et Cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2010
    Messages : 1 106
    Points : 1 843
    Points
    1 843
    Par défaut
    Bonjour Eric,

    Citation Envoyé par elonguemare Voir le message
    1 - as t-on quelque part une documentation sur la sécurisation de ces 2 scripts ? (l'url fournie en paramètre peut être n'importe laquelle, il convient de limiter cela #TODO dans le script PERL)

    Le script a t-il été vérifié par un expert ?

    La limitation du domaine de l'url fournie en paramètre ou même la fourniture de l'url compléte est elle suffisante (sachant que la limitation sur referer ... n'est pas réaliste) ?

    2 - as t-on constaté et mesuré les différences de performances ?

    Pour ma part, l'utilisation en CGI simple (ni mod_perl, ni fastcgi) du script PERL donne un rapport de x1/2 sur le temps de chargement et d'execution du script par rapport au script PHP (PHP/FCGI).

    3 - quelqu'un a modifié le script PERL pour fonctionnement en FCGI (à l'instar de l'utilisation du mod_perl)?

    Nous n'avons pas vraiment d'expertise sur ces scripts que nous avons récupéré, parfois adaptés et que nous mettons à disposition des utilisateur pour faciliter l'utilisation de l'API. Effectivement, des améliorations peuvent - ou pas - être faites sur ces scripts sur des questions relatives à la sécurité ou l'efficacité.

  3. #3
    Membre régulier
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2014
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mai 2014
    Messages : 128
    Points : 113
    Points
    113
    Par défaut
    Bonjour,

    J'ai fait des recherches sur des bouts de code du script PERL, j'ai trouvé cela :

    http://www.programmershare.com/669692/

    La source du script est elle communicable ?

    Cordialement,

    PS : je ne suis pas expert non plus, je vais donc "enquêter" et voir si je peux apporter des améliorations, je pense que vérifier et limiter les url passées en paramètre est déjà un premier pas vers un comportement plus légitime.

    PS1 : rendre le script immuable : http://fr.wikipedia.org/wiki/Chattr : chattr +i (ce devrait être le cas pour tous les CGI je pense - http://www.perlmonks.org/?node_id=1064757)

    PS2 : le script (PERL/CGI) est lancé avec les options Tainted, strict et warnings :

  4. #4
    Membre chevronné Avatar de gcebelieu
    Homme Profil pro
    Ingénieur Géographe et Cartographe
    Inscrit en
    Novembre 2010
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Géographe et Cartographe
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2010
    Messages : 1 106
    Points : 1 843
    Points
    1 843
    Par défaut
    Citation Envoyé par elonguemare Voir le message
    Bonjour,

    J'ai fait des recherches sur des bouts de code du script PERL, j'ai trouvé cela :

    http://www.programmershare.com/669692/

    La source du script est elle communicable ?
    La source est en entête du script (en fait, ça vient de chez nous ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/usr/bin/perl -T
    #
    # (c) 2008 IGN - Didier.Richard@ign.fr
    # License : http://creativecommons.org/licenses/by-nc-sa/2.0/fr/
    #
    Pour le php, on a aussi des sources bien connues du forum :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // proxy http
    // auteur: Marc Gauthier
    // 02/09/2009
    // les erreurs dans les log du serveur
    // http://www.papygeek.com/download/53/
    // Transfer-Encoding: chunked
    //
    // Didier Richard - IGN - dérivation pour publication
    // (c) IGN 2010
    // License : http://creativecommons.org/licenses/by-nc-sa/2.0/fr/
    Pour les scripts JSP et ASP, ils ne sont pas signés. Ils ont peut être été écrits chez nous, mais je n'en suis pas sûr...



    PS : je ne suis pas expert non plus, je vais donc "enquêter" et voir si je peux apporter des améliorations, je pense que vérifier et limiter les url passées en paramètre est déjà un premier pas vers un comportement plus légitime.

    PS1 : rendre le script immuable : http://fr.wikipedia.org/wiki/Chattr : chattr +i (ce devrait être le cas pour tous les CGI je pense - http://www.perlmonks.org/?node_id=1064757)

    PS2 : le script (PERL/CGI) est lancé avec les options Tainted, strict et warnings :

    Merci pour ces infos.

  5. #5
    Membre régulier
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2014
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mai 2014
    Messages : 128
    Points : 113
    Points
    113
    Par défaut
    Bonsoir,

    J'ai apporté quelques corrections au script proxy.pl pour au moins controler l'url demandée (limiter les urls à celles necessaires) et le referer (meme si ce n'est pas 100% fiable pour le referer)

    Le diff :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    --- /home/eric/Téléchargements/proxy.pl
    +++ /home/eric/Téléchargements/proxy_new.pl
    @@ -9,7 +9,7 @@
     
     # modules
     use CGI qw/:cgi/;# pour dialoguer sur http
    -$CGI::POST_MAX=1024 * 1000;  # max 1000Kb posts
    +$CGI::POST_MAX=1024 * 1000;  # max 1000Kb posts (was 1000)
     use LWP::UserAgent;
     use HTTP::Headers;
     use HTTP::Message;
    @@ -22,9 +22,11 @@
     #  variables globales
     our $VERSION= '0.0.1';
     
    -# TODO : fichier de configuration par défaut
    -# il peut être écrasé par la directive SetPerlVar
    +# TODO : fichier de configuration par defaut
    +# il peut etre ecrase par la directive SetPerlVar
     my $configfile= '';
    +my @urllocking=("urlduservice");#liste des URL autorisées ("url1","url2") par exemple http://services.sandre.eaufrance.fr/geo/zon_FXX? 
    +my $domain='domainedusiteweb'; #domaine des pages utilisant l'API geoportail
     
     #
     # Sortie en erreur
    @@ -225,7 +227,7 @@
     #
     # Programme principal :
     #
    -# On récupère la GlobalRequest en premier
    +# On recupere la GlobalRequest en premier
     my $gr= undef;
     my $cgi= undef;
     if ($ENV{MOD_PERL}) {
    @@ -246,6 +248,11 @@
     if (!defined($url) || length($url)==0) {
         notify_proxy_failure($cgi,400,'no url parameter');#RC_BAD_REQUEST
     }
    +# is url in @urlocking // check url and referer domain 
    +notify_proxy_failure($cgi,403,'Not an authorized url') unless grep {$_ eq $url} @urllocking;#RC_BAD_URL
    +#check if referer domain is empty or bad domain
    +notify_proxy_failure($cgi,403,'Not authorized') if ($cgi->referer() !~ m|^https?://$domain/|);#RC_BAD_REFERER
    +# else continue and proxyfy
     if ($url=~m/^https?:\/\//) {
         proxyfy_remote($cgi,$url);
     } else {
    J'ai un fichier dispo pour envoi si OK.

    PS : j'ai utilisé grep même si ce n'est pas le plus rapide, si une seule url à "proxyfier" pour utilisation de l'API, @urllocking peut être remplacé par une variable.

    Cordialement,

    Eric

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 2 124
    Points : 1 764
    Points
    1 764
    Par défaut
    Bonsoir,

    Lorsque l'on durcit du code, une bonne pratique est de ne pas avoir des "code erreur" significatifs. Il faut réserver ceux-ci à un mode "DEBUG".

  7. #7
    Membre régulier
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2014
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mai 2014
    Messages : 128
    Points : 113
    Points
    113
    Par défaut
    Bonjour,

    C'est une bonne remarque. Il faudra modifier les lignes concernées.

    C'est un domaine difficile à aborder, puisque chacun entoure d'un peu de secret ses mesures de sécurisation. Par exemple : http://www.perlmonks.org/?node_id=1064757, faut il en parler ou pas ?

    Ici, j'ai été un peu surpris de voir qu'un "proxy" était "livré" sans contrôle sur les urls "proxyfiables" : un utilisateur non averti l'utilisera sans plus de précaution.

    C'est toujours le cas du fichier PHP, qui plus simple à mettre en service, concerne peut être davantage un public moins averti.

    Fallait-il en parler ou pas ?

    Cordialement,

    Eric

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 2 124
    Points : 1 764
    Points
    1 764
    Par défaut
    L'objectif de forum est l'API Géoportail, et souvent les scripts montrés ne sont qu'une démonstration de faisabilité.
    Sécuriser une application comporte plein de volets et même si souvent l'accent est mis sur le code la très forte majorité des défaillances provient d'autres éléments.

    Dans le cas du proxy, il est plus simple d'utiliser le parefeu qui protège l'application.

  9. #9
    Membre régulier
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2014
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mai 2014
    Messages : 128
    Points : 113
    Points
    113
    Par défaut
    Bonjour,

    Le fichier .htaccess avec le mod_rewrite conviendra pour tout le monde - tous les types d'hebergement proposent maintenant cette possibilité.

    Cordialement,

    Eric

Discussions similaires

  1. Perl CGI et les sessions PHP
    Par djibril dans le forum Web
    Réponses: 0
    Dernier message: 25/10/2012, 01h11
  2. Avantages inconvénients J2EE / NET / PHP / RoR / CGI perl
    Par ollivier dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 02/06/2006, 15h19
  3. Réponses: 5
    Dernier message: 19/07/2004, 17h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo