Estoy tratando de configurar un middleware de seguridad para mi pequeña y humilde aplicación web MERN, y actualmente estoy usando helmet y express-mongo-sanitize, específicamente para la protección contra ataques de inyección NoSQL.
Sin embargo, lo configuré como se muestra a continuación en mi archivo server.js:
const express = require('express') const helmet = require('helmet') const mongoSanitize = require('express-mongo-sanitize') ... app.use(mongoSanitize()) app.use(helmet()) // Routes below ...Intenté probarlo haciendo un registro simulado como:
nombre de usuario: {"$gt": ""} contraseña: 'TestPassword'
por lo que req.body sería:
{ username: '{"$gt": ""}', password: 'TestPassword' }pero express-mongo-sanitize no parece detectarlo y pasa a mi base de datos. ¿Estoy malinterpretando algo? El valor de la clave de nombre de usuario es una cadena, ¿quizás ya esté bien? Disculpen mi ignorancia, estoy aprendiendo.
Lo que hace express-mongo-sanitize es desinfectar las teclas que comienzan con un signo de dólar.
username: '{"$gt": ""}' --> this isn't a key starting with a dollar sign. Rather, the value of username is just a string.Intenta enviarle este objeto en su lugar:
{ "username": { "$gt": "" } }Por lo que entendí, desde la depuración y revisión del código, las claves que desinfecta son cualquier clave potencial en un par clave = valor de consulta y parámetros de publicación que tienen $ o un punto. También intenta desinfectar las claves en el cuerpo y el encabezado de la solicitud.
Por ejemplo, incluso el json proporcionado por el usuario anterior no lo hará.
pero https://your-domain/?$user=json se desinfectaría a user=json.
No elimina $ del valor de los parámetros como usted y yo esperabamos. También abrí una pregunta en github al creador y veré lo que dice. Creo que el riesgo de seguridad es tanto para la clave como para el valor. Esto no sirve de nada si no está guardando la clave en mongodb sino guardando el valor en su lugar.
Como referencia, comprueba las siguientes secciones HTTP para eliminar cualquier $ o .
['cuerpo', 'parámetros', 'encabezados', 'consulta'].forEach(función (tecla) ...