Вы видели, как проверять входные данные, поступающие из внешнего мира в ваше приложение 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’ возвращают значение trueToDate()преобразует входную строку в дату или значение 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/”