Forum Webscript.Ru
Программирование => PHP => Тема начата: Slastik от 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 попытаеться, привести типы данных
то получиться ошибка которая не обнаружиться, при использовании кавычек, если же кавычки не ставить, то сразу становится понятно где ошибка.
а про безопасность я там вообще ничего не увидел.
хотелось бы уже как то определиться писать их или нет.
а то я их то пишу то нет.
????
-
Slastik:
Но как раз здесь по-моему, и есть довольно неприятный, момент, когда mysql попытаеться, привести типы данных
то получиться ошибка которая не обнаружиться
Если ты считаешь, что ошибка запроса - это самый лучший способ проверить данные на корректность - флаг тебе в руки. И барабан на шею - вперед и с песней на грабли.
Я правильно тебя понял, что "трудноуловимая ошибка" - это несоответствие типа ожидаемому - вместо числа передадут строку, и запишется ноль?
Подсказка. Запрос НЕ предназначен для того, чтобы проверять ошибки. Ошибки должен проверять программист.
А от запроса требуется как раз БЕЗОШИБОЧНОЕ выполнение.
там написано что кавычки нужны для того что бы отличить данные от команд.
Тебе этого МАЛО?
Мало примеров, которые на пальзах объясняют, что будет, если текст не будет взят в кавычки?
Slastik:
А также и числовые переменные нужно брать в кавычки
не надо врать.
Там написано, что можно!
Не хочешь брать в кавычки - ради бога, приводи сам данные к нужному типу.
Впрочем, такая проверка совершенно не мешает все равно заключать все данные в кавычки. для надежности.
Slastik:
а про безопасность я там вообще ничего не увидел.
купи себе очки.
И прочти еще раз. Авось, увидишь.
Slastik:
хотелось бы уже как то определиться писать их или нет.
Тебе нужна помощь не специалиста по программированию, а окулиста.
потому, что в прочитанном тобой факе раза три ОДНОЗНАЧНО отвечено на этот вопрос.
Не говоря уже о том, что ты, сомневаясь, что кавычки нужны для чисел, задаешься вопросом, а стоит ли их использовать ВООБЩЕ, для любых типов. Долго думал над таким выводом?
И последнее.
$_GET[del] - так писать неправильно.
Надо писать
$_GET[\'del\']
Ключом массива у тебя является строка \'del\', а не константа del.
А строки в пхп ограничиваются кавычками.
-
1.
RomikChef:
Если ты считаешь, что ошибка запроса - это самый лучший способ проверить данные на корректность - флаг тебе в руки. И барабан на шею - вперед и с песней на грабли.
Подсказка. Запрос НЕ предназначен для того, чтобы проверять ошибки. Ошибки должен проверять программист.
Полностью с этим согласен, естественно я проверяю данные на коректность до того как использую их в запросе.
Но если все таки возможна ошибка, то отследить ее, при использовании кавычек будет сложней.
я не хотел доказывать что использовать их не стоит, а просто узнать в каких случаях их необходимо использовать, а в каких можно без них обойтись
RomikChef:
такая проверка совершенно не мешает все равно заключать все данные в кавычки. для надежности.
каким образом надежность увеличится? как мне кажется, что если нужно ожидать определенный тип то сводить другой к этому, некоректно.
RomikChef:
не надо врать.
Там написано, что можно!
Да ошибся
Написал исключительно по рассеяности, без какого либа акцента на слове нужно.
RomikChef:
купи себе очки.
В основном фак написан про слеши,
----
Тем более, что мы не можем быть уверены в том, что от пользователя пришла переменная именно того типа, который мы ожидаем. То есть, для надежности, любые данные, вставляемые в запрос, мы будем заключать в кавычки.
-----
вот и все что я нашел про кавычки, и безопасность.
Кстати написано будем, а не можем.
а дальше все про слеши.
Хотя боюсь что все таки что то я упустил :)
RomikChef:
Ключом массива у тебя является строка \'del\', а не константа del.
А строки в пхп ограничиваются кавычками.
про это я тоже знал, чесно :)
почему тогда написал?... узнал буквально вчера.
а переписать запрос, не успел.
и так и вставил.
и еще хотел сказать.
такого колоритного модератора как RomikChef, редко встретиш, иногда захожу на форум только ради того что бы почитать твои посты :)
-
Я рад, что ты не распускаешь нюни, как большинство здесь. Действительно рад. Похоже, в КПИ дураков не держат.
За это я попробую объяснить тебе по второму разу.
Slastik:
Но если все таки возможна ошибка, то отследить ее, при использовании кавычек будет сложней.
Повторяю. Отслеживать должен программист. ДО запроса.
И дело даже не в том, что запрос может пройти и без ошибок! Только вот делать он будет совсем не то, что хотел программист!
А в том, что это соверешнно дурацкая практика, отсуствтвие логики и головотяпство - ловить ошибку не там, где надо, а где светлее. ЗАПРОС НЕ ПРЕДНАЗНАЧЕН ДЛЯ ЛОВЛИ ОШИБОК В ДАННЫХ!
У тебя, чудик, выводится сообщение mysql об ошибке в запросе.
Это ты называешь отловом ошибок?
Вместо человеческого "Вы вели недопустимую переменную в поле нумбер" на человека вываливается u have error in query near
Офигенная обработка ошибок. Браво.
Slastik:
каким образом надежность увеличится?
Как можно быть таким непонятливым? Мне плевать на ошибки в логике твоей программы, которые ты не отловил "из-за кавычек".
Надо различать, вообще-то, опасности.
Если ты ошибся на машине и не туда свернул - это НИКОГО не волнует, кроме тебя. Это совершенно не фатальная ошибка, если ты не следуешь СВОЕМУ маршруту.
А вот если ты не соблюдаешь правила дорожного движения - ты потенциальныйц убийца и преступник. И поэтому соблюдения ПДД от тебя требуют. А соблюдения маршрута - нет. Потому, что не сравним уровень ВРЕДА!
Так и здесь. Плевать на твои собственные ошибки. Но БАЗУ ты должен защитить. Не хватает ума без нее проверку сделать - поищи себе другое занятие.
Надежность увеличится таким образом, что база будет защищена от взлома. Независимо от того - удосужился ты проверить данные на ввод, и является ли такая проверка нормальной. Если судить по твоим выводам в этом топике, то я сильно сомневаюсь, что ты можешь написать что-то хотя бы отдаленно напоминающее работающую программу проверки диапазона. Так что, кавычки для тебя - наилучшее решение.
Slastik:
Хотя боюсь что все таки что то я упустил
Бояться не надо.Надо просто внимательно прочесть.
Есть, правда, еще один варинат, но не уверен, что он тебе подойдет.
-
Боюсь, попасть под разнос :)
Но все же бог любит троицу.
RomikChef
Повторяю. Отслеживать должен программист. ДО запроса.......ЗАПРОС НЕ ПРЕДНАЗНАЧЕН ДЛЯ ЛОВЛИ ОШИБОК В ДАННЫХ!
Опять же я это отлично понимаю.
Постараюсь, обяснить что именно меня смущает.
Естественно я не буду использовать функцию, mysql_error
как обработчик, а написал я ее, потому что то что я пишу, пока еще на стадии разработки, и проходит отлаживание , а видеть ошибку mysql гораздо информативней чем безличное DataBase Error.
]RomikChef
Так и здесь. Плевать на твои собственные ошибки. Но БАЗУ ты должен защитить. Не хватает ума без нее проверку сделать - поищи себе другое занятие.
Опять же проверку я делаю, конечно далеко не идеальную, но что еще проверить с моим уровнем знаний
мне пока не известно
Я проверяю, на приналежность к ожидаемому типу, на допустимую длину, и екранирую спецсимволы
RomikChef
Надо различать, вообще-то, опасности.
Если ты ошибся на машине и не туда свернул - это НИКОГО не волнует, кроме тебя. Это совершенно не фатальная ошибка, если ты не следуешь СВОЕМУ маршруту
вот из за этого момента я и решился, еще раз написать.
Получаеться что если я например не корректно проверил данные и допустил запрос с некорректными данными, но при этом использовал кавычки, то я всего лиш изменил маршрут.
Но если же я не использовал кавычки то это сравни ДТП
хотя на том же http://phpfaq.ru/slashes
есть ссылка на сайт где показано, что если програмист допустил некорректные данные в запросе, тоесть не проверил их при получении от юзера, то никакие кавычки
уже не помогут, стоит только перебрать парочку вариантов, раставления кавычек и получиться ДТП.
Так нужны ли они тогда?
RomikChef
Есть, правда, еще один варинат, но не уверен, что он тебе подойдет.
Было бы все таки интересно выслушать.
Вот.. надеюсь, что ты развееш мои сомнения по поводу пункта с ДТП.
Буду очень рад тебя выслушать.
-
Slastik:
и екранирую спецсимволы
Расскажи-ка мне, как ты экранируешь спецсимвол "пробел".
После этого с удовольствием побеседую с тобой дальше.
Slastik:
Получаеться что если я например не корректно проверил данные и допустил запрос с некорректными данными, но при этом использовал кавычки, то я всего лиш изменил маршрут.
Это же надо до такой степени извратить мои слова.
Slastik:
есть ссылка на сайт где показано, что если програмист допустил некорректные данные в запросе, тоесть не проверил их при получении от юзера, то никакие кавычки
уже не помогут, стоит только перебрать парочку вариантов, раставления кавычек и получиться ДТП.
У тебя просто фантастическая способность понимаь тексты ровно в противоположном смысле.
Боюсь, я переоценил твои способности.
Течатный текст не оказывает на тебя должноговоздействия. Точнее, оказывает противоположное. То есть, ты понимаешь РОВНО наоборот.
Если бы ты не просто читал фак, а ПОНЯЛ что там написано (а специально для таких, как ты, там буквально неделю назад появились примеры, разжевывающие все до состояния мелкой кашицы), то ты бы все сам прекрасено понял - и как ломать и как защита работает. И текст по ссылке (которую, наконец, разглядел, слава богу) понял бы ПРАВИЛЬНО.
Но, похоже, тебе не дано.
Оставь меня.
Возьми примеры, которые, как ты утверждаешь, "если поставить кавычки, то все равно" и, НЕ ПОДКЛЮЧАЯ МОЗГИ, которые тебе только мешают, а просто РУКАМИ попробуй провернуть то, что написано в статье. с кавычками и без.
Может, хоть так дойдет?
-
у тебя с логикой большие проблемы.
Из того, что сайт ломается, если программист НЕ ДОБАВИЛ СЛЕШИ к данным, ты делаешь вывод о том, что КАВЫЧКИ НЕ НУЖНЫ.
Вывод на уровне "Зачем мне холодильник, если я не курю".
-
RomikChef
Расскажи-ка мне, как ты экранируешь спецсимвол "пробел"
Пробел не екранировал, имелл ввиду кавычки,
RomikChef
Из того, что сайт ломается, если программист НЕ ДОБАВИЛ СЛЕШИ к данным, ты делаешь вывод о том, что КАВЫЧКИ НЕ НУЖНЫ.
Да примерно такой вывод, я и сделал.
хотя судя по всему кавычки не защитят, но по крайней мере угадать комбинацию с кавычками сложнее чем без.
например я написал
mysql_query("DELETE from question where id=".$_GET[\'del\']."")
и задал переменную, $_GET[\'del\']="1 or 1=1"
получил удаление всех данных из таблицы.
если же использовать кавычки то переменная уже имеет
вид $_GET[\'del\']="1\' or \'1=1"
что уже немного сложнее, тоесть если использовать кавычки, взломщику, прийдеться попариться гораздо дольше так как он не будет знать структуры запроса.
Я правильно понял?
-
Скажи, для тебя комбинация доказательств недоступна?
Ты можешь воспринять ТОЛЬКО кавычки или ТОЛЬКО слеши?
Факт, что защиту обеспечивает КОМБИНАЦИЯ этих факторов в голове у тебя, похоже, просто не помещается.
Я, в общем, в тебе ошибся. С самооценкой у тебя все нормально, но вот с логикой - кранты.
Slastik:
Пробел не екранировал
Вот и обломись.
-
Могу все воспринимать :)
но про пробелы, я не думал.
Я использовал функцию addslashes(), а она екранирует только.
одинарная (\'), и двойная (") кавычки, обратный слэш/backslash (\\) и NUL (NULL-байт).
не совсем понимаю что имеется ввиду в мане под словами, Null байт.
Но думаю не пробел :)
Вообщем буду искать про пробелы. Спасибо что указал.
Если же я правильно понял, про кавычки, (то что я писал в последнем своем посте) то я узнал впринципе что хотел.
Спасибо за внимание.
-
ДУМАТЬ от тебя и не требовалось. Тебе нужно только соблюдать две примитивные рекомендации.
"Экранированием" пробелов занимаются КАВЫЧКИ!, Кавычки, расположенные по краям данных!
Они показывают, что пробелы в расположенных между ними словах - это не разделители ключевых слов в запросе, а всего лишь ЧАСТЬ ДАНЫХ
И если бы ты не пил так много, то увидел бы в факе пример, который это показывает:
pole=\'vasa puplin\' - это ДАННЫЕ
pole=vasa pupkin - здесь vasa - это данные, а pupkin уже воспринимается, как ЧАСТЬ ЗАПРОСА
Slastik:
я узнал впринципе что хотел.
я безмерно счастлив.
-
взломщику, прийдеться попариться гораздо дольше
Взломщик не взломает ничего ВООБЩЕ!
Если соблюдать ОБЕ рекомендации.
А не выбирать только ОДНУ и всем доказывать, что даже при строгом ее соблюдении, дыры останутся.
И на этом основании выбирать "менее дырявую".
Нет, это, все-таки, фантастический по своей тупости топик.
-
RomikChef:
Они показывают, что пробелы в расположенных между ними словах - это не разделители ключевых слов в запросе, а всего лишь ЧАСТЬ ДАНЫХ
дамс :) тут я точно тебя понял, неправильно.
под словом "екранирование" пробелов я понял немного не то.
RomikChef:
pole=\'vasa puplin\' - это ДАННЫЕ
pole=vasa pupkin - здесь vasa - это данные, а pupkin уже воспринимается, как ЧАСТЬ ЗАПРОСА
Само собой я это понимаю. Мне просто в голову не пришло что ты именно это имел ввиду.
В случае когда
я пишу pole=\'$vasa_puplin\' нет никаких пробелов,
(кроме естественно тех которые хранятся в переменной)
я могу и написать pole=$vasa_puplin
именно про случай с переменными я и говорил.
так как если написать
pole=vasa pupkin то ессесно получиться ошибка(и о варианте не использования кавычек не может быть и речи), а я спрашивал,
про вариант, когда mysql обрабатывает данные как с кавычками так и без.
RomikChef:
Взломщик не взломает ничего ВООБЩЕ!
Если соблюдать ОБЕ рекомендации.
Теперь когда понял что ты имел ввиду , под екранированием пробелов.
Абсолютно с этим согласен и впредь буду, их придерживаться.
RomikChef:
Нет, это, все-таки, фантастический по своей тупости топик.
:) да, есть немного
но зато хотя бы одному человеку он помог.
-
Slastik:
В случае когда
я пишу pole=\'$vasa_puplin\' нет никаких пробелов,
то есть, ты считаешь, что запрос прямо в таком виде и отправляется в базу?
Оказывается, все даже гораздо веселее, чем я думал.
-
Дамс... :)
Стыдно. Каюсь.
и тут ты прав!
надо больше думать прежде чем писать :)
-
Slastik:
mysql_query("DELETE from answer where vote_id=\'$_GET[del]\' and name=\'$_GET[name]\' ")
никогда так не пиши.
пиши
$query="";
mysql_query($query);
и имей привычку ПРИ ЛЮБЫХ проблемах выводить перед собой запрос.
чтобы видеть ЧТО ИМЕННО идет в базу.
а вместо
Slastik:
or die (mysql_error())
пиши свой обработчик, который при отладке выводит ошибку и запрос на экран, а при работе на сайте - в лог.
-
такого колоритного модератора как RomikChef, редко встретиш,
что бы я без вас делал...
-
RomikChef:
никогда так не пиши.
пиши
$query="";
mysql_query($query);
Обьясни пожалуйста почему.( Я не спорю, просто с моего необразованого взгляда, особой разницы не видно, а хочется знать не только следствие но и причину)
RomikChef:
и имей привычку ПРИ ЛЮБЫХ проблемах выводить перед собой запрос.
чтобы видеть ЧТО ИМЕННО идет в базу.
Так и делаю. :)
RomikChef:
пиши свой обработчик, который при отладке выводит ошибку и запрос на экран, а при работе на сайте - в лог.
При отладке использую ошибки пхп. тоесть не использую свой обработчик.
При работе на сайте. использую свой Ерор-Хендлер,
который пишет ошибки в логи.
RomikChef:
что бы я без вас делал...
Стараемся :)
-
Slastik:
Обьясни пожалуйста почему.( Я не спорю, просто с моего необразованого взгляда, особой разницы не видно, а хочется знать не только следствие но и причину)
огосподи.
чтобы выводить было удобно.
Slastik:
При отладке использую ошибки пхп.
пхп тебе не напишет.
ни запрос
ни где в нем ошибка
-
RomikChef:
чтобы выводить было удобно.
В таком случае, это уже дело вкуса, и привычки.
Хотя если запрос большой то твой вариант наверное удобнее.
я думал за этим кроется что то более опасное.
RomikChef:
пхп тебе не напишет.
ни запрос
ни где в нем ошибка
Согласен.
я использую обработчик но он записывает в логи только ошибки пхп. переделаю что бы также писал ошибки mysql.
В запросах же я всегда писал or die (\'DB error\')
RomikChef:
огосподи.
все свои посты пишу, потому что хочу научиться делать все как можно правильнее.
Никого доставать не хочу.
Хотя у модераторов должны быть железные нервы. :)
-
Slastik:
В таком случае, это уже дело вкуса, и привычки.
Это верно.
Если у тебя есть определенная переменная, то обработчик тебе ее куда захочешь выведет - хоть в файл, хоть в экран.
выставлением одного флага. Выведет АВТОМАТОМ, просто по факту самого наличия ошибки.
а когда оно от руки накарябано, то надо отдельно выцарапывать и выводить в каздом конкретном случае.
Что особенно прикольнро, когда с сайтом работаешь не ты, а клиент.
Программисты (если тебе известен смысл этого слова) предпочитают первый вариант.
Ну, а домохозяйки, от плиты севшие за комп - второй.
У каждого свои вкусы и привычки.
-
Написал обработчик как в статье Антона Довгаля, "Ловля Ошибок в PHP" на сайте phpclub.ru
Пишу лог с помощью функции error_log() где как ты написал
\'флаг\' выставляю \'3\'
Руками я пишу только формат файла с логами. Такой какой мне нравиться. и еще пару вещей для удобства.
Как можно еще больше автоматизировать, я не знаю.
RomikChef:
Программисты (если тебе известен смысл этого слова) предпочитают первый вариант.
Ну, а домохозяйки, от плиты севшие за комп - второй.
Хорогим програмистом я себя назвать аж никак не могу,
но и от домохозяйки, уже немного ушел.
-
Тяжело тебе, наверное.
Настолько не понимать, что тебе пишут.
Ступай с богом.
-
Не думаю что я уж настолько не понимаю.
просто ты немного пространственно выразился.
я так понял. Когда ты писал более конкретней я все понимал
Я ведь не телепат, а уровень развития всмысле программирования
у тебя безусловно выше, вот и понимаю я немного не в ту степь.
Но ты прав, пожалуй на сегодня хватит :)