Рубрики
Без рубрики

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

Вы видели, как проверять входные данные, поступающие из внешнего мира в ваше приложение Express. Есть одна вещь, которую вы быстро усвоите, когда запускаете общедоступный сервер: никогда не доверяйте входным данным. Даже если вы очистите и убедитесь, что люди не могут вводить странные вещи с помощью кода на стороне клиента, вы все равно будете подвержены тому, что люди будут использовать инструменты (даже просто средства разработки браузера) для публикации непосредственно на ваших конечных точках. Или боты, пытающиеся использовать все возможные комбинации эксплойтов, известных людям.

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

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

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

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

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

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

Допустим, у вас есть конечная точка 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) => {
  //...
})

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

  • отделка( ) обрезает символы (по умолчанию пробелы) в начале и в конце строки
  • escape() заменяет < , > , & , ' , " и |/| с соответствующими HTML-объектами normalizeEmail()
  • канонизирует адрес электронной почты. Принимает несколько вариантов для строчных адресов электронной почты или подадресов (например, flavio+newsletters@gmail.com )

Другие методы дезинфекции:

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

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

  • ToBoolean() преобразует входную строку в логическое значение. Все, кроме “0”, “ложь” и “возвращает истину. В строгом режиме только ‘1’ и ‘true’ возвращают значение true
  • 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
})

Оригинал: “https://flaviocopes.com/express-sanitize-input/”