Покинул форум
Сообщений всего: 140
Дата рег-ции: Сент. 2009
Помог: 0 раз(а)
Решила создать тему, где хотелось бы обсудить различные варианты обработки входящих данных с целью безопасности и избежания занесения в базу разного рода мусора.
Из всего этого следует несколько вопросов:
1. Какими методами вы пользуетесь для обработки форм?
2. Используете ли вы регулярные выражения для проверки правильности составления логина, или иной информации, визуальная корректность которой необходима для записи в базу данных?
3. Используете ли вы разного рода фильтры в ущерб целостности данных?
4. Чему вы отдаёте больший приоритет: краткости и безопасности, или юзабельности и расширяемости?
А вот, собственно, сомнительные моменты, которые очень часто встречаются в скриптах:
$login=stripslashes($login);// зачем это нужно, если, скажем, волшебные кавычки выключены? А иначе тот, кто захочет исковеркать свой ник, обязательно найдёт такой способ
$login=htmlspecialchars($login);// зачем преобразовывать, если всё тотчас улетит в базу? Кому ты сделаешь лучше?
$login=trim($login);// и после густой каши ещё и обрезам пробелы с обоих концов
Покинул форум
Сообщений всего: 2508
Дата рег-ции: Май 2009 Откуда: Днепропетровск, Украина
Помог: 75 раз(а)
Будет время, такого рода тему создам в базах данных, а то одно и тоже каждая 4 тема
JustUserR
Отправлено: 10 Января, 2010 - 19:49:46
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Ammy По мне самое главное это правильно заэкранировать кавычки и все данные в SQL запросах обрамлять в кавычки - тогда никаких проблем не может быть в принципе
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Champion
Отправлено: 10 Января, 2010 - 19:55:45
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
Ammy пишет:
3. Используете ли вы разного рода фильтры в ущерб целостности данных?
Что ты пол этим имеешь в виду? Я не очень представляю, как фильтры могут навредить целостности? Которые удаляют из строки потенциально нехорошие символы вместо того, чтоб их экранировать?
Ammy пишет:
4. Чему вы отдаёте больший приоритет: краткости и безопасности, или юзабельности и расширяемости?
А почему краткость и безопасность с другой стороны от юзабельности и расширяемости?
2 - да.
По коду: $login = stripslashes($login); - согласен с комментарием.
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
Ammy пишет:
$login = htmlspecialchars($login); // зачем преобразовывать, если всё тотчас улетит в базу? Кому ты сделаешь лучше?
Видимо, потом планируется многократно выводить это в браузер. Сделано из соображений, что лучше один раз обработать при вставке, чем постоянно при выводе.
Ammy пишет:
подключив в добавок функцию strip_tags
Вот это, может быть, и есть иногда фильтры, которые вредят целостности: убрав тэги мы может сделать данные неполными и недостоверными. особенно забавно применять эту функцию после htmlentities)) (Добавление)
Пример с хабрахабра не заметил сразу. А если я хочу логин o'connor? Логин перед вставкой в базу можно обработать htmlentities и mysql_real_escape_string.
Ammy
Отправлено: 10 Января, 2010 - 20:40:59
Частый гость
Покинул форум
Сообщений всего: 140
Дата рег-ции: Сент. 2009
Помог: 0 раз(а)
Цитата:
А почему краткость и безопасность с другой стороны от юзабельности и расширяемости?
Вкладывался следующий смысл:
1. Описывать какой-то отдельный момент кратко, безопасно, делая упор на производительность и безопасность, не торопиться переходить от одного к другому.
echoserialize($extract);// подготовка для занесения в базу
// написан мною в той же теме
Цитата:
Что ты пол этим имеешь в виду? Я не очень представляю, как фильтры могут навредить целостности? Которые удаляют из строки потенциально нехорошие символы вместо того, чтоб их экранировать?
Функции, типа strip_tags, или вовсе самодельные, где применяется целый комплекс проверок и вырезаний (а главное то на них всей душой и телом полагаются, как на потенциальных защитников данных, мол, прикручу очередной стрип тагс и я на небе), что ни к чему хорошему не приводит. Вот, допустим, функция, анализирующая входящие данные, которая не пропускает пробелов:
Под ущербом целостности подразумевается нарушение структуры чего-либо в результате проверки какой-нибудь очередной хлеборезкой. Или, например, когда ты прощаешь себе необходимый в передаваемом параметре символ, который вырезается твоим великим смертельным анти-хакиравским аружием.
Покинул форум
Сообщений всего: 588
Дата рег-ции: Окт. 2009 Откуда: Днепропетровск
Помог: 8 раз(а)
Ammy пишет:
делая упор на производительность
пусть у тебя сценарий работает 4-6с., а пользователь получает результат 5-20с в зависимости от загруженности линий нета у пользователя и тд. это можно пережить, а вот безопасность это другое дело
Champion
Отправлено: 10 Января, 2010 - 21:05:59
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
Ammy пишет:
Под ущербом целостности подразумевается нарушение структуры чего-либо в результате проверки какой-нибудь очередной хлеборезкой.
Это уже не фильтр. Это хлеборезка, действительно. Такое не надо использовать.
Ammy пишет:
preg_match('#[^a-zA-Z0-9_]#'
Проверять логин таким способом совсем не надо. Тем более, что [^a-zA-Z0-9_] - это \W. Вообще, такая хлеборезка еще и когда она без предупреждения выбрасывает какие-то данные - это нехорошо.
Ammy пишет:
1. Описывать какой-то отдельный момент кратко, безопасно, делая упор на производительность и безопасность, не торопиться переходить от одного к другому.
Ammy пишет:
2. Описывать момент быстро, и оставлять его в первоначальном виде, делая упор на реализацию дальнейших моментов.
Ну возвращаться к уже написанному и оптимизировать - это нормально. Но лучше сразу конечно по возможности, а то тут на потом оставил, тут решил потом подумать, а потом получаются разные забавные вещи...
В твоем примере просто второй вариант получился из-за незнания (ye или забывчивости) того, что в PHP есть готовые функции. Конечно, готовые функции быстрее работают, чем самописные.
Хотя, знаешь, конкретно тут мне второй вариант больше нравится. Тут за один проход всё делается, а там три шага: получаем ключи одного массива, берем из них те, которые есть в другом, превращаем ключи в значения...
Ammy
Отправлено: 10 Января, 2010 - 21:15:23
Частый гость
Покинул форум
Сообщений всего: 140
Дата рег-ции: Сент. 2009
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
Тут первый код - ужас просто. Е-мейл, кстати, лучше бы регуляркой проверить тут как раз. логин, пароль мы выше обсудили. Зачем unset - вообще непонятно.
По второму коду, пароль действительно не выводится, а вот логин может и выводится. Его можно в безопасном виде сразу в базу писать.
О stripslashes тоже в начале было.
Ammy
Отправлено: 10 Января, 2010 - 21:28:03
Частый гость
Покинул форум
Сообщений всего: 140
Дата рег-ции: Сент. 2009
но я пока учусь)) и хочется писать правильно так что если не сложно объясните
Мелкий
Отправлено: 10 Января, 2010 - 23:24:33
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
А зачем убирать экранирование?
----- PostgreSQL DBA
Champion
Отправлено: 11 Января, 2010 - 08:42:56
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
Короче:
- все строки, которые вставляются в БД:
* обрабатывать mysql_real_escape_string
* проверять длину
- строки, которые должны иметь определенный формат (e-mail, например) проверять регуляркой
- строки, которые предназначены для вывода в браузер, обрабатывать htmlentites:
* перед добавлением в базу, если потом прийдется их часто выводить
* при выводе (тоже бывает надо).
В любом случае есть html_entity_decode()
- числа проверять is_float, (float) ...
- данные, не удовлетворяющие регуляркам, проверкам типа is_float() по возможности не обрубать молча, а просить пользователя повторить ввод.
- скрипты, интенсивно работающие с базой не давать возможности запускать часто: писать в сессию время последнего обращения к скрипта и если скрипт повторно вызвался спустя секунду, например, то не начинать работу с БД, а ругнуться. По-моему, всё.
Это что касается безопасности работы с БД. (Добавление)
Мелкий пишет:
А зачем убирать экранирование?
Чтобы не экранировать заново, если включены волшебные кавычки. Надо только проверить сначала, включены ли они.
Их, кстати, иногда достоточно бывает, так что можно обойтись без некоторой обработки.DimKA, выше написано.
valenok
Отправлено: 11 Января, 2010 - 10:37:16
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006 Откуда: Israel
Помог: 3 раз(а)
Как поступаю с данными я.
Прием данных.
Никаких magic_quotes, автоматических добавлений всяких слэшей и прочей галиматьи.
Обработка данных
Числовые данные сначала преобразаую инвалом, потом проверяю на отличие от нуля.
Порой даже не проверяю на их присутсвие, если они там должны быть.
$id = @intval($_POST['id']); if(!$id) throw ..
имейлы проверяю регуляркой + на сопутсвующие mx записи во избежании ввода несуществующих адресов.
Иногда пользуюсь фильтрами валидации (validation filters)
Никогда и не при каких условиях не изменяю вводимые данные ( никаких стрип тагс, стриптиз, санитайз фильтров и любых других преобразований.
Ввод данных в БД
Любый строковые данные обязательно подвергаются обработке mysql_real_escape_string или чем-то подходящим для вашей конкретной БД.
Даже если мы 3 раза проверили имейл регулярками.
Всегда строки в запросах заключаются в кавычки.
Числа тоже, хоть mysql их и преобразовывает.
Все числа вводятся только после intvala (который я выполняю на этапе приема данных)
Вывод из БД
Любые данные из БД выводятся после обработки htmlspecialchars( , ENT_QUOTES);
----- Truly yours, Sasha.
EuGen
Отправлено: 11 Января, 2010 - 11:58:08
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Свои предпочтения я изложил здесь в уроках (про безопасность, и красивые стили). Может, и субьективно, но пока что действенно.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.