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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Авторизация, вопрос относительно безопасности 
:(
    Опции темы
bars80080
Дата 17.9.2009, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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



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

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



Цитата(Gold Dragon @  17.9.2009,  21:00 Найти цитируемый пост)
кстати, вот это вообще считаю безобразием, использовать глобальную переменную

почему? ведь изначально для порядка рекомендуется не создавать лишних переменных, легче с ними потом обращаться
PM MAIL WWW   Вверх
Ипатьев
Дата 17.9.2009, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Gold Dragon @  17.9.2009,  21:00 Найти цитируемый пост)
если у меня, например, есть такое

если есть, то не нужно.
А если речь идет не о целочисленном значении, а строковом, вы как поступаете?

Добавлено через 30 секунд
bars80080, согласитесь, это совершенно не принципиальный вопрос.
PM MAIL   Вверх
Gold Dragon
Дата 17.9.2009, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Цитата(bars80080 @  17.9.2009,  22:01 Найти цитируемый пост)
ведь изначально для порядка рекомендуется не создавать лишних переменных, легче с ними потом обращаться 
ну  как-то имея глобальную переменную типа $_POST лучше её оставлять в первозданном виде.. А создавая локальную переменную в функции или классе.. так она после обработке исчезнит

Цитата(Ипатьев @  17.9.2009,  22:07 Найти цитируемый пост)
А если речь идет не о целочисленном значении, а строковом, вы как поступаете?
так я уже писал есть класс, в котором есть следующие функции
- телефон
- mail
- сайт
- только цифры
- только буквы
- буквы, цифры, знаки типа точки

а вот если предусмотрены кавычки, то я их заменяю альтернативой

Добавлено через 35 секунд
просто после обработки у меня по определению в запросе не будет "неожиданностей" smile


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Ипатьев
Дата 17.9.2009, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

Но другим его советовать я бы воздержался. 

Это сообщение отредактировал(а) Ипатьев - 17.9.2009, 21:32
PM MAIL   Вверх
bars80080
Дата 17.9.2009, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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



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

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



Цитата(Ипатьев @  17.9.2009,  21:07 Найти цитируемый пост)
огласитесь, это совершенно не принципиальный вопрос. 

есть такое

Цитата(Gold Dragon @  17.9.2009,  21:16 Найти цитируемый пост)
как-то имея глобальную переменную типа $_POST лучше её оставлять в первозданном виде

и такое есть

Цитата(Gold Dragon @  17.9.2009,  21:16 Найти цитируемый пост)
А создавая локальную переменную в функции или классе.. так она после обработке исчезнит. так я уже писал есть класс, в котором есть следующие функции

ну, это самый оптимальный, ИМХО, метод

Цитата(Gold Dragon @  17.9.2009,  21:16 Найти цитируемый пост)
просто после обработки у меня по определению в запросе не будет "неожиданностей"

у меня в обработке есть формат all, в нём с данными ничего не делается. данные только переприсваиваются массиву заявленных входящих переменных, а если таковой нет, то устанавливается значение по умолчанию. так что, неожиданности возможны
с другой стороны, когда я составляю запрос к БД, то делаю это примерно так:

Код

        $fields = array(
            array('date', TIME, 0),
            array('creator', $_SESSION['USER_ID'], 0),
            array('summa', $HTML->in['sum'], 0),
            array('name', $HTML->in['name'], 1),
            array('surname', $HTML->in['surname'], 1),
            array('email', $HTML->in['email'], 1),
        );
        $r = $DB->writeRow('insert', $DB->T['T_DOCS'], $fields, '', LOG);
где класс БД сам всё обработает, и тут уж точно у меня и голова не болит, и все обработки будут применены именно там, где им следует быть
PM MAIL WWW   Вверх
Gold Dragon
Дата 17.9.2009, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



странное суждение... мне кажется что наоборот в больших проектах "экранирование", фильтрацию", "приведение в соответствие" вообще нужно именно выделять в отдельный класс и расширять функционал... В настоящее время я даже сделал класс который просто обрабатывает все "приходящие переменные", т.е. получает к примеру $_POST, а возвращает массив ключ->значение


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Ипатьев
Дата 17.9.2009, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

PM MAIL   Вверх
Sentox
Дата 17.9.2009, 23:32 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


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

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



Цитата(Ипатьев @ 17.9.2009,  21:55)
ну вот опять мы снова вернулись к тому, с чего начали. 
никто не говорит, что фильтрация не нужна, или что для ее применения нельзя сделать класс.

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

 smile  Ох и консерватор
Предлагаю написать разрабам PHP убрать в нём ООП - такой себе огромный костыль, который в принципе никому не нужен так как есть стандартные механизмы работы с данными.
Впринципе это уже холивар на тему стоит ли применять абстракцию и ни к чему не приведёт.

bars80080

Код

 $fields = array(
            array('date', TIME, 0),
            array('creator', $_SESSION['USER_ID'], 0),
            array('summa', $HTML->in['sum'], 0),
            array('name', $HTML->in['name'], 1),
            array('surname', $HTML->in['surname'], 1),
            array('email', $HTML->in['email'], 1),
        );
        $r = $DB->writeRow('insert', $DB->T['T_DOCS'], $fields, '', LOG);

Цитата

где класс БД сам всё обработает, и тут уж точно у меня и голова не болит, и все обработки будут применены именно там, где им следует быть


Что и требовалось доказать  smile 
PM MAIL   Вверх
solenko
Дата 18.9.2009, 00:20 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 34
Всего: 67



Цитата(Gold Dragon @  17.9.2009,  20:35 Найти цитируемый пост)
странное суждение... мне кажется что наоборот в больших проектах "экранирование", фильтрацию", "приведение в соответствие" вообще нужно именно выделять в отдельный класс и расширять функционал... В настоящее время я даже сделал класс который просто обрабатывает все "приходящие переменные", т.е. получает к примеру $_POST, а возвращает массив ключ->значение 

А это не зависит от размеров проекта. Просто нужно разделять три операции:
1. Валидация данных. Валидация - проверка дынных на смысловое содержания. Уже из определения оно не может быть централизовано, т.к. система в целом не должна даже представлять какого вида данные ожидает отдельная ее часть. При этом данные никоим образом не должны измениться -- если какие-то данные не подходят по смысловой нагрузке, то они должны быть отправлены на повторный ввод пользователю.
2. Подготовка данных к сохранению. Включает только преобразование данных в безопасный для сохранения вид. При этом данные никоим образом не должны измениться.
3. Подготовка данных к отображению. Опять же, данные ни коим образом не должны измениться. В большинстве случаев, пользователь должен лицезреть именно то, что он ввел в систему. Если это было нечто вроде 
Цитата

<sciript>alert(\'test\');</script>'; DROP TABLE users; 

то в таком виде он и должен их просмотреть. Наглядный пример в этом же сообщении строкой выше )
Исключение составляют только задачи, в которых нужно интерпретировать некоторые теги. Например, пользователю разрешено использовать html теги a, strong, em. И вот только теперь, в этом частном случае,  можно говорить о фильтрации. Тут нам нужно отобразить интерпретировать нектороые теги как теги, а некоторые, как текст, т.е. применить фильтр

Цитата(Sentox @  17.9.2009,  22:32 Найти цитируемый пост)
Ох и консерватор
Предлагаю написать разрабам PHP убрать в нём ООП - такой себе огромный костыль, который в принципе никому не нужен так как есть стандартные механизмы работы с данными.

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



--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Simpliest
Дата 18.9.2009, 02:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я вот одного не пойму, почему бы не отказаться от экранирования и не работать с prepared statement?

Добавлено через 6 минут и 4 секунды
Цитата(Gold Dragon @  17.9.2009,  21:00 Найти цитируемый пост)

Цитата(Ипатьев @  17.9.2009,  17:34 Найти цитируемый пост)
Лично я подготовку данных для SQL запроса не называю словом "фильтрация". 

Вот о чём и спор.. Ипатьев, понимаете,


Понимаете ли, подготовка данных для SQL это действительно не фильтрация. Причем даже в буквальном прочтении слова "фильтровать" оно не подходит.


--------------------
user posted image
PM   Вверх
solenko
Дата 18.9.2009, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 34
Всего: 67



Цитата(Simpliest @  18.9.2009,  01:07 Найти цитируемый пост)
Я вот одного не пойму, почему бы не отказаться от экранирования и не работать с prepared statement?

1. От необходимости экранирования избавляют не prepared statement, а использование placeholders
2. Когда вы вызываете, например, PDO::prepare() это не имеет никакого отношения к prepared statement
3. А какая разница? Таким образом вы просто перекладываете эту работу на одну из стандартных библиотек, но экранирование все равно происходит ). Тут же речь не о том, как именно это делать, а о том что это делать нужно в принципе и где своевремменно это делать

Это сообщение отредактировал(а) solenko - 18.9.2009, 08:08


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Ипатьев
Дата 18.9.2009, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Simpliest @  18.9.2009,  02:07 Найти цитируемый пост)
Я вот одного не пойму, почему бы не отказаться от экранирования и не работать с prepared statement?

Лично я - только "за". В смысле посоветовать другим. Лично мне способ не нравится за "ненаглядность".
Но в этом удивительном топике речь идет совсем о другом. 

solenko, я думаю, вы говорите об одном и том же, просто разными словами.
Плюс, насколько я понимаю, в нативных библиотеках никакого экранирования в полном смысле того слова не происходит. Данные просто отправляются отдельными пакетами, раздельно с запросом. Но это не принципиально. Это один из способов безопасной работы с SQL.

Этих способов, включая изобретения из этого топика я насчитал уже 4:
    1. строки прослешиваются и заключаются в кавычки, числа приводятся к нужному типу.
    2. prepared statements, они же подготовленные выражения, они же placeholders, они же употребленное мной выше слово "подстановки": запрос отдельно - данные отдельно.
    3. редко используемая hex-string
    4. способ Gold Dragon: физическое удаление спецсимволов из строки.

Самым безопасным следует признать способ номер 2. Хотя не без оговорок. Ибо ничто не помешает программисту собирать запрос с плейсхолдерами точно так же динамически. 
Самым неудачным - то, что придумал Gold Dragon. База данных задумана так, чтобы хранить все символы. Любые. А сознательно ограничивая функциональность БД, мы заранее раскладываем себе грабли, на которые впоследствии обязательно наступим. 

Это сообщение отредактировал(а) Ипатьев - 18.9.2009, 09:35
PM MAIL   Вверх
Simpliest
Дата 18.9.2009, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(solenko @  18.9.2009,  08:06 Найти цитируемый пост)
 Когда вы вызываете, например, PDO::prepare() это не имеет никакого отношения к prepared statement

С PDO как раз не работал. Но Ипатьев прав, я говорил о pg_prepare()
ibase_prepare()


--------------------
user posted image
PM   Вверх
Gold Dragon
Дата 18.9.2009, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Ипатьев, ну ты прям меня на пьедестал определил smile философ...

А может вернёмся к "Авторизации"... Я вообще-то и не утверждаю что база не должна хранить всё что хочется... Вот только ЗАЧЕМ? smile Я утверждаю что ВСЕ данные должны приводится в соответствие с задачей... Лично моё мнение, что в имени пользователя (логине) не должно быть кавычек и других спецсимволов, поэтому мне не нужно это экранировать, и я их просто убираю, ну или предлагаю пользователю самому их убрать. Пароль - думаю букв и цифр больше чем достаточно для составления пароля. Да и я не трогаю первоначальные данные вообще и оставляю их такими какими они пришли, для этого и существуют локальные переменные.

Ну уэ если на то пошло, то куда приятнее читать код когда используются функции класса (главное красиво и понятно назвать)


Да и что вы прицепились к слову ФИЛЬТРАЦИЯ? smile я уже давно поправился и сказал что имел в виду и даже пару раз уже озвучил конкретно smile


Кстати, и в проектах использую класс для работы с базой. Раньше тоже думал что зачем это нужно.. но все меняется, появляются новые требования и возможности.. По этому легче залезть в класс и подправить чем лопатить весь код.. Да и необходимые логи так проще вести, всё в одном месте



Это сообщение отредактировал(а) Gold Dragon - 18.9.2009, 12:36


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Ипатьев
Дата 18.9.2009, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Gold Dragon, вот в этом посте solenko очень подробно все расписал.
У него обработке данных посвящено три пункта. А ваше 
Цитата(Gold Dragon @  18.9.2009,  12:33 Найти цитируемый пост)
ВСЕ данные должны приводится в соответствие с задачей...

- это только первый из них.
И с ним никто не спорит.
Просто есть еще два.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




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


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

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