Автор Тема: Кавычки в запросе к базе  (Прочитано 8950 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Slastik

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 101
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.sproekt.kiev.ua
Кавычки в запросе к базе
« : 04 Сентября 2004, 00:36:17 »
У меня такой небольшой вопрос.

рационально ли использовать кавычки в запросе к базам данных??  например в таком запросе

mysql_query("DELETE from answer where vote_id=\'$_GET[del]\' and name=\'$_GET[name]\' ") or die (mysql_error())

нужны ли в таком запросе, кавычки для переменных.

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

Почитал на http://phpfaq.ru/slashes
там написано что кавычки нужны для того что бы отличить данные от команд. А также и числовые переменные  нужно брать в кавычки для простоты.

Но как раз здесь по-моему, и есть довольно неприятный, момент, когда mysql попытаеться, привести типы данных
то получиться ошибка которая не обнаружиться, при использовании кавычек,  если же кавычки не ставить, то сразу становится  понятно где ошибка.

а про безопасность я там вообще ничего не увидел.

хотелось бы уже как то определиться писать их или нет.
а то я их то пишу то нет.

????
FAQ OFF =)

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Кавычки в запросе к базе
« Ответ #1 : 04 Сентября 2004, 01:22:13 »
Цитировать
Slastik:
Но как раз здесь по-моему, и есть довольно неприятный, момент, когда mysql попытаеться, привести типы данных
то получиться ошибка которая не обнаружиться

Если ты считаешь, что ошибка запроса - это самый лучший способ проверить данные на корректность - флаг тебе в руки. И барабан на шею - вперед и с песней на грабли.
Я правильно тебя понял, что "трудноуловимая ошибка" - это несоответствие типа ожидаемому - вместо числа передадут строку, и запишется ноль?

Подсказка. Запрос НЕ предназначен для того, чтобы проверять ошибки. Ошибки должен проверять программист.
А от запроса требуется как раз БЕЗОШИБОЧНОЕ выполнение.
Цитировать
там написано что кавычки нужны для того что бы отличить данные от команд.

Тебе этого МАЛО?
Мало примеров, которые на пальзах объясняют, что будет, если текст не будет взят в кавычки?
Цитировать
Slastik:
А также и числовые переменные нужно брать в кавычки

не надо врать.
Там написано, что можно!
Не хочешь брать в кавычки - ради бога, приводи сам данные к нужному типу.
Впрочем, такая проверка совершенно не мешает все равно заключать все данные в кавычки. для надежности.
Цитировать
Slastik:
а про безопасность я там вообще ничего не увидел.

купи себе очки.
И прочти еще раз. Авось, увидишь.
Цитировать
Slastik:
хотелось бы уже как то определиться писать их или нет.

Тебе нужна помощь не специалиста по программированию, а окулиста.
потому, что в прочитанном тобой факе раза три ОДНОЗНАЧНО отвечено на этот вопрос.

Не говоря уже о том, что ты, сомневаясь, что кавычки нужны для чисел, задаешься вопросом, а стоит ли их использовать ВООБЩЕ, для любых типов. Долго думал над таким выводом?

И последнее.
$_GET[del] - так писать неправильно.
Надо писать
$_GET[\'del\']
Ключом массива у тебя является строка \'del\', а не константа del.
А строки в пхп ограничиваются кавычками.
« Последнее редактирование: 04 Сентября 2004, 01:31:56 от RomikChef »

Оффлайн Slastik

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 101
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.sproekt.kiev.ua
Кавычки в запросе к базе
« Ответ #2 : 04 Сентября 2004, 02:12:23 »
1.
Цитировать
RomikChef:
Если ты считаешь, что ошибка запроса - это самый лучший способ проверить данные на корректность - флаг тебе в руки. И барабан на шею - вперед и с песней на грабли.

Подсказка. Запрос НЕ предназначен для того, чтобы проверять ошибки. Ошибки должен проверять программист.


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

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

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

Цитировать
RomikChef:
такая проверка совершенно не мешает все равно заключать все данные в кавычки. для надежности.


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

Цитировать
RomikChef:
не надо врать.
Там написано, что можно!

Да ошибся
Написал исключительно по рассеяности, без какого либа акцента на слове нужно.

Цитировать
RomikChef:
купи себе очки.


В основном фак написан про слеши,
----
Тем более, что мы не можем быть уверены в том, что от пользователя пришла переменная именно того типа, который мы ожидаем. То есть, для надежности, любые данные, вставляемые в запрос, мы будем заключать в кавычки.
-----

вот и все что я нашел про кавычки, и безопасность.
Кстати написано будем, а не можем.
а дальше  все про слеши.

Хотя боюсь что все таки что то я упустил :)

Цитировать
RomikChef:
Ключом массива у тебя является строка \'del\', а не константа del.
А строки в пхп ограничиваются кавычками.


про это я тоже знал, чесно :)
почему тогда написал?... узнал буквально вчера.
а переписать запрос, не успел.
и так и вставил.

и еще хотел сказать.
такого колоритного модератора как RomikChef, редко встретиш, иногда захожу на форум только ради того что бы почитать твои посты :)
FAQ OFF =)

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Кавычки в запросе к базе
« Ответ #3 : 04 Сентября 2004, 03:17:10 »
Я рад, что ты не распускаешь нюни, как большинство здесь. Действительно рад. Похоже, в КПИ дураков не держат.
За это я попробую объяснить тебе по второму разу.
Цитировать
Slastik:
Но если все таки возможна ошибка, то отследить ее, при использовании кавычек будет сложней.

Повторяю. Отслеживать должен программист. ДО запроса.
И дело даже не в том, что запрос может пройти и без ошибок! Только вот делать он будет совсем не то, что хотел программист!
А в том, что это соверешнно дурацкая практика, отсуствтвие логики и головотяпство - ловить ошибку не там, где надо, а где светлее. ЗАПРОС НЕ ПРЕДНАЗНАЧЕН ДЛЯ ЛОВЛИ ОШИБОК В ДАННЫХ!

У тебя, чудик, выводится сообщение mysql об ошибке в запросе.
Это ты называешь отловом ошибок?
Вместо человеческого "Вы вели недопустимую переменную в поле нумбер" на человека вываливается u have error in query near

Офигенная обработка ошибок. Браво.

Цитировать
Slastik:
каким образом надежность увеличится?

Как можно быть таким непонятливым? Мне плевать на ошибки в логике твоей программы, которые ты не отловил "из-за кавычек".
Надо различать, вообще-то, опасности.
Если ты ошибся на машине и не туда свернул - это НИКОГО не волнует, кроме тебя. Это совершенно не фатальная ошибка, если ты не следуешь СВОЕМУ маршруту.
А вот если ты не соблюдаешь правила дорожного движения - ты потенциальныйц убийца и преступник. И поэтому соблюдения ПДД от тебя требуют. А соблюдения маршрута - нет. Потому, что не сравним уровень ВРЕДА!

Так и здесь. Плевать на твои собственные ошибки. Но БАЗУ ты должен защитить. Не хватает ума без нее проверку сделать - поищи себе другое занятие.

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

Цитировать
Slastik:
Хотя боюсь что все таки что то я упустил

Бояться не надо.Надо просто внимательно прочесть.
Есть, правда, еще один варинат, но не уверен, что он тебе подойдет.
« Последнее редактирование: 04 Сентября 2004, 03:22:54 от RomikChef »

Оффлайн Slastik

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 101
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.sproekt.kiev.ua
Кавычки в запросе к базе
« Ответ #4 : 04 Сентября 2004, 12:14:01 »
Боюсь, попасть под разнос :)
Но все же бог любит троицу.
Цитировать
RomikChef
Повторяю. Отслеживать должен программист. ДО запроса.......ЗАПРОС НЕ ПРЕДНАЗНАЧЕН ДЛЯ ЛОВЛИ ОШИБОК В ДАННЫХ!


Опять же я это отлично понимаю.

Постараюсь, обяснить что именно меня смущает.

Естественно я не буду использовать функцию, mysql_error
как обработчик, а написал я ее, потому что то что я пишу, пока еще на стадии разработки, и проходит отлаживание  , а видеть ошибку mysql гораздо информативней чем безличное DataBase Error.


Цитировать
]RomikChef
Так и здесь. Плевать на твои собственные ошибки. Но БАЗУ ты должен защитить. Не хватает ума без нее проверку сделать - поищи себе другое занятие.


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



Цитировать
RomikChef
Надо различать, вообще-то, опасности.
Если ты ошибся на машине и не туда свернул - это НИКОГО не волнует, кроме тебя. Это совершенно не фатальная ошибка, если ты не следуешь СВОЕМУ маршруту


вот из за этого момента я и решился, еще раз написать.
Получаеться что если я например не корректно проверил данные и допустил запрос с некорректными данными, но при этом использовал кавычки, то я всего лиш изменил маршрут.
Но если же я не использовал кавычки то это сравни ДТП
хотя на том же http://phpfaq.ru/slashes
есть ссылка на сайт где показано, что если програмист допустил некорректные данные в запросе, тоесть не проверил их при получении от юзера, то никакие кавычки
уже не помогут, стоит только перебрать парочку вариантов, раставления кавычек и получиться ДТП.
Так нужны ли они тогда?

Цитировать
RomikChef
Есть, правда, еще один варинат, но не уверен, что он тебе подойдет.


Было бы все таки интересно выслушать.

Вот.. надеюсь, что ты развееш мои сомнения по поводу пункта с ДТП.
Буду очень рад тебя выслушать.
FAQ OFF =)

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Кавычки в запросе к базе
« Ответ #5 : 04 Сентября 2004, 12:36:27 »
Цитировать
Slastik:
и екранирую спецсимволы

Расскажи-ка мне, как ты экранируешь спецсимвол "пробел".
После этого с удовольствием побеседую с тобой дальше.
Цитировать
Slastik:
Получаеться что если я например не корректно проверил данные и допустил запрос с некорректными данными, но при этом использовал кавычки, то я всего лиш изменил маршрут.

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

У тебя просто фантастическая способность понимаь тексты ровно в противоположном смысле.
Боюсь, я переоценил твои способности.
Течатный текст не оказывает на тебя должноговоздействия. Точнее, оказывает противоположное. То есть, ты понимаешь РОВНО наоборот.

Если бы ты не просто читал фак, а ПОНЯЛ что там написано (а специально для таких, как ты, там буквально неделю назад появились примеры, разжевывающие все до состояния мелкой кашицы), то ты бы все сам прекрасено понял - и как ломать и как защита работает. И текст по ссылке (которую, наконец, разглядел, слава богу) понял бы ПРАВИЛЬНО.
Но, похоже, тебе не дано.

Оставь меня.
Возьми примеры, которые, как ты утверждаешь, "если поставить кавычки, то все равно" и, НЕ ПОДКЛЮЧАЯ МОЗГИ, которые тебе только мешают, а просто РУКАМИ попробуй провернуть то, что написано в статье. с кавычками и без.
Может, хоть так дойдет?

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Кавычки в запросе к базе
« Ответ #6 : 04 Сентября 2004, 12:46:06 »
у тебя с логикой большие проблемы.
Из того, что сайт ломается, если программист НЕ ДОБАВИЛ СЛЕШИ к данным, ты делаешь вывод о том, что КАВЫЧКИ НЕ НУЖНЫ.

Вывод на уровне "Зачем мне холодильник, если я не курю".

Оффлайн Slastik

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 101
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.sproekt.kiev.ua
Кавычки в запросе к базе
« Ответ #7 : 04 Сентября 2004, 13:19:59 »
Цитировать
RomikChef
Расскажи-ка мне, как ты экранируешь спецсимвол "пробел"

Пробел не екранировал, имелл ввиду кавычки,


Цитировать
RomikChef
Из того, что сайт ломается, если программист НЕ ДОБАВИЛ СЛЕШИ к данным, ты делаешь вывод о том, что КАВЫЧКИ НЕ НУЖНЫ.

Да примерно такой вывод, я и сделал.

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

mysql_query("DELETE from question where id=".$_GET[\'del\']."")

и задал переменную, $_GET[\'del\']="1 or 1=1"
получил удаление всех данных из таблицы.
если же использовать кавычки то переменная уже имеет
вид $_GET[\'del\']="1\' or \'1=1"
что уже немного сложнее, тоесть если использовать кавычки, взломщику, прийдеться попариться гораздо дольше так как он не будет знать структуры запроса.

Я правильно понял?
FAQ OFF =)

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Кавычки в запросе к базе
« Ответ #8 : 04 Сентября 2004, 13:55:18 »
Скажи, для тебя комбинация доказательств недоступна?
Ты можешь воспринять ТОЛЬКО кавычки или ТОЛЬКО слеши?
Факт, что защиту обеспечивает КОМБИНАЦИЯ этих факторов в голове у тебя, похоже, просто не помещается.

Я, в общем, в тебе ошибся. С самооценкой у тебя все нормально, но вот с логикой - кранты.

Цитировать
Slastik:
Пробел не екранировал

Вот и обломись.

Оффлайн Slastik

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 101
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.sproekt.kiev.ua
Кавычки в запросе к базе
« Ответ #9 : 04 Сентября 2004, 14:27:46 »
Могу все воспринимать :)
но про пробелы, я не думал.
Я использовал функцию addslashes(), а она екранирует только.

одинарная (\'), и двойная (") кавычки, обратный слэш/backslash (\\) и NUL (NULL-байт).

не совсем понимаю что имеется ввиду в мане под словами, Null байт.
Но думаю  не пробел :)

Вообщем буду искать про пробелы. Спасибо что  указал.

Если же я правильно понял, про кавычки, (то что я писал в последнем своем посте) то я узнал впринципе что хотел.

Спасибо за внимание.
FAQ OFF =)

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Кавычки в запросе к базе
« Ответ #10 : 04 Сентября 2004, 14:55:34 »
ДУМАТЬ от тебя и не требовалось. Тебе нужно только соблюдать две примитивные рекомендации.

"Экранированием" пробелов занимаются КАВЫЧКИ!, Кавычки, расположенные по краям данных!
Они показывают, что пробелы в расположенных между ними словах  - это не разделители ключевых слов в запросе, а всего лишь ЧАСТЬ ДАНЫХ

И если бы ты не пил так много, то увидел бы в факе пример, который это показывает:
pole=\'vasa puplin\' - это ДАННЫЕ
pole=vasa pupkin - здесь vasa - это данные, а pupkin уже воспринимается, как ЧАСТЬ ЗАПРОСА

Цитировать
Slastik:
я узнал впринципе что хотел.

я безмерно счастлив.

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Кавычки в запросе к базе
« Ответ #11 : 04 Сентября 2004, 15:04:16 »
Цитировать
взломщику, прийдеться попариться гораздо дольше

Взломщик не взломает ничего ВООБЩЕ!
Если соблюдать ОБЕ рекомендации.
А не выбирать только ОДНУ и всем доказывать, что даже при строгом ее соблюдении, дыры останутся.
И на этом основании выбирать "менее дырявую".

Нет, это, все-таки, фантастический по своей тупости топик.

Оффлайн Slastik

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 101
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.sproekt.kiev.ua
Кавычки в запросе к базе
« Ответ #12 : 04 Сентября 2004, 15:24:45 »
Цитировать
RomikChef:
Они показывают, что пробелы в расположенных между ними словах - это не разделители ключевых слов в запросе, а всего лишь ЧАСТЬ ДАНЫХ


дамс :) тут я точно тебя понял, неправильно.
под словом "екранирование" пробелов я понял немного не то.

Цитировать
RomikChef:
pole=\'vasa puplin\' - это ДАННЫЕ
pole=vasa pupkin - здесь vasa - это данные, а pupkin уже воспринимается, как ЧАСТЬ ЗАПРОСА


Само собой я это понимаю. Мне просто в голову не пришло что ты именно это имел ввиду.
В случае когда
я пишу pole=\'$vasa_puplin\' нет никаких пробелов,
(кроме естественно тех  которые хранятся в переменной)
я могу и написать pole=$vasa_puplin
именно про случай с переменными  я и говорил.
так как если написать
pole=vasa pupkin  то ессесно получиться ошибка(и о варианте не использования кавычек не может быть и речи), а я спрашивал,
про  вариант, когда mysql обрабатывает данные как с кавычками так и без.

Цитировать
RomikChef:
Взломщик не взломает ничего ВООБЩЕ!
Если соблюдать ОБЕ рекомендации.

Теперь когда понял что ты имел ввиду , под екранированием пробелов.
Абсолютно с этим согласен и впредь буду, их придерживаться.

Цитировать
RomikChef:
Нет, это, все-таки, фантастический по своей тупости топик.


:) да, есть немного
но зато хотя бы одному человеку он помог.
FAQ OFF =)

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Кавычки в запросе к базе
« Ответ #13 : 04 Сентября 2004, 15:29:57 »
Цитировать
Slastik:
В случае когда
я пишу pole=\'$vasa_puplin\' нет никаких пробелов,

то есть, ты считаешь, что запрос прямо в таком виде и отправляется в базу?
Оказывается, все даже гораздо веселее, чем я думал.

Оффлайн Slastik

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 101
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.sproekt.kiev.ua
Кавычки в запросе к базе
« Ответ #14 : 04 Сентября 2004, 15:38:18 »
Дамс... :)

Стыдно. Каюсь.
и тут ты прав!

надо больше думать прежде чем писать :)
FAQ OFF =)

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28