TL; DR: ¿Es peligroso que las entradas del usuario se usen en una función requerida en Node.js? ¿Se puede usar para leer archivos y, de ser así, cómo puedo protegerme contra eso?
Por ejemplo, tengo un servidor ExpressJS en ejecución, con una API. El cliente puede realizar una llamada a /api/login
, que luego se requiere como ./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)
Supongo que, por ejemplo, no se puede enviar una solicitud a http://example.net/api/../../../etc/passwd
, pero solo lo probé en mi navegador y no estoy seguro de si mi navegador lo maneja. Además de eso, creo que lo peor que podría pasar es que Node se bloquee porque no puede requerir ese archivo.
¿Hay algún problema de seguridad aquí y cómo bloquearía tales ataques?