что значат апострофы в php запросах к mysql?

Статус
В этой теме нельзя размещать новые ответы.

satih

Хранитель порядка
Регистрация
19 Сен 2008
Сообщения
401
Реакции
721
Нубовский вопрос, но одназначного ответа не нашел. В запросах к мускулу при передаче значений параметров, можно записать
PHP:
mysql_query("update table1 set col1 = 'x1', col2 = 'x2'");
можно
PHP:
mysql_query("update table1 set col1 = x1, col2 = x2");
тоже самое и с insert и остальными функциями. какой функционал у апострофа -> ' <- кроме как разделитель для удобства?
 
все символы заключенные в кавычки интерпретируются как строка

а если строку не заключать в кавычки то парсер SQL попытается ее интерпретировать иначе

да и как-то я сомневаюсь что запрос без кавычек выполняется

да и ИМХО нет никакого удобства в подобном разделении
 
Защита от SQL Injection. Первая линия обороны :)
можно линки где что-то написано по каким либо доводам? а то даже незнаю с чего начинать гугль рыть для документации где нужны а где неважно.

спасибо, посмотрел насчет защиты, намек понял.

------------------------------------------------------------------------------

да и как-то я сомневаюсь что запрос без кавычек выполняется
только что проверил
PHP:
mysql_query("update s3 set id = '3'");
PHP:
mysql_query("update s3 set id = 4");
оба выполнились
 
satih
PHP:
mysql_query("update table1 set col1 = x1, col2 = x2");
здесь вы присваиваете строку col1 = x1
PHP:
mysql_query("update s3 set id = 4");
а здесь присваиваете число
первый запрос явно не выполнился ( возможно и при каких-то специфических настройках СУБД и будет работать, но в теории не должен)

ну а второй выполнятся так как там простое число ....



походу наглядный вариант зачем оно надо ....
в таблице есть 2 поля col1, и col2

к первому хотим присвоить следующую строку;
"qwe , sss = ddd + 333";


делаем это без кавычек
PHP:
mysql_query("update table1 set col1 = qwe , sss = ddd + 333, col2 = x2");

и таким образом у нас вместо обновления двух столбцов идет обновление троих col1 , sss, col2 ... а колонки sss в таблице то и нет ....


а если делать запрос с кавычками то в поле col1 запишется строка "qwe , sss = ddd + 333"; ....


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

если же кавычки нет, то "SQL" попытается каким-то образом обработать символы, ....
попробует определить не являются ли символы каким-то математическим выражением ...
PHP:
mysql_query("update s3 set id = 4 +2 * 3");
какими-то функциями ....
может позапросом .. ..
PHP:
mysql_query("update s3 set id = SELECT id from t2 limit 1");
и так далее
 
супер, ответ исчерпывающий, спасибо, пошел курить мускул дальше
 
дополню. например, имеем для идентификации пользователя следующую конструкцию, где переменная user_id передается при помощи GET (НАПРИМЕР!:(

PHP:
$res = mysql_db_query ($dbase, "select * from auth_table where id=$user_id");
if (!$res)
      do_authentication();
else
      do_righ_user();

т.е. если по идентификатору выборка из базы состоялась, выводим нормальную страницу (do_righ_user), если нет, то заставляем ввести логин-пароль и запрещаем все остальное (do_authentication)

Теперь представим, что некто скормил сценарию переменную:

Код:
http://server.com/script.php?user_id=0%20OR%201%3D1
(что в декодированном состоянии соответствует
Код:
http://server.com/script.php?user_id=0 OR 1=1
)

В результате в сценарии запрос будет выглядеть как select * from auth_table where id=0 OR 1=1. И получается что пользователь "проваливается" на нормальную страницу без авторизации, ибо данный запрос всегда вернет какие то строки, т.е. будет соответствовать ситуации авторизованного пользователя.
С другой стороны, если бы мы взяли в апострофы select * from auth_table where id='$user_id', сервер при формировании запроса выше, получил бы выборку select * from auth_table where id='0 OR 1=1' и вернул бы пустой ответ, что и соответствовало бы штатной ситуации неавторизованного пользователя.

вот как то так вкратце.
 
diavolic, твой ример конечно хорош, но не доказывает преимущество применения кавычек ибо айди пользователя скорее всего integer, а для него лучше не использовать кавычки. В твоем случае надо все таки надо валидацию входящих данных провести и простая проверка на число послала бы такого умника (пытавшегося обмануть нас) на три буквы еще до запроса к базе ;)
 
diavolic, твой ример конечно хорош, но не доказывает преимущество применения кавычек ибо айди пользователя скорее всего integer, а для него лучше не использовать кавычки. В твоем случае надо все таки надо валидацию входящих данных провести и простая проверка на число послала бы такого умника (пытавшегося обмануть нас) на три буквы еще до запроса к базе ;)

разумеется где то там вверху подразумевалось наличие как минимум addslashes

кстати, может тебя это удивит, но в маське обращение к целым числам возможно и даже нужно делать при помощи апострофов
 
Чтобы защититься от SQL-инъекций, все внешние параметры должны быть перед включением в SQL-запрос и обработаны с помощью mysql_real_escape_string($var, $conn) и заключены в одиночные кавычки. Не игнорируй 2-й необязательный параметр $conn, т.к. с некоторыми кодироваками вся защита может свестись на ноль. А чтобы не забывать это делать при каждом SQL запросе - напиши как минимум функцию, а то и класс по работе с БД, которые и кавычки расставят, и mysql_real_escape_string выполнят.
У меня сейчас запросы выглядят так query('SELECT * FROM `tablename` WHERE f1={?} AND f2={?} AND id={?}',$param1, $param2, $param3); где на место плейсхолдера {?} (может быть любым, как придумаешь) ставится уже обработанный параметр.

И будет тебе счастье.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху