Как вставить значение NULL из nodeJS / javascript в MySQL с помощью параметризованных входов? - PullRequest
0 голосов
/ 05 февраля 2019

Как мне убедиться, что значение, вставляемое в базу данных, на самом деле является значением NULL, а не NULL или пустой строкой с использованием параметризованных входов?

Примечание: этот вопрос был изменен из вопроса, чтобы стать больше учебником.

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Вы должны создать вторую таблицу и заполнить ее только в том случае, если myname! == Null

и

выберите mytable t1 left join mytablewithvalidnames t2 на t1.id = t2.id

Таким образом, t2.myname будет иметь значение Null

0 голосов
/ 05 февраля 2019

Использование 'mariadb / callback' в качестве соединителя с базой данных:

const db = require('mariadb/callback');

mariaDB - это одна опция для базы данных MySQL.

Давайте используем следующие переменные в качестве примера:

var customName = '    ';
var someAddress = 'this is an address';
var mainID = 'some unique ID';
var secondID = 'maybe not a unique ID';

Запросы параметризованы следующим образом:

var sql = `UPDATE myTable SET myName=?, myAddress=? WHERE _id=? AND otherID=?;`;

Используя '?'символ вместо имени переменной вы не только упростите оператор SQL, но и, что более важно, предотвратит внедрение SQL.В частности, если одна из переменных хранила это:

var id = '42 OR 1=1;'

В результате неиспользования параметризованных входов в этом случае может произойти обновление всей таблицы с тем же именем и адресом.Использование параметризованных входов просто приведет к сбою этой операции, поскольку ни один из идентификаторов в базе данных не будет равен '42 OR 1 = 1 '.

Теперь, если customName - пустая строка или пробел, или даже' NULL'string, вы можете сделать это:

customName = customName.trim();
if ( (customName === '') || (customName.toUpperCase() === 'NULL') ) {
  customName = null;
}

Что совпадает с:

if ( (customName.trim() === '') || (customName.trim().toUpperCase() === 'NULL') ) {
  customName = null;
}

(первая версия просто переназначает customName без пробелов в начале / конце - убедитесь, что вы не используетене нужно сохранять значение строки при выборе этого метода)

.trim() удалит все пробелы с обоих концов строки (не удалит пробелы между любыми непробельными символами).

.toUpperCase() изменит строку на все заглавные буквы, таким образом, если строка 'null' или 'Null' или любая другая вариация, которая включает любые строчные символы, она все равно будет иметь значение 'true' при оценке«NULL» равенство.Обратите внимание, что здесь также важно использовать .trim(), чтобы

'  nuLl  '

становилось

'NULL'

и все равно оценивалось как 'true'.

Далее,нам нужно создать наш массив значений:

var values = [customName, someAddress, mainID, secondID];

Наконец, запрос db:

db.query(sql, values, (err, result) => {
  // callback stuff to do here
}

db относится к соединителю, созданному в начале этого поста.Я не включил сам процесс подключения, потому что это выходит за рамки этого поста.Для справки документация по API находится здесь .

ПОСЛЕ подключения БД, db.query используется для выполнения запроса.Первый аргумент «sql» - это параметризованный оператор SQL.Второй аргумент 'values' - это массив значений, которые будут использоваться в запросе.Этот массив ДОЛЖЕН быть в том же порядке, в котором он будет использоваться.

В качестве примера того, что не следует делать:

var sql = `UPDATE myTable SET myName=${customName}, myAddress=${someAddress} WHERE _id=${mainID} AND otherID=${secondID};`;

Причина, по которой это плохо, связана с внедрением SQL, котороеработает следующим образом: вы начинаете с этого:

var customName = 'same name';
var mainID = '" OR ""="';
var secondID = '" OR ""="';

Полученный код sql будет выглядеть следующим образом:

var sql = `UPDATE myTable SET myName="same name", myAddress="this is an address" WHERE _id="" OR ""="" AND otherID="" OR ""="";`;

И в результате теперь каждая отдельная запись в базе данных теперь имеет такой жеимя и тот же адрес.

Этот пример SQL-инъекции модифицирован из W3 школ .

0 голосов
/ 05 февраля 2019

Как насчет, если вы попробуете INSERT INTO mytable VALUES ('', NULLIF('$customName',''))

Вот некоторые другие ресурсы, которые, похоже, имеют аналогичную проблему, Установите значение NULL в MySQL , Как обновитьстолбец с нулевым значением , Установите значение NULL в MySQL

также теперь, когда я думаю об этом, вам просто может потребоваться изменить customName = "NULL"

...