Заголовок сообщения: Ввод кавычек (и других опасных символов) в БД Добавлено: 17 Октябрь 2004, 22:59:24
PHP+MySQL
Мне надо разрешить юзеру вводить кавычки (одинарные и двойные) в БД.
Если я использую htmlspecialchars - то длина строки существенно увеличится.
Потому что на одну кавычку - уйдет аж 6 символов.
А если юзер введет 10 кывычек?
Нехочется создавать поле (в БД) в 6 раз длинее.
Что делать?
Можно:
1. В PHP, при написании SQL запроcа все переменные окружить одинарной кавычкой.
Пример, где $user_name - в кавычках:
mysql_query("SELECT * FROM users WHERE user_name='$user_name'")
Но достаточно ли этого, что бы обезопасить себя от злобных юзеров
Нет, недостаточно.
И это совершенно очевидно - в данных пользователя может встретиться и одинарная кавычка.
Однако, странно было бы думать, что база вообще не может хранить такие символы, как кавычки.
И изначальная идеся про htmlspecialchars в корне неверна.
Если бы база требовала каких-то изменений в данных, то это была бы бы на база ,а фуфло.
База - это сейф. Что положил, то и достал.
Ну представь себе - принес ты в швейцарский банк драгоценности. а клерк тебе и говорит - брильянты мы не храним, их слишком часто грабят. Замените их на изумруды и приходите снова.
пойдет кто-нибудь в такой банк? Нет. И базой никто такой пользоваться не будет.
Вот.
мда, что-то я увлекся. Ах, да! подробный ответ на все твои вопросы есть здесь:
PHP FAQ: \"Кавычки \". Надоедливые наклонные, слеши, экранирование кавычек.
0 Сообщения: 102 Зарегистрирован: 13.06.03 Откуда: Харьков, Украина
Добавлено: 18 Октябрь 2004, 13:06:46
mysql_query("SELECT * FROM users WHERE user_name='".mysql_escape_string($user_name)."'");
Вообще полученные от пользователя данные при использовании в запросах нужно заключать в кавычки и эскейпить всегда.
Иначе вы оставляете дырку для SQL-инъекций, через которую очень часто можно так или иначе сломать ваше приложение.
AlexShop, а все остальные пользуются гораздо более мощным и универсальным механизмом placeholder-ров из стандартного пакета PEAR DB.
Это если им плейсхолдеры вообще нужны. Поскольку сами они никакого отношения к кавычкам не имеют.
Вот, приведенный по ссылке скрипт, например, требует, чтобы передаваемые в запрос данные были очищены от слешей, то есть, выполнялось замечание из текста, ссылку на который я дал. Но требует молча!Об этом ничего не написано!
И на большинстве хостингов ты получишь в запросе \\\' вместо \'
То есть, механизм плейсхолдеров, вообще-то, к кавычкам имеет весьма опосреованное отношение. Это, скорее, способ составить запрос, чем добавить кавычки.
А использует он, естественно, те же принципы, которые изложены по ссылке, которую я дал выше.
А принципы знать важнее, чем пользоваться готоввым кодом. Потому, что, как показывает практика, не все пользователи готового понимают, как и зачем оно работает.
Последний раз редактировалось Чебурген 18 Октябрь 2004, 15:12:24, всего редактировалось 1 раз.
MpaK999, ну читайте же внимательнее!
О нем речь и идет.
Именно за этим и заблудился.
Чтобы после magic_quotes_gpc (которые включены у всех провайдеров) выдть нам тот самый \\\' о котором я и написал.
И на большинстве хостингов ты получишь в запросе \\\' вместо \'
Поэтому любой здоровый программист, если не может выключить эту опцию, первым делом расквочивает все параметры. Это, кстати, типичный тест на собеседовании на наличие реального опыта работы с PHP.
Мсье не желает рассказать, какие именно проблемы порождает использование
Пазвольте! Мсье ничего не писал о проблемах. А лишь отсылал вдумчивого читателя к страницам документации, на коих начертано: This function has been deprecated since PHP 4.3.0. Do not use this function. Use mysql_real_escape_string() instead. Я думаю, с вопросом о проблемах можно обратиться к разработчикам API
Цитата:
Поэтому любой здоровый программист, если не может выключить эту опцию, первым делом расквочивает все параметры
Удивительное дело! Я то же самое прочел по ссылке, которую давал выше!
Я, собственно, и не спорю. А лишь обращаю вниание "нездоровых" программистов.
А тест...
Думаю, что я пройду любой. Но это никак не гарантирует того, что работник я хороший
_________________ We've got the big memory and the small memory. The small memory's to remember the small things and the big memory's to forget the big ones.
0 Сообщения: 102 Зарегистрирован: 13.06.03 Откуда: Харьков, Украина
Добавлено: 19 Октябрь 2004, 13:15:20
Чебурген писал(а):
Цитата:
и эскейпить всегда.
Это ошибочное утверждение. О чем ясно написано про ссылке, которую я привел. Рекомендую прочитать.
Замечательная статья писал(а):
Два основных правила составления запросов в mysql: - все вставляемые в запрос данные должны быть заключены в кавычки (одинарные или двойные, но удобнее и чаще используются одинарные). - во всех переменных должны быть экранированы слешами спецсимволы.
полученные от пользователя данные при использовании в запросах нужно заключать в кавычки и эскейпить всегда.
Замечательная статья писал(а):
Просто применить addslashes() будет неправильно. А вдруг PHP сам добавил уже?
<sergio.ga> писал(а):
mysql_query("SELECT * FROM users WHERE user_name='".mysql_escape_string($user_name)."'");
Замечательная статья писал(а):
Если добавляемые данные пришли от пользователя, то надо писать так: if (!get_magic_quotes_gpc()) $_POST['var']=addslashes($_POST['var']);
учимся читать.
Учимся отличать результат от действия.
В статье описан результат, конечная цель - слеши должны быть добавлены.
В сообщении <sergio.ga> описана не цель, а действия. НЕПРАВИЛЬНЫЕ действия.
И я, кажется, уже разжевал эту неправильность до состояния мелкой кашицы. поэтому желательно не копировать куски цитат, а попробовать подумать головой. Это, иногда, помогает.
Чебурген, обычно в самом начале либо убираешь gpc если не получается (set_magic... и get_magick...), то когда сам достаешь параметры из GET и POST делаешь stripslashes. Это не сложно пользоваться один раз написанным кодом...
Хоть в самом начале
хоть в самом конце
Хот тушкой, хоть чучелком
Если ты это делаешь, то об этом надо НАПИСАТЬ.
И если у кого-то хватает ума написать, что прослешивать надо ВСЕГДА, то должно хватить и на то, чтобы написать, что удалять в этом случае тоже надо ВСЕГДА.
О чём и написано в статье по ссылке, которую я привел выше.
И о чем не написал НИ О ДИН из остальных участников данной дискуссии.
При том, что я уверен на сто процентов в том, что клиент, которому, теоретически, здесь хотят помочь многочисленные доброхоты, обычно ничего ниоткуда не убирает.
Я говорю только об этом. Не написал? Значит, дал ОШИБОЧНУЮ информацию.
Я, вообще-то, считал, что этот топик служит для того, чтобы помочь начинающему, сообщив ему максимально точную и безошибочную информацию.
И ВСЯ, исчерпывающая информация приведена про ссылке, которую я привел выше.
Остальные же ограничивались НЕПОЛНОЙ и заведомо ОШИБОЧНОЙ.
И, с упортством, достойным лучшего применения, продолжают оправдываться.
Надо учиться признавать свои ошибки, молодые люди.
Я гарантирую, что в противном случае ваши писания будут гораздо большим ударом по столь лелеемому вами самолюбию.
des, насчет htmlentities я поясню.
2 момента.
1. эта функция, до своего совершенно бесполезного патча в какой-то из 4.3 версий, абсолютно не предназначена для русскоязычных текстов. В плане замены кавычек ее функции великолепно исполняет функция htmlspecialchars, которую и надо использовать. ТАМ, ГДЕ НУЖНА ЗАМЕНА.
2. при работе с базой данных ЗАМЕНА НЕ НУЖНА.
Рекомендую тебе прочесть самый первый ответ в этой теме.
16 Сообщения: 731 Зарегистрирован: 15.09.04 Откуда: Italia
Добавлено: 19 Октябрь 2004, 16:11:14
Чебурген успокойся! смотря что нужно в бд писать и от куда оно идет
если из get, post запросов, то addslashes необходим просто, это самый простой способ.
еще можно regular expression написать и им убирать все кавычьки, мыслеммые и не мыслеммые...
я считаю что эта тема себя исчерпала.
NOT NULL, эта тема себя не исчерпала.
Если, к примеру, такой персонаж, как ты, до сих пор не понял ее смысла. Ни капли.
Я с удовольствием поясню. В третий раз за этот топик, но каждому, похоже, надо объяснять персонально.
Тема себя не исчерпала именно потому, что, к моему огромному изумлению, остались еще люди, вроде тебя, которые, оказывается, НЕ ПОНИМАЮТ ВАЩЕ, что они делают.
Механически добавляют слеши, "смотря что нужно в бд писать и от куда оно идет". Это чудовищное заблуждение! Данные, вставляемые в запрос, должны быть прослешены не "смотря какие", а ВСЕ, абсолютно. И не "смотря откуда", а из любого источника!
Без этого работать не будет запрос.
Механизм работы слешей с кавычками буквально НА ПАЛЬЦАХ, на примерах расписан по ссылке, что я привел выше.
Далее:
Цитата:
если из get, post запросов, то addslashes необходим просто,
В этом коротком предложении содержится аж ДВЕ ошибки.
Первая: Если НЕ "из get, post запросов", то слеши должны быть всё равно! Данные должны быть прослешены в ЛЮБОМ СЛУЧАЕ!.
И об этом написано по ссылке, которую я привел выше, если кто удосужился прочитать, прежде, чем влезать в топик со своими комментариями.
Вторая ошибка: если "из get, post запросов" то addslashes не необходим. Он СКОРЕЕ ВСЕГО НЕ НУЖЕН. Потому, что пхп, настроенный по умолчанию, УЖЕ добавил слеши.
И поэтому мы получим искаженные данные - в запросе \\\", а в базе - \"
Как этого избежать, как добавить слеши гарантированно, но не переборщить, написано по ссылке, которую я привел выше.
я бы на твоем месте пошел бы, прояёл, всё бы для себя уяснил, и больше не позорился.
Вы все путаете необходимость НАЛИЧИЯ слешей с необходимостью РУЧНОГО ДОБАВЛЕНИЯ Если первое мной никак не оспаривается, то вот вы как раз путаете второе с первым.
Твоя addslashes - это как раз ручное добавление.
Я тебе приведу простой и доступный для тебя пример.
Допустим, ты должен пойти к другу на день рождения.
Лучший друг. Если не придешь - обидится.
Должен? Несомненно.
Но, допустим, ты УЖЕ У НЕГО В ГОСТЯХ!
В этом случае ты должен нестись сломя голову к нему в гости?
или можно все-таки, расслабиться и повеселиться?
Я надеюсь, ты не упиваешься до такого состояния, чтобы посреди праздника вскакивать и бежать на него же?
А почему в своих программах ты так поступаешь?
16 Сообщения: 731 Зарегистрирован: 15.09.04 Откуда: Italia
Добавлено: 20 Октябрь 2004, 18:50:42
Чебурген
1. я знаю как у меня пхп нвстроен
2. не хами
3. http://phpfaq.ru/slashes 4. ты не понимашь о чем ты говориш
Stavit' addsleshes vezde, mojet posovetovat' tolko lamer
AlexShop, прежде всего, надо понимать КОГДА и ЗАЧЕМ их нужно "слэшить". Если в книжке про это не сказано -- сдай ее в макулатуру.
_________________ We've got the big memory and the small memory. The small memory's to remember the small things and the big memory's to forget the big ones.
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.