Désinfection des entrées dans Express à l'aide du validateur express

Vous avez vu comment valider les entrées provenant du monde extérieur dans votre application Express.

Il y a une chose que vous apprenez rapidement lorsque vous exécutez un serveur public: ne faites jamais confiance à l'entrée.

Même si vous nettoyez et assurez-vous que les gens ne peuvent pas entrer des choses étranges à l'aide de code côté client, vous serez toujours soumis à des personnes utilisant des outils (même uniquement les outils de développement du navigateur) pour POST directement sur vos points de terminaison.

Ou des robots essayant toutes les combinaisons d'exploit possibles connues des humains.

Ce que vous devez faire est de nettoyer votre entrée.

Leexpress-validatorpaquetque vous utilisez déjà pour valider l'entrée peut également être utilisé pour effectuer un nettoyage.

Supposons que vous ayez un point de terminaison POST qui accepte le nom, l'adresse e-mail et les paramètres d'âge:

const express = require('express')
const app = express()

app.use(express.json())

app.post(’/form’, (req, res) => { const name = req.body.name const email = req.body.email const age = req.body.age })

Vous pouvez le valider en utilisant:

const express = require('express')
const app = express()

app.use(express.json())

app.post(’/form’, [ check(‘name’).isLength({ min: 3 }), check(‘email’).isEmail(), check(‘age’).isNumeric() ], (req, res) => { const name = req.body.name const email = req.body.email const age = req.body.age })

Vous pouvez ajouter une désinfection en acheminant les méthodes de désinfection après celles de validation:

app.post('/form', [
  check('name').isLength({ min: 3 }).trim().escape(),
  check('email').isEmail().normalizeEmail(),
  check('age').isNumeric().trim().escape()
], (req, res) => {
  //...
})

Ici, j'ai utilisé les méthodes:

  • trim()coupe les caractères (espaces par défaut) au début et à la fin d'une chaîne
  • escape()remplace<,>,&,',"et/avec leurs entités HTML correspondantes
  • normalizeEmail()canonicalise une adresse e-mail. Accepte plusieurs options pour les adresses e-mail ou les sous-adresses en minuscules (par exemple[email protected])

Autres méthodes de désinfection:

  • blacklist()supprimer les caractères qui apparaissent dans la liste noire
  • whitelist()supprimer les caractères qui n'apparaissent pas dans la liste blanche
  • unescape()remplace les entités codées HTML par<,>,&,',"et/
  • ltrim()comme trim (), mais ne coupe que les caractères au début de la chaîne
  • rtrim()comme trim (), mais ne coupe que les caractères à la fin de la chaîne
  • stripLow()supprimer les caractères de contrôle ASCII, qui sont normalement invisibles

Forcer la conversion vers un format:

  • toBoolean()convertir la chaîne d'entrée en booléen. Tout sauf «0», «faux» et «renvoie vrai. En mode strict, seuls '1' et 'true' renvoient true
  • toDate()convertir la chaîne d'entrée en une date, ou null si l'entrée n'est pas une date
  • toFloat()convertir la chaîne d'entrée en un flottant, ou NaN si l'entrée n'est pas un flottant
  • toInt()convertir la chaîne d'entrée en un entier, ou NaN si l'entrée n'est pas un entier

Comme avec les validateurs personnalisés, vous pouvez créer un désinfectant personnalisé.

Dans la fonction de rappel, vous renvoyez simplement la valeur nettoyée:

const sanitizeValue = value => {
  //sanitize...
}

app.post(’/form’, [ check(‘value’).customSanitizer(value => { return sanitizeValue(value) }), ], (req, res) => { const value = req.body.value })

Téléchargez mon gratuitManuel Express.js


Plus de tutoriels express: