Инъекции
SQL инъекция – очень частое явление, несмотря на то, что обезопасить себя от неё довольно просто. Очень хорошо, когда вы используете хранимые процедуры (на моём опыте это не всегда удобно, хоть и надёжнее) так как они делают связь с mysql безопаснее, разрешив, к примеру, только хранимые процедуры. То есть злоумышленник сможет получить только те данные, которые выдают ему процедуры, но не все, что ему нужны. По поводу запросов к mysql от бэка. Тут нужно придерживаться нескольких правил: 1. Не использовать регулярные выражения. 2. Проверять все пользовательские данные на содержимое и размер. 3. Использовать экранирование пользовательских данных. Вот так:
const GET_USER = `SELECT * FROM users WHERE id = ?;`;
await fastify.mysql.query(GET_USER, [_user_id]);
В примере кода показан обычный запрос к MySQL. Знак "?" означает, что там должны быть данные. Каждый знак вопроса – это индекс в массиве, который передается в fastify.mysql.query() вторым аргументом. Вот пример с двумя параметрами, чтобы было более понятно:
const GET_USER = `SELECT * FROM users WHERE id = ? AND role = ?;`;
await fastify.mysql.query(GET_USER, [_user_id, user.role]);
fastify.mysql.query принимает первым аргументом строку самого запроса, а вторым – параметры. Таким образом пользовательские данные экранируются автоматически. На этом всё. Ничего сложного в обеспечении защиты от sql инъекций нет, но нужно выработать чёткое понимание, почему они могут происходить и что мешает этому.
Last updated
Was this helpful?