Чтобы безопасно вставлять данные в таблицу в Node.js, следует использовать параметризованные SQL-запросы и избегать прямого объединения пользовательского ввода в SQL-запросы. Это помогает предотвратить атаки с внедрением SQL, когда злоумышленник может манипулировать пользовательским вводом для выполнения непреднамеренных команд SQL в вашей базе данных.
Вот пример использования параметризованных запросов для вставки данных в таблицу с помощью модуля mssql
в Node.js:
const sql = require('mssql'); // Configuration object for connecting to the database const config = { user: 'username', password: 'password', server: 'localhost', database: 'mydatabase' }; // Define the data to insert const apiName = 'My API'; const createdAt = new Date(); // Define the parameterized query const query = 'INSERT INTO MyAPI (api_name, created_at) VALUES (@apiName, @createdAt)';
В этом примере модуль mssql
используется для подключения к базе данных и выполнения запроса. Сам запрос определяется как строка с заполнителями параметров @apiName
и @createdAt
. Метод ввода используется для определения типов данных и значений параметров, а метод query
используется для выполнения запроса с указанными параметрами.
Использование подобных параметризованных запросов помогает убедиться, что пользовательский ввод правильно экранируется и заключен в кавычки, а также предотвращает внедрение вредоносного кода SQL в запрос.
Теперь давайте создадим универсальные функции для безопасной вставки и чтения данных из любой таблицы в Node.js с помощью модуля mssql
. Мы можем использовать параметризованные SQL-запросы для предотвращения атак SQL-инъекций. Вот пример:
// Function to insert data into a table exports.insertData = async (tableName, data) => { try { const columns = Object.keys(data).join(', '); const values = Object.values(data); const placeholders = values.map((value, index) => `@${index}`).join(', '); const query = `INSERT INTO ${tableName} (${columns}) VALUES (${placeholders})`; const pool = await sql.connect(config); const request = pool.request(); values.forEach((value, index) => { request.input(index.toString(), value); }); const result = await request.query(query); return result; } catch (err) { console.log(err); throw err; } } // Function to read data from a table exports.readData = (tableName) => { try { const query = `SELECT * FROM ${tableName}`; const pool = await sql.connect(config); const result = await pool.request().query(query); return result.recordset; } catch (err) { console.log(err); throw err; } }
В этом примере функция insertData
использует параметризованные SQL-запросы для безопасной вставки данных в любую таблицу. Функция принимает имя таблицы и объект, содержащий данные для вставки в таблицу. Функция динамически генерирует SQL-запрос на основе имени таблицы и объекта данных, используя заполнители параметров, чтобы избежать прямого объединения пользовательского ввода в SQL-запросы. Метод input
используется для определения типов данных и значений параметров, а метод query
используется для выполнения запроса с указанными параметрами.
Эти функции можно использовать для безопасной вставки и чтения данных из любой таблицы в указанной базе данных путем вызова функций с соответствующими именем таблицы и данными. Например:
// Example usage const tableName = 'MyTable'; const data = { name: 'Raj', age: 30, email: '[email protected]' }; // Insert data into the table try{ const insResponse = await insertData(tableName, data); if (insResponse.rowsAffected[0] === 1){ return res.json({message: "Data Inserted Successfully"}); } } catch (err) { return res.status(400).send(err); } // Read data from the table try{ const readResponse = await readData(tableName); return res.send(readResponse); } catch (err) { return res.status(400).send(err); }