Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Добавление текстовых данных в БД, $_POST[] -> DB 
V
    Опции темы
artsb
Дата 23.8.2009, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: нет
Всего: 64



Всем привет!

Объясните плиз. Насколько мне известно, текстовые данные приходят из формы в экранированном виде (со слешами). Так же мускул требует, чтобы текстовые данные перед добавлением были экранированы. Это так? Как правильно обработать данные пришедшие с формы и записать их в БД.
Я делаю так:
Код

$str = addslashes(htmlspecialchars(stripslashes($_POST['text'])));

И уже $str записываю в БД. Вроде всё работает... smile


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
unicross
Дата 23.8.2009, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 422
Регистрация: 15.6.2008

Репутация: 5
Всего: 53



mysql_real_escape_string()
А магические кавычки лучше отлючить вообще...
PM MAIL WWW   Вверх
bars80080
Дата 23.8.2009, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 9
Всего: 315



Цитата(artsb @  23.8.2009,  20:35 Найти цитируемый пост)
Насколько мне известно, текстовые данные приходят из формы в экранированном виде (со слешами)

только в случае, если стоят такие настройки сервера

проверяется просто:

Код

if(get_magic_quotes_gpc()) { echo 'экранируется'; }
else { echo 'нет'; }



Цитата(artsb @  23.8.2009,  20:35 Найти цитируемый пост)
Так же мускул требует, чтобы текстовые данные перед добавлением были экранированы. Это так? Как правильно обработать данные пришедшие с формы и записать их в БД.

самый простой способ придумали разработчики:

Код

$param = mysql_real_escape_string($param);





Цитата(artsb @  23.8.2009,  20:35 Найти цитируемый пост)
$str = addslashes(htmlspecialchars(stripslashes($_POST['text'])));

не правильный вариант. htmlspecialchars к БД отношения не имеет никакого, это функция используется для вывода хтмл-содержимого в браузер. 

если в настройках сервера включено автоматическое экранирование, то надо применять stripslashes, а затем mysql_real_escape_string
PM MAIL WWW   Вверх
Ипатьев
Дата 23.8.2009, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 3
Всего: 37



Добавлю, что неправильна сама постановка вопроса.
Во-первых, не текстовые должны быть заэкранированы, а любые.
Во-вторых, источник тоже не имеет значения - что POST, что GET, что файл, что руками в скрипте вбито - без разницы, правила одни и те же. 


PM MAIL   Вверх
artsb
Дата 24.8.2009, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: нет
Всего: 64



unicross, спасибо.

Цитата(bars80080 @  23.8.2009,  20:46 Найти цитируемый пост)
только в случае, если стоят такие настройки серверапроверяется просто:

Ясно.

Цитата(bars80080 @  23.8.2009,  20:46 Найти цитируемый пост)
самый простой способ придумали разработчики:

mysql_real_escape_string - это какая-то смесь addslashes и addcslashes...

Цитата(bars80080 @  23.8.2009,  20:46 Найти цитируемый пост)
htmlspecialchars к БД отношения не имеет никакого

Я знаю, что не имеет. Но мне потом эти данные нужно выводить на страницу. Я применяю эту функцию, чтобы никто не нагадил (JS). Разумнее же один раз применить её перед добавлением данных в БД, чем потом каждый раз при извлечении. ;)

Цитата(Ипатьев @  23.8.2009,  22:30 Найти цитируемый пост)
Во-первых, не текстовые должны быть заэкранированы, а любые.

А какой смысл экранировать INT, BOOL, FLOAT и т.д.?

Цитата(Ипатьев @  23.8.2009,  22:30 Найти цитируемый пост)
источник тоже не имеет значения - что POST, что GET, что файл, что руками в скрипте вбито

Это я тоже знаю. Просто количество символов в описании темы ограничено. И я выбрал $_POST smile


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
bars80080
Дата 24.8.2009, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 9
Всего: 315



Цитата(artsb @  24.8.2009,  08:52 Найти цитируемый пост)
mysql_real_escape_string - это какая-то смесь addslashes и addcslashes...

смесь не смесь - не важно. важно то, что она делает именно то что нужно и больше думать не надо


Цитата(artsb @  24.8.2009,  08:52 Найти цитируемый пост)
 знаю, что не имеет. Но мне потом эти данные нужно выводить на страницу

и какая связь между БД и тем что потом надо вывести? вот потом при выводе и применишь. 

Цитата(artsb @  24.8.2009,  08:52 Найти цитируемый пост)
Разумнее же один раз применить её перед добавлением данных в БД, чем потом каждый раз при извлечении. ;)

совершенно не разумно.
как ты будешь редактировать уже отформатированные данные?


Цитата(artsb @  24.8.2009,  08:52 Найти цитируемый пост)
А какой смысл экранировать INT, BOOL, FLOAT и т.д.?

не имеет, но только в том случае, если у тебя есть эта проверка на int, bool и прочее
PM MAIL WWW   Вверх
artsb
Дата 24.8.2009, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: нет
Всего: 64



Цитата(bars80080 @  24.8.2009,  09:28 Найти цитируемый пост)
и какая связь между БД и тем что потом надо вывести? вот потом при выводе и применишь.

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

Цитата(bars80080 @  24.8.2009,  09:28 Найти цитируемый пост)
как ты будешь редактировать уже отформатированные данные?

Зачем? Если на то пошло, то ничего сложного в редактировании <,   и т.д. нет.

Цитата(bars80080 @  24.8.2009,  09:28 Найти цитируемый пост)
но только в том случае, если у тебя есть эта проверка на int, bool и прочее

Зачем проверка? Если я знаю какие типы у полей таблицы, зачем мне все значения обрабатывать mysql_real_escape_string? Я буду обрабатывать только текстовые поля.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Ипатьев
Дата 24.8.2009, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 3
Всего: 37



хе-хе. то есть, не значения, идущие не в текстовые поля, обрабатывать никак не будете?

Это сообщение отредактировал(а) Ипатьев - 24.8.2009, 11:43
PM MAIL   Вверх
Photon
Дата 24.8.2009, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Злобный программер
**


Профиль
Группа: Участник
Сообщений: 282
Регистрация: 27.2.2009
Где: Таганрог

Репутация: 1
Всего: 12



artsb, вот смотри..  У тебя есть в базе поле типа INT, ты в него записываешь то, что у тебя пришло из формы:

mysql_query("insert into `table` (`TMP_ID`) VALUES({$_POST['tmp_id']})");

И тут выясняется, что в $_POST['tmp_id'] записано что-то вроде 1; use `mysql`; select * from `mysql`   или еще что-то подобное..

И как? Нормально?

А вот если бы было вот так:

Код

$tmp_id = intval($_POST['tmp_id']);
mysql_query("insert into `table` (`TMP_ID`) VALUES({$tmp_id})");


то никаких проблем бы не возникло..



--------------------
With best regards..
PM MAIL ICQ Skype GTalk Jabber   Вверх
IZ@TOP
Дата 24.8.2009, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 4
Всего: 73



Цитата(artsb @  24.8.2009,  11:18 Найти цитируемый пост)
Лучше один раз обработать данные и записать их, чем потом каждый раз при считывании их обрабатывать. Во втором случае больше времени и ресурсов тратится.

Вообще, этот вопрос спорный - форматировать и чистить данные для вывода на странице перед записью в бд или нет. Я предпочитаю записывать в неизменном виде и производить необходимые действия при выводе. При редактировании давая пользователю возможность исправить данные в том виде, в каком он их ввел.
И не стоит сильно заботиться о производительности - это сотые доли %.

Добавлено через 46 секунд
Photon, зачем тему палишь?  smile 


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
artsb
Дата 24.8.2009, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: нет
Всего: 64



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

IZ@TOP, спасибо. Прислушаюсь к вашему совету.

Добавлено через 4 минуты и 36 секунд
Photon, произошла бы ошибка:
Код

mysql_query("insert into `table` (`TMP_ID`) VALUES(1; use `mysql`; select * from `mysql`)");



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
IZ@TOP
Дата 24.8.2009, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 4
Всего: 73



artsb, в любом случае, надо учесть две вещи, о которых говорил Photon:
1. Всегда экранировать пользовательские данные.
2. Использовать для этого те методы, которые для этого предназначены.

Для текстовых данных используйте mysql_real_escape_string, для чисел int/float приведение к типу:

Код

$string = mysql_real_escape_string($string);
$int = (int) $int;
$float = (float) $float;

$result = mysql_query("INSERT INTO test (`string`, `int`, `float`) VALUES('{$string}', '{$int}', '{$float}')");

 


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Ипатьев
Дата 24.8.2009, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 3
Всего: 37



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

IZ@TOP, я настаиваю на неверности этой формулировки. Не пользовательские данные, а любые данные, помещаемые в запрос, как строки.
Правильной будет формулировка "любые данные, помещаемые в запрос, как строки, обрабатываются функцией искейпинга и обрамляются кавычками". А то вон в соседней теме товарищ искейпинг сделал, а кавычки забыл. и толку с той "правильной" обработки - как с козла молока
PM MAIL   Вверх
artsb
Дата 24.8.2009, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: нет
Всего: 64



Цитата(Ипатьев @  24.8.2009,  19:22 Найти цитируемый пост)
Правильной будет формулировка "любые данные, помещаемые в запрос, как строки, обрабатываются функцией искейпинга и обрамляются кавычками"

Полностью согласен. Я так изначально и думал.

Ещё раз всем спасибо ;)


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
IZ@TOP
Дата 25.8.2009, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 4
Всего: 73



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


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0584 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.