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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с $_GET, $_POST, ... 
:(
    Опции темы
Elfet
Дата 9.2.2010, 14:36 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Всем привет! 

Написал небольшой код для работы с $_GET и $_POST для увеличения безопасности в моих скриптах. Что вы думаете по этому поводу? 

Код

class Conversion {
    private $input;
    public function  __construct(Request $_input) {
        $this->input = $_input;
    }
    public function is_set() {
        return $this->input->is_set();
    }
    public function Int($def = 0) {
        if($this->input->is_set())
            return intval($this->input->value());
        else
            return $def;
    }
    public function Text($def = '') {
        if($this->input->is_set())
            return htmlspecialchars($this->input->value());
        else
            return $def;
    }
}

class Request {
    private $array;
    private $key;    
    public function  __construct(& $_array, $_key) {
        $this->array = $_array;
        $this->key = $_key;
    }
    public function is_set() {
        return isset($this->array[$this->key]);
    }
    public function value() {
        return $this->array[$this->key];
    }
    public static function Get($key) {
        return new Request($_GET, $key);
    }
    public static function Post($key) {
        return new Request($_POST, $key);
    }
    public static function Request($key) {
        return new Request($_REQUEST, $key);
    }
    public static function Cookie($key) {
        return new Request($_COOKIE, $key);
    }
}

function Get($key) {
    return new Conversion(Request::Get($key));
}

function Post($key) {
    return new Conversion(Request::Post($key));
}

function Request($key) {
    return new Conversion(Request::Request($key));
}

function Cookie($key) {
    return new Conversion(Request::Cookie($key));
}


Теперь обращаться нужно так:

Код

Get('id')->Int();

Get('name')->Text();

Post('param')->Int(100); // если ничего не пришло, вернёт 100

Cookie('hash')->is_set();


По-моему очень удобно и красиво.  smile 


--------------------
PM MAIL WWW Skype   Вверх
Severyanin
Дата 9.2.2010, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 31.7.2007
Где: Россия, Омск

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



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


--------------------
"Звонким вереском скроются наши следы, и не вспомнят о них. Кто поверит нам, рыцарям павшей звезды из отвергнутых книг? Пусть в узоре времен ни стихов. ни имен, но напомнит забывшим их полуночный крик." Тэм Гринхилл
"Ужели суслик твоего коварства нагадит в плов доверья моего?". Л.Филатов 
PM MAIL WWW ICQ   Вверх
Elfet
Дата 9.2.2010, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Severyanin, ну да, можно сделать ещё какие-нибудь обработчики в  Conversion.


--------------------
PM MAIL WWW Skype   Вверх
Ипатьев
Дата 9.2.2010, 15:24 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



htmlspecialchars, как и "запрещенные символоы для избежания инъекций", никакого отношения к обработке $_GET и $_POST не имеют.

Все эти велосипеды на паровом ходу надо сначала обкатывать в реальной эксплуатации. На нескольких сайтах, несколько месяцев.
И только потом представлять широкой публике.
PM MAIL   Вверх
Elfet
Дата 9.2.2010, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Ипатьев, я ведь не предлагаю всем подряд использовать мой код. Я только просил высказать мнения по его поводу.  smile 


--------------------
PM MAIL WWW Skype   Вверх
Ипатьев
Дата 9.2.2010, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

Мнение, впрочем, я высказал тоже.


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


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Ипатьев, вы меня видимо не поняли. smile Естественно, можно и самому понять насколько хорош мой велосипед протестировав его пару месяцев, но мне не хочется этим заниматься, поэтому я ищу помощи у уже знающих людей которые могу меня предостеречь  от неправильного пути. 


--------------------
PM MAIL WWW Skype   Вверх
Ипатьев
Дата 9.2.2010, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Это невозможно. И не нужно. А "не хочу" - не аргумент.
Но как минимум убрать из метода text функцию htmlspecialchars

А заодно сформулировать критерии безопасности, для следования которым писалась эта функция.

Сам подход правильный.
Нужно только учитывать реальную жизнь. В которой иногда приходится пропускать HTML теги в скрипт как есть.

PM MAIL   Вверх
Elfet
Дата 9.2.2010, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Цитата(Ипатьев @  9.2.2010,  16:49 Найти цитируемый пост)
Сам подход правильный.

Мне тоже кажется что это правильно, явно указывать у всех получаемых параметров их тип.

Цитата(Ипатьев @  9.2.2010,  16:49 Найти цитируемый пост)
Нужно только учитывать реальную жизнь. В которой иногда приходится пропускать HTML теги в скрипт как есть.

Я бы для этого использовал обратную функцию или что-то такое: Get('page')->Html();




--------------------
PM MAIL WWW Skype   Вверх
NLspieler
Дата 9.2.2010, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А можно ли поинтересоватся, какая польза от этого скрипта? 
Он предоставляет другой синтаксис для обращения к глобальным массивам? 

Или смысл в том, что можно строго типизировать получаемые данные?

Это сообщение отредактировал(а) NLspieler - 9.2.2010, 17:49
PM MAIL   Вверх
Ипатьев
Дата 9.2.2010, 18:16 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Elfet @  9.2.2010,  15:59 Найти цитируемый пост)
Я бы для этого использовал обратную функцию или что-то такое: Get('page')->Html();

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

NLspieler, корни правильности данного подхода лежат в необходимости иницилизировать используемые переменные. что данный класс и делает.
PM MAIL   Вверх
Elfet
Дата 10.2.2010, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Цитата(NLspieler @  9.2.2010,  18:48 Найти цитируемый пост)
Или смысл в том, что можно строго типизировать получаемые данные?

Да в этом и смысл. 


--------------------
PM MAIL WWW Skype   Вверх
MoLeX
Дата 10.2.2010, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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





--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Elfet
Дата 10.2.2010, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



MoLeX, ну да. У них по своему сделано. 


--------------------
PM MAIL WWW Skype   Вверх
MoLeX
Дата 10.2.2010, 15:05 (ссылка)   | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



и сделано красиво


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
nerezus
Дата 10.2.2010, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



Цитата

Я только просил высказать мнения по его поводу.
 Бесполезное нагромождение ошибок с отвратительным интерфейсом.

Обосную, чтобы не обвинили в чем-то плохом.
> Бесполезное
Не относится к решаемой задаче

> нагромождение ошибок
Порча данных неуместным эскейпингом, не решает задачу


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Elfet
Дата 10.2.2010, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Цитата(nerezus @  10.2.2010,  23:39 Найти цитируемый пост)
Не относится к решаемой задаче

Почему? По-моему в сочетании плэйсхолдерами обеспечивает вполне безопасную работу скрипта? 

Цитата(nerezus @  10.2.2010,  23:39 Найти цитируемый пост)
Порча данных неуместным эскейпингом, не решает задачу 

Этот эскейпинг относится только к Text, в тексте не должно быть html-а. (Как уже сказали выше, я из тех, кто перестраховывается, я считаю что данные сначала нужно обезопасить)

Добавлено через 14 минут и 11 секунд
Цитата(nerezus @  10.2.2010,  23:39 Найти цитируемый пост)
с отвратительным интерфейсом.

Возможно дело вкуса. По мне так мой вариант самый лучший Get('value')->Int();

Это сообщение отредактировал(а) Elfet - 10.2.2010, 23:48


--------------------
PM MAIL WWW Skype   Вверх
nerezus
Дата 11.2.2010, 02:05 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


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

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



Цитата

По-моему в сочетании плэйсхолдерами обеспечивает вполне безопасную работу скрипта? 
 Потому что:
1) Не обеспечит полноту картины.
2) Портит данные
3) Ничем не лучше ручного варианта из-за пункта 1, он хуже по пункту 2.

Цитата

в тексте не должно быть html-а.

1) Тебе так кажется(крещенный)
2) Оно испортит(просьба называть вещи своими именами) не только html.


Цитата

По мне так мой вариант самый лучший Get('value')->Int();
 На каждую функцию пхп напишешь свой метод к Conversion-blob-антипаттерну?) Float(), Strip(), etc...


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
MoLeX
Дата 11.2.2010, 07:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



Цитата(MoLeX @  10.2.2010,  15:05 Найти цитируемый пост)
и сделано красиво 

относиться к 
Цитата(MoLeX @  10.2.2010,  07:02 Найти цитируемый пост)
http://code-igniter.ru/user_guide/libraries/input.html 

а не к коду автора топика.

большие плюсы у CI в том что данные можно получить как есть: 
Код

$this->input->post('some_data');


так и очищенные от всякого мусора
Код

$this->input->post('some_data', TRUE);





--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
sTa1kEr
Дата 11.2.2010, 12:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


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

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



Цитата(Elfet @ 9.2.2010,  15:36)
Код

Get('id')->Int();

Get('name')->Text();

Post('param')->Int(100); // если ничего не пришло, вернёт 100

Cookie('hash')->is_set();


По-моему очень удобно и красиво.  smile

Выглядит действительно красиво. Однако реализация... зачем при каждом запросе параметра создавать и уничтожать по 2 объекта? Какой смысл вообще создавать объект Request на каждый параметр? Кроме того, благодаря этому, что бы добавить фильтр, придется править скрипт в 3х местах.

В общем, это наглядный пример, как можно использовать объекты без применения ООП.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0684 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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