Member-only story
NodeJS Module嘅quality真係咁差!? (4個有3個俾山埃)
X-FORWARDED-FOR點樣handle應該寫module嘅要識囉
今日第一次認真寫一啲nodejs code,關於websocket嘅。
我一直對npm上嘅quality有偏見,事實証明唔係偏見而係真㗎囉🙈。因為一落筆無幾耐我就覺得websocket呢個module有security嘅design flaw。
事原係我要拎websocket client嘅remote IP address,而眾所周知nodejs梗係nginx再proxy過去㗎啦,直接拎socket嘅property應該只係出proxy隻IP。
然後我發現好得意地乜都唔做個connection.remoteAddress又出到我個真IP㗎喎。咁神奇?令我睇一睇佢document係唔係對X-Forwarded-For有特別處理。
而真係,WebSocketServer嘅ignoreXForwardedFor竟然係default false! 即係盲目相信個HTTP Header寫乜就寫乜。
如上面噉樣改,拎出來個remoteAddress就係1.1.1.1。如果個X-Forwarded-For係user自己加咗料就變咗乜都得。
而且,四年前嘅issue,https://github.com/theturtle32/WebSocket-Node/issues/80,似乎已經有考慮過呢樣嘢而專登唔理?
X-FORWARDED-FOR嘅運作
基本上就係逗號分隔,每經過一個proxy就會加佢見到嘅TCP socket remote IP address喺X-FORWARDED-FOR最後。
如上圖,X-FORWARDED-FOR就會係”1.1.1.1, 2.2.2.2, 3.3.3.3”,而node見到嘅TCP socket remote IP address就係127.0.0.1。從安全性考慮,我只認為user嘅IP係2.2.2.2 (即係3.3.3.3見到嘅嘢),而因為2.2.2.2唔係我控制,難保其實1.1.1.1都只係User老吹。