web-dev-qa-db-fra.com

Que fait réellement "proxy de confiance" dans express.js, et dois-je l'utiliser?

J'écris une application express qui se trouve derrière un serveur nginx. Je lisais la documentation d'Express et il mentionnait le paramètre "proxy de confiance". Tout ce qu'il dit est

trust proxy Active la prise en charge du proxy inverse, désactivé par défaut

J'ai lu le petit article ici qui explique les sessions sécurisées dans Node with nginx.

http://blog.nikmartin.com/2013/07/secure-sessions-in-nodejs-with-nginx.html

Je suis donc curieux. Est-ce que la définition de "proxy de confiance" sur true n'a d'importance que lors de l'utilisation de HTTPS? Actuellement, mon application n'est que HTTP entre le client et nginx. Si je le mets à vrai maintenant, y a-t-il des effets secondaires/répercussions dont je dois être conscient? Est-il utile de le confirmer maintenant?

37
joeycozza

Ceci est expliqué en détail dans le express derrière le guide des procurations

En activant le paramètre "proxy de confiance" via app.enable ("proxy de confiance"), Express saura qu'il se trouve derrière un proxy et que les champs d'en-tête X-Forwarded- * peuvent être approuvés, ce qui autrement pourrait être facilement usurpé.

L'activation de ce paramètre a plusieurs effets subtils. Le premier est que X-Forwarded-Proto peut être défini par le proxy inverse pour indiquer à l'application qu'il s'agit de https ou simplement de http. Cette valeur est reflétée par req.protocol.

Le deuxième changement que cela apporte est que les valeurs req.ip et req.ips seront remplies avec la liste d'adresses de X-Forwarded-For.

38

Code annoté pour expliquer l'utilisation du proxy de confiance

    var express = require('express');

    var app = express();

    // Set the ip-address of your trusted reverse proxy server such as 
    // haproxy or Apache mod proxy or nginx configured as proxy or others.
    // The proxy server should insert the ip address of the remote client
    // through request header 'X-Forwarded-For' as
    // 'X-Forwarded-For: some.client.ip.address'
    // Insertion of the forward header is an option on most proxy software
    app.set('trust proxy', '127.0.0.1');


    app.get('/test', function(req, res){
      var ip = req.ip; // trust proxy sets ip to the remote client (not to the ip of the last reverse proxy server)
      if (ip.substr(0,7) == '::ffff:') { // fix for if you have both ipv4 and ipv6
        ip = ip.substr(7);
      }
      // req.ip and req.protocol are now set to ip and protocol of the client, not the ip and protocol of the reverse proxy server
      // req.headers['x-forwarded-for'] is not changed
      // req.headers['x-forwarded-for'] contains more than 1 forwarder when
      // there are more forwarders between the client and nodejs.
      // Forwarders can also be spoofed by the client, but 
      // app.set('trust proxy') selects the correct client ip from the list
      // if the nodejs server is called directly, bypassing the trusted proxies,
      // then 'trust proxy' ignores x-forwarded-for headers and
      // sets req.ip to the remote client ip address

      res.json({"ip": ip, "protocol": req.protocol, "headers": req.headers['x-forwarded-for']});
    });

// in this example the reverse proxy is expected to forward to port 3110
var port = 3110;
app.listen(port);
// test through proxy: http://yourproxyserver/test, req.ip should be your client ip
// test direct connection: http://yournodeserver:3110/test, req.ip should be your client ip even if you insert bogus x-forwarded-for request headers
console.log('Listening at http://localhost:' + port);
14
anneb