Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

187
Views
express.js ¿Qué tan sospechoso debemos ser de req.body?

https://expressjs.com/en/4x/api.html estados

Como la forma de req.body se basa en la entrada controlada por el usuario, todas las propiedades y valores de este objeto no son de confianza y deben validarse antes de confiar. Por ejemplo, req.body.foo.toString() puede fallar de varias maneras, por ejemplo, foo puede no estar allí o puede no ser una cadena, y toString puede no ser una función y, en cambio, una cadena u otra entrada del usuario.

Creo que entiendo esto (hasta cierto punto) en el contexto de la lectura de contaminación de prototipos https://github.com/expressjs/body-parser/issues/347 y https://learn.snyk.io/lessons/prototype- polución/javascript/ (no realice ciertas operaciones en objetos no validados que puedan contaminar el prototipo o el constructor)

Supongo que sin que se realice dicha operación (la función de combinación en el ejemplo de Snyk) req.body.foo.toString() no puede contener inmediatamente el código remoto/suministrado por el usuario. (¿Eso es para que la función toString() sea completamente arbitraria?).

¿O he entendido mal, y sería necesarioverificar si una variable es una cadena en JavaScript en req.body.foo antes de estar seguro de llamar a su toString ()?

Muchas gracias

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Express no permitirá que el código personalizado se cuele en req.body . Por lo tanto, no tiene que preocuparse de que el código malicioso en el método .toString() esté en una propiedad en particular, pero es posible que un objeto en req.body tenga una propiedad personalizada llamada .toString que tenga un valor (algo diferente). que el código) como se ilustró en su ejemplo learn.snky.io .

Tenga en cuenta que req.body en Express proviene del análisis del cuerpo de la solicitud entrante. Ese cuerpo habrá sido codificado según el tipo de contenido. Lo más común es que sea applications/json o application/x-www-form-urlencoded y ninguna de estas codificaciones permite al remitente incluir código Javascript que se convertirá en código en vivo como parte de la decodificación. Por lo tanto, esos tipos de contenido están a salvo de la inyección de código en vivo. Ahora, podría haber código en una propiedad como una cadena, pero no estará activo ni se ejecutará a menos que haga algo incorrecto en la forma en que usa esos datos (como llamar a eval() en él).

Y, NO necesariamente sabe qué tipo es una propiedad determinada en req.body . Puede estar esperando que el cliente envíe una cadena para un valor de propiedad, pero puede estar enviando un número o un objeto (que tienen diferentes implementaciones .toString() ).

Si espera que el valor sea una cadena, puede verificar que es una cadena verificando if (typeof req.body.foo === "string") y, si es una cadena, no necesita para llamar a .toString() porque ya es una cadena.

La protección robusta para su servidor verificará el tipo de cada propiedad entrante que pretende usar en req.body antes de intentar usarla y tendrá mucho cuidado en cómo copia la información de req.body a otros objetos porque puede crear prototipos de contaminación. si usa el método incorrecto para copiar. Y, para evitar cualquier reemplazo de método funky que pueda estar en un objeto en req.body , puede copiar la propiedad única en un objeto nuevo y usarla allí.

Mi regla segura y simple es primero verificar el tipo y validar el valor de cualquier propiedad que quiera usar y luego copiar las propiedades individuales con nombre solo de req.body a mis propios objetos. Nunca copio objetos completos usando funciones que copian recursivamente todas las propiedades. Así es como te vuelves vulnerable a la contaminación de prototipos, al copiar a ciegas cosas de req.body que no tienen las propiedades conocidas que esperas.

Si quiero copiar 10 propiedades a otro objeto, haré una matriz de los 10 nombres de propiedad y usaré un ciclo para copiar esas 10 propiedades con nombre individualmente, dejando atrás cualquier otra propiedad potencialmente maliciosa (como __proto__ que no quiero). ). Si solo estoy usando un par de propiedades, las asignaré manualmente a un nuevo objeto que creé. No usaré cosas como Object.assign() para realizar copias masivas de req.body porque eso puede y copiará cosas que no quiero que contaminen mis propios objetos de programación.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!