Насколько безопасен этот сгенерированный запрос от SQL-инъекции? - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь создать панель поиска, которая работает с несколькими словами, но я беспокоюсь о внедрении SQL.

Я использую node express с npm mssql пакет.

Вот код, который получает критерии, генерирует SQL и запускает его:

router
.get('/search/:criteria', function (req, res) {
    var criteria = req.params.criteria;
    var words = criteria.split(" ");

    var x = ""
    words.map(word => x += `name like '%${word}%' and `);
    x = x.substring(0, x.length - 5); // Remove trailing 'and'

    var query = `SELECT * FROM table WHERE ${x}`

    new sql.ConnectionPool(db).connect().then(pool => {
        return pool.request().query(query)
    }).then(result => {

    })
});

Поиск something to search приведет к этому запросу:

SELECT * FROM table 
WHERE 
    name like '%something%'
    and name like '%to%'
    and name like '%search%'

Я сам попробовал несколько SQL-инъекций, но ни одна из них, похоже, не работает.


Примечание : я знаю, что мы должны всегда использовать входы для этого.Это прекрасно работает для одного слова, но я не знаю, как использовать входные данные для многих слов.Пример:

new sql.ConnectionPool(db).connect().then(pool => {
        return pool.request()
        .input('input', '%'+criteria+'%')
        .query(query)
    })

1 Ответ

0 голосов
/ 27 мая 2018

Ответ: это небезопасно.Ваш код тоже не делает ничего, чтобы сделать его безопасным.Не создавайте SQL путем конкатенации / интерполяции предоставленных пользователем данных в оператор.

Кроме того, вы не выполняете экранирование для самого LIKE, так что это так же нечисто.

Если вам нужен динамический SQL, создайте подготовленный оператор SQL с помощьюожидаемое количество заполнителей и , а затем привязывают предоставленные пользователем значения к этим заполнителям.

router.get('/search/:criteria', (req, res) => {
    const ps = new sql.PreparedStatement();
    const sqlConditions = [];
    const escapedValues = {};

    // set up escaped values, safe SQL bits, PS parameters
    req.params.criteria.split(" ").forEach((v, i) => {
        const paramName = 'val' + i;
        escapedValues[paramName] = v.replace(/[\\%_]/g, '\\$&');
        sqlConditions.push(`name LIKE '%' + @${paramName} + '%' ESCAPE '\'`);
        ps.input(paramName, sql.VarChar);
    });

    // build safe SQL string, prepare statement
    const sql = 'SELECT * FROM table WHERE ' + sqlConditions.join(' AND '); 
    ps.prepare(sql);

    // connect, execute, return
    ps.execute(escapedValues).then(result => {
        res(result)
    });
});

(Отказ от ответственности: код не тестировался, так как сейчас у меня нет доступного SQL Server, но вы получаетеидея.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...