Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does "trust proxy" actually do in express.js, and do I need to use it?

I am writing an express app that sits behind an nginx server. I was reading through express's documentation and it mentioned the 'trust proxy' setting. All it says is

trust proxy Enables reverse proxy support, disabled by default

I read the little article here that explains Secure Sessions in Node with nginx.

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

So I am curious. Does setting 'trust proxy' to true only matter when using HTTPS? Currently my app is just HTTP between the client and nginx. If I set it to true now, are there any side-effects/repercussions I need to be aware of? Is there any point to setting it true now?

like image 287
joeycozza Avatar asked May 01 '14 17:05

joeycozza


People also ask

Is Express JS needed?

Developers need to install ExpressJS along with NodeJS to use it. There is no need to install AngularJS on their computer system to use it. Used for developing server-side and networking applications. Used for building server-side applications on NodeJS.

Is Express JS necessary for Node JS?

Short answer. Yes. I think you can search google for some tutorials on how to do this.

Do people still use express JS?

Express is currently, and for many years, the de-facto library in the Node. js ecosystem. When you are looking for any tutorial to learn Node, Express is presented and taught to people. In the latest State of JS survey, Express was TOP 1 for all categories.


Video Answer


2 Answers

This is explained in detail in the express behind the proxies guide

By enabling the "trust proxy" setting via app.enable('trust proxy'), Express will have knowledge that it's sitting behind a proxy and that the X-Forwarded-* header fields may be trusted, which otherwise may be easily spoofed.

Enabling this setting has several subtle effects. The first of which is that X-Forwarded-Proto may be set by the reverse proxy to tell the app that it is https or simply http. This value is reflected by req.protocol.

The second change this makes is the req.ip and req.ips values will be populated with X-Forwarded-For's list of addresses.

like image 60
Akshat Jiwan Sharma Avatar answered Sep 19 '22 14:09

Akshat Jiwan Sharma


Annotated code to explain use of trust proxy

    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); 
like image 41
anneb Avatar answered Sep 20 '22 14:09

anneb