Ввод кавычек (и других опасных символов) в БД @ DeForum.ru
DeДверь  
Логин:  
Пароль:  
  Автологин  
   
Разместить рекламу
Письмо админу
Правила | FAQ | *Поиск | Наша команда | Регистрация | Вход
 
 
 Страница 1 из 1 [ Сообщений: 33 ] 
*   Список форумов / Начинка и техника / Программирование для WWW » ответить » создать топик « | »
Автор Сообщение
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Заголовок сообщения: Ввод кавычек (и других опасных символов) в БД
Сообщение Добавлено: 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'")

Но достаточно ли этого, что бы обезопасить себя от злобных юзеров :)
Чебурген
соучастник
3
Сообщения: 315
Зарегистрирован: 29.08.04
Сообщение Добавлено: 17 Октябрь 2004, 23:09:28 
Нет, недостаточно.
И это совершенно очевидно - в данных пользователя может встретиться и одинарная кавычка.
Однако, странно было бы думать, что база вообще не может хранить такие символы, как кавычки.
И изначальная идеся про htmlspecialchars в корне неверна.
Если бы база требовала каких-то изменений в данных, то это была бы бы на база ,а фуфло.
База - это сейф. Что положил, то и достал.
Ну представь себе - принес ты в швейцарский банк драгоценности. а клерк тебе и говорит - брильянты мы не храним, их слишком часто грабят. Замените их на изумруды и приходите снова.
пойдет кто-нибудь в такой банк? Нет. И базой никто такой пользоваться не будет.
Вот.
мда, что-то я увлекся. Ах, да! подробный ответ на все твои вопросы есть здесь:
PHP FAQ: \"Кавычки \". Надоедливые наклонные, слеши, экранирование кавычек.
<sergio.ga>
новый человек
0
Сообщения: 102
Зарегистрирован: 13.06.03
Откуда: Харьков, Украина
Сообщение Добавлено: 18 Октябрь 2004, 13:06:46 
mysql_query("SELECT * FROM users WHERE user_name='".mysql_escape_string($user_name)."'");
Вообще полученные от пользователя данные при использовании в запросах нужно заключать в кавычки и эскейпить всегда.
Иначе вы оставляете дырку для SQL-инъекций, через которую очень часто можно так или иначе сломать ваше приложение.
Чебурген
соучастник
3
Сообщения: 315
Зарегистрирован: 29.08.04
Сообщение Добавлено: 18 Октябрь 2004, 13:16:47 

Цитата:
и эскейпить всегда.


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

Цитата:
mysql_escape_string


Рекомендую почитать документацию на эту функцию.
Прежде, чем советовать её другим.
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 18 Октябрь 2004, 13:37:33 
AlexShop, сам пользуюсь и вам советую placeholder от Дмитрия Котерова - http://forum.dklab.ru/php/advises/Facil … query.html

_________________
:: metal kick ass ::
Чебурген
соучастник
3
Сообщения: 315
Зарегистрирован: 29.08.04
Сообщение Добавлено: 18 Октябрь 2004, 14:00:12 
AlexShop, а все остальные пользуются гораздо более мощным и универсальным механизмом placeholder-ров из стандартного пакета PEAR DB.
Это если им плейсхолдеры вообще нужны. Поскольку сами они никакого отношения к кавычкам не имеют.
Вот, приведенный по ссылке скрипт, например, требует, чтобы передаваемые в запрос данные были очищены от слешей, то есть, выполнялось замечание из текста, ссылку на который я дал. Но требует молча!Об этом ничего не написано!
И на большинстве хостингов ты получишь в запросе \\\' вместо \'

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


Последний раз редактировалось Чебурген 18 Октябрь 2004, 15:12:24, всего редактировалось 1 раз.
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 18 Октябрь 2004, 14:28:48 
Чебурген, зачем тогда в коде заблудился $args[$i] = "'".mysql_escape_string($v)." ?

_________________
:: metal kick ass ::
Чебурген
соучастник
3
Сообщения: 315
Зарегистрирован: 29.08.04
Сообщение Добавлено: 18 Октябрь 2004, 14:35:22 
MpaK999, ну читайте же внимательнее!
О нем речь и идет.
Именно за этим и заблудился.
Чтобы после magic_quotes_gpc (которые включены у всех провайдеров) выдть нам тот самый \\\' о котором я и написал.
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 18 Октябрь 2004, 15:02:38 
Чебурген, а :laugh:

_________________
:: metal kick ass ::
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 18 Октябрь 2004, 18:34:53 

Чебурген писал(а):

Цитата:
mysql_escape_string


Рекомендую почитать документацию на эту функцию.
Прежде, чем советовать её другим.



Мсье не желает рассказать, какие именно проблемы порождает использование mysql_escape_string?
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 18 Октябрь 2004, 18:36:54 

Чебурген писал(а):
И на большинстве хостингов ты получишь в запросе \\\' вместо \'



Поэтому любой здоровый программист, если не может выключить эту опцию, первым делом расквочивает все параметры. Это, кстати, типичный тест на собеседовании на наличие реального опыта работы с PHP.
Ainur Муж.
соучастник
16
Сообщения: 731
Зарегистрирован: 15.09.04
Откуда: Italia
Сообщение Добавлено: 18 Октябрь 2004, 18:41:16 
http://it.php.net/manual/en/function.addslashes.php
Чебурген
соучастник
3
Сообщения: 315
Зарегистрирован: 29.08.04
Сообщение Добавлено: 18 Октябрь 2004, 19:14:21 

Цитата:
Мсье не желает рассказать, какие именно проблемы порождает использование


Пазвольте!
Мсье ничего не писал о проблемах.
А лишь отсылал вдумчивого читателя к страницам документации, на коих начертано:
This function has been deprecated since PHP 4.3.0. Do not use this function. Use mysql_real_escape_string() instead.
Я думаю, с вопросом о проблемах можно обратиться к разработчикам API

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


Удивительное дело! Я то же самое прочел по ссылке, которую давал выше!
Я, собственно, и не спорю. А лишь обращаю вниание "нездоровых" программистов.

А тест...
Думаю, что я пройду любой. Но это никак не гарантирует того, что работник я хороший :-)
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 18 Октябрь 2004, 19:21:56 

Чебурген писал(а):
Я думаю, с вопросом о проблемах можно обратиться к разработчикам API



Я вижу, задавать тебе вопросы относительно твоих реплик бессмысленно. Ok.
Чебурген
соучастник
3
Сообщения: 315
Зарегистрирован: 29.08.04
Сообщение Добавлено: 18 Октябрь 2004, 19:57:22 
По поводу МОИХ реплик - осмысленно.
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 18 Октябрь 2004, 22:22:43 
Так вас двое... Понятно.

_________________
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.
Чебурген
соучастник
3
Сообщения: 315
Зарегистрирован: 29.08.04
Сообщение Добавлено: 18 Октябрь 2004, 23:18:58 
Нас один.
И мы не любим, когда наши слова перевирают.
<sergio.ga>
новый человек
0
Сообщения: 102
Зарегистрирован: 13.06.03
Откуда: Харьков, Украина
Сообщение Добавлено: 19 Октябрь 2004, 13:15:20 

Чебурген писал(а):

Цитата:
и эскейпить всегда.


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



Замечательная статья писал(а):
Два основных правила составления запросов в mysql:
- все вставляемые в запрос данные должны быть заключены в кавычки (одинарные или двойные, но удобнее и чаще используются одинарные).
- во всех переменных должны быть экранированы слешами спецсимволы.


no comments
Чебурген
соучастник
3
Сообщения: 315
Зарегистрирован: 29.08.04
Сообщение Добавлено: 19 Октябрь 2004, 13:47:39 

<sergio.ga> писал(а):
полученные от пользователя данные при использовании в запросах нужно заключать в кавычки и эскейпить всегда.



Замечательная статья писал(а):
Просто применить 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> описана не цель, а действия. НЕПРАВИЛЬНЫЕ действия.
И я, кажется, уже разжевал эту неправильность до состояния мелкой кашицы. поэтому желательно не копировать куски цитат, а попробовать подумать головой. Это, иногда, помогает.
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 19 Октябрь 2004, 13:54:08 
Чебурген, обычно в самом начале либо убираешь gpc если не получается (set_magic... и get_magick...), то когда сам достаешь параметры из GET и POST делаешь stripslashes. Это не сложно пользоваться один раз написанным кодом...

_________________
:: metal kick ass ::
des
соучастник
0
Сообщения: 407
Зарегистрирован: 14.04.03
Откуда: 40км от Москвы
Сообщение Добавлено: 19 Октябрь 2004, 13:59:42 
как насчет htmlentities?

_________________
всё таково, каково оно есть, и больше никаково
Чебурген
соучастник
3
Сообщения: 315
Зарегистрирован: 29.08.04
Сообщение Добавлено: 19 Октябрь 2004, 14:04:36 
Хоть в самом начале
хоть в самом конце
Хот тушкой, хоть чучелком
Если ты это делаешь, то об этом надо НАПИСАТЬ.
И если у кого-то хватает ума написать, что прослешивать надо ВСЕГДА, то должно хватить и на то, чтобы написать, что удалять в этом случае тоже надо ВСЕГДА.
О чём и написано в статье по ссылке, которую я привел выше.
И о чем не написал НИ О ДИН из остальных участников данной дискуссии.
При том, что я уверен на сто процентов в том, что клиент, которому, теоретически, здесь хотят помочь многочисленные доброхоты, обычно ничего ниоткуда не убирает.
Я говорю только об этом. Не написал? Значит, дал ОШИБОЧНУЮ информацию.

Я, вообще-то, считал, что этот топик служит для того, чтобы помочь начинающему, сообщив ему максимально точную и безошибочную информацию.
И ВСЯ, исчерпывающая информация приведена про ссылке, которую я привел выше.
Остальные же ограничивались НЕПОЛНОЙ и заведомо ОШИБОЧНОЙ.
И, с упортством, достойным лучшего применения, продолжают оправдываться.

Надо учиться признавать свои ошибки, молодые люди.
Я гарантирую, что в противном случае ваши писания будут гораздо большим ударом по столь лелеемому вами самолюбию.
Чебурген
соучастник
3
Сообщения: 315
Зарегистрирован: 29.08.04
Сообщение Добавлено: 19 Октябрь 2004, 14:07:59 
des, насчет htmlentities я поясню.
2 момента.
1. эта функция, до своего совершенно бесполезного патча в какой-то из 4.3 версий, абсолютно не предназначена для русскоязычных текстов. В плане замены кавычек ее функции великолепно исполняет функция htmlspecialchars, которую и надо использовать. ТАМ, ГДЕ НУЖНА ЗАМЕНА.
2. при работе с базой данных ЗАМЕНА НЕ НУЖНА.
Рекомендую тебе прочесть самый первый ответ в этой теме.
Long Муж.
SubAdmin
Теоретик
17
Сообщения: 4362
Зарегистрирован: 25.04.01
Откуда: Москва
Сообщение Добавлено: 19 Октябрь 2004, 14:47:44 
Чебурген, эмоции уйми..

_________________
Мудрость не всегда приходит с возрастом. Бывает, что возраст приходит один.
Ainur Муж.
соучастник
16
Сообщения: 731
Зарегистрирован: 15.09.04
Откуда: Italia
Сообщение Добавлено: 19 Октябрь 2004, 16:11:14 
Чебурген успокойся! смотря что нужно в бд писать и от куда оно идет
если из get, post запросов, то addslashes необходим просто, это самый простой способ.
еще можно regular expression написать и им убирать все кавычьки, мыслеммые и не мыслеммые...
я считаю что эта тема себя исчерпала.
Чебурген
соучастник
3
Сообщения: 315
Зарегистрирован: 29.08.04
Сообщение Добавлено: 19 Октябрь 2004, 17:03:43 
NOT NULL, эта тема себя не исчерпала.
Если, к примеру, такой персонаж, как ты, до сих пор не понял ее смысла. Ни капли.
Я с удовольствием поясню. В третий раз за этот топик, но каждому, похоже, надо объяснять персонально.

Тема себя не исчерпала именно потому, что, к моему огромному изумлению, остались еще люди, вроде тебя, которые, оказывается, НЕ ПОНИМАЮТ ВАЩЕ, что они делают.
Механически добавляют слеши, "смотря что нужно в бд писать и от куда оно идет". Это чудовищное заблуждение! Данные, вставляемые в запрос, должны быть прослешены не "смотря какие", а ВСЕ, абсолютно. И не "смотря откуда", а из любого источника!
Без этого работать не будет запрос.
Механизм работы слешей с кавычками буквально НА ПАЛЬЦАХ, на примерах расписан по ссылке, что я привел выше.

Далее:

Цитата:
если из get, post запросов, то addslashes необходим просто,


В этом коротком предложении содержится аж ДВЕ ошибки.
Первая: Если НЕ "из get, post запросов", то слеши должны быть всё равно! Данные должны быть прослешены в ЛЮБОМ СЛУЧАЕ!.
И об этом написано по ссылке, которую я привел выше, если кто удосужился прочитать, прежде, чем влезать в топик со своими комментариями.
Вторая ошибка: если "из get, post запросов" то addslashes не необходим. Он СКОРЕЕ ВСЕГО НЕ НУЖЕН. Потому, что пхп, настроенный по умолчанию, УЖЕ добавил слеши.
И поэтому мы получим искаженные данные - в запросе \\\", а в базе - \"
Как этого избежать, как добавить слеши гарантированно, но не переборщить, написано по ссылке, которую я привел выше.
я бы на твоем месте пошел бы, прояёл, всё бы для себя уяснил, и больше не позорился.

Вы все путаете необходимость НАЛИЧИЯ слешей с необходимостью РУЧНОГО ДОБАВЛЕНИЯ
Если первое мной никак не оспаривается, то вот вы как раз путаете второе с первым.
Твоя addslashes - это как раз ручное добавление.

Я тебе приведу простой и доступный для тебя пример.
Допустим, ты должен пойти к другу на день рождения.
Лучший друг. Если не придешь - обидится.
Должен? Несомненно.
Но, допустим, ты УЖЕ У НЕГО В ГОСТЯХ!
В этом случае ты должен нестись сломя голову к нему в гости?
или можно все-таки, расслабиться и повеселиться?
Я надеюсь, ты не упиваешься до такого состояния, чтобы посреди праздника вскакивать и бежать на него же?
А почему в своих программах ты так поступаешь?
arlekino Муж.
соучастник
5
Сообщения: 481
Зарегистрирован: 05.07.01
Откуда: Москва
Сообщение Добавлено: 19 Октябрь 2004, 17:43:56 

Цитата:
Данные, вставляемые в запрос, должны быть прослешены не "смотря какие", а ВСЕ, абсолютно


Слешуй всегда, слешуй везде и в жизни ждет тебя успех! :lol:
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 19 Октябрь 2004, 18:30:19 
Чебурген, ИзображениеИзображениеИзображение

_________________
:: metal kick ass ::
Ainur Муж.
соучастник
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 ;)
Ainur Муж.
соучастник
16
Сообщения: 731
Зарегистрирован: 15.09.04
Откуда: Italia
Сообщение Добавлено: 20 Октябрь 2004, 18:53:52 
>>>http://phpfaq.ru/slashes
Это значит, что автоматическое добавление слешей вам не нужно. Если PHP добавил, то нужно избавиться.

ti sam to 4ital rto???
Dymai prejde 4em govorit'
Чебурген
соучастник
3
Сообщения: 315
Зарегистрирован: 29.08.04
Сообщение Добавлено: 20 Октябрь 2004, 19:13:41 
Кое-кому следует понять, что я с ним не спорю.
А делюсь знаниями.
Если нет желания их получать - медицина здесь бессильна.
Настаивать я не буду.
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Сообщение Добавлено: 31 Октябрь 2004, 12:17:34 
А я тут в книжке прочел, что не только кавычки надо слешить но и:
_ (символ подчеркивания) и % (процент)

Т.к. это спецсимволы БД
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 31 Октябрь 2004, 12:45:48 
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.
*   Список форумов / Начинка и техника / Программирование для WWW « | » » ответить » создать топик
 Страница 1 из 1 [ Сообщений: 33 ] 
Показать сообщения за:   Поле сортировки  
Найти:
Перейти:  
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
cron


ООО ДеФорум
При использовании материалов сайта ссылка на DeForum.ru — обязательна.
Проект Павла Батурина ©2001-2077; // Powered by phpBB © 2013 phpBB Group
Rambler's Top100