TL; DR: È pericoloso avere l'input dell'utente utilizzato in una funzione require in Node.js? Può essere utilizzato per leggere i file e, in caso affermativo, come posso proteggerlo?
Ad esempio, ho un server ExpressJS in esecuzione, con un'API. Il client può effettuare una chiamata a /api/login
, che viene quindi richiesta come ./api/login(.coffee)
:
require('coffee-script')
app = require('express')()
app.all '/api/:func?', (req, res) ->
# Get API function
func = req.params.func
# Check if file exists
fs = require 'fs'
fs.access "./api/#{func}.coffee", fs.F_OK & fs.R_OK, (err) ->
if err
# Send error when invalid call
api = require('./api/error')
else
# !!! Injection ?
api = require('./api/' + func)
# Call API
api(req, res)
Suppongo che non si possa inviare una richiesta a http://example.net/api/../../../etc/passwd
, ad esempio, ma l'ho verificato solo nel mio browser e non sono sicuro che il mio browser lo gestisca. Oltre a ciò, penso che la cosa peggiore che potrebbe accadere sarebbe che il nodo si arresti in modo anomalo perché non può richiedere un file di questo tipo.
Ci sono problemi di sicurezza qui e come bloccherò tali attacchi?