Очистка ввода в Express с помощью экспресс-валидатора

Вы видели, как проверять ввод, поступающий из внешнего мира в ваше приложение Express.

Когда вы запускаете общедоступный сервер, вы быстро понимаете одну вещь: никогда не доверяйте вводимым данным.

Даже если вы продезинфицируете и убедитесь, что люди не могут вводить странные вещи, используя код на стороне клиента, вы все равно будете подвержены людям, использующим инструменты (даже только инструменты разработчика браузера) для POST напрямую на ваши конечные точки.

Или боты пробуют всевозможные комбинации эксплойтов, известных людям.

Что вам нужно сделать, так это очистить ваш ввод.

Вexpress-validatorупаковкавы уже используете для проверки ввода, может также удобно использовать для выполнения очистки.

Допустим, у вас есть конечная точка POST, которая принимает параметры имени, электронной почты и возраста:

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 })

Вы можете проверить это, используя:

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 })

Вы можете добавить дезинфекцию, указав методы дезинфекции после валидационных:

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

Здесь я использовал методы:

  • trim()обрезает символы (по умолчанию пробелы) в начале и в конце строки
  • escape()заменяет<,>,&,',"и/с соответствующими объектами HTML
  • normalizeEmail()канонизирует адрес электронной почты. Принимает несколько вариантов строчных адресов электронной почты или дополнительных адресов (например,[email protected])

Другие методы санитарной обработки:

  • blacklist()удалить символы, которые появляются в черном списке
  • whitelist()удалить символы, которых нет в белом списке
  • unescape()заменяет объекты в кодировке HTML на<,>,&,',"и/
  • ltrim()как trim (), но обрезает только символы в начале строки
  • rtrim()как trim (), но обрезает только символы в конце строки
  • stripLow()удалить управляющие символы ASCII, которые обычно невидимы

Принудительное преобразование в формат:

  • toBoolean()преобразовать входную строку в логическое значение. Все, кроме «0», «ложь» и «, возвращает истину. В строгом режиме только «1» и «истина» возвращают истину.
  • toDate()преобразовать строку ввода в дату или null, если ввод не является датой
  • toFloat()преобразовать входную строку в число с плавающей запятой или NaN, если ввод не является числом с плавающей запятой
  • toInt()преобразовать входную строку в целое число или NaN, если вход не является целым числом

Как и в случае с пользовательскими валидаторами, вы можете создать собственный дезинфицирующий инструмент.

В функции обратного вызова вы просто возвращаете очищенное значение:

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

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

Скачать мою бесплатнуюСправочник Express.js


Дополнительные экспресс-руководства: