Почему ЗНАЧЕНИЯ записываются между кавычками при отправке в базу данных? - PullRequest
0 голосов
/ 04 июня 2018

Я не совсем уверен, должен ли я публиковать это здесь или нет, так как он не содержит никакого реального кодирования, но я долго думал об этом, и никто не мог дать мне хороший ответ (излюди, которых я спрашивал / исследование сделано).Меня учили писать (при вставке чего-либо в БД):

$sql = "INSERT INTO usertimes (name,date,amount,times)
VALUES ('$name', CURDATE(), '$amount', '$times') ON DUPLICATE KEY UPDATE    
date=CURDATE(), amount='$amount', times='$times'"; 

Это всего лишь пример, но мне было интересно;Почему вокруг имен переменных есть кавычки?Разве эти переменные не остаются переменными с технической точки зрения?Я провел некоторое исследование, как упомянуто ранее, но это на самом деле не объясняет, почему мы это делаем, я просто нахожу материал, связанный с этим: Добавить кавычки вокруг переменной Мои извинения, если это новый вопрос и / или если онне должны быть размещены здесь.Мне просто любопытно, почему мы так поступаем, так как с самого начала мы узнаем, что переменная не должна иметь кавычек вокруг нее, или вы будете буквально брать кавычку (например: вы увидите $ раз вместо значения, данного $ раз).

Ура!

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Давайте рассмотрим упрощенный пример:

$foo = "world";
echo "Hello $foo";

$foo - это переменная, содержащая строку, а оператор echo «интерполирует» в другую строку.Строка из $foo будет помещена непосредственно в строку, и вы не сможете увидеть «соединение».Вывод будет Hello world.

Теперь давайте добавим несколько цитат внутри строки:

echo "Hello '$foo'";

$foo по-прежнему интерполируется и теряет свою идентичность, но символы 'также являются частью окончательной строки.Вывод будет Hello 'world'.

В вашем SQL это то, что вы делаете - вы объединяете несколько строк в одну, и в результате получается оператор SQL.Допустим, SQL, который вы хотите получить, выглядит следующим образом:

SELECT * FROM things WHERE thing_name = 'world'

Эти кавычки показывают, как вы анализатор SQL в базе данных , что 'world' является строкой, а нескажем, имя столбца.

Используя наше определение $foo из предыдущего, мы можем построить это так:

$sql = "SELECT * FROM things WHERE thing_name = '$foo'";

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

Однако, как уже отмечали другие, именно отсюда и риск «внедрения SQL».Представьте, что злоумышленник может обмануть нас, установив для $foo значение по своему выбору:

$foo = "world'; DROP TABLE things; --";

Теперь, когда мы строим нашу строку SQL, мы получаем следующее:

SELECT * FROM things WHERE thing_name = 'world'; DROP TABLE things; --'

Упс!

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

 SELECT * FROM things WHERE thing_name = :foo

Обратите внимание, что в отличие от нашей наивной интерполяции, мы не ставим кавычки вокруг заполнителя :foo.Это связано с тем, что при правильном использовании текст здесь никогда не подставляется.Вместо этого база данных «подготовит» оператор в виде запроса, подобного «выберет все столбцы из таблицы things на основе значения, которое будет сопоставлено с thing_name», и «выполнит» его, сказав «соответствует этой переменнойпротив thing_name ".

Теперь, когда мы передаем строку наших атакующих в качестве параметра для :foo, мы просто получаем запрос, ищущий вещи с этим именем;поскольку предположительно их не будет, мы получим только пустой результат.

0 голосов
/ 04 июня 2018

Чтобы сообщить драйверу MySQL, что ввод является строкой или функцией / отношением MySQL.

Пример для записи строки:

UPDATE TABLE SET name = 'name' WHERE id = 1;

(будетобновить поле до «name»)

Пример, в котором MySQL считает, что это отношение:

UPDATE TABLE SET name = name WHERE id = 1;

(не будет обновляться, поскольку это его собственное значение столбца)

Пример, чтобы MySQL обновил поле до «select»

UPDATE TABLE SET name = 'select' WHERE id = 1;

(обновит поле до «select»)

Пример, в котором MySQL считает, что это функция

UPDATE TABLE SET name = select WHERE id = 1;

(вернет синтаксическую ошибку, потому что вызовет функцию select)

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