Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Очистка и проверка cgi-параметров, статья 
:(
    Опции темы
Vaneska
Дата 30.1.2008, 09:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот накатал статейку. Оцените. Может подойдет для размещения в статьях..

Автоматизация очистки и проверки cgi-параметров

Одна из трудоемких задач в web-программировании для начинающих - очистка и проверка cgi-параметров.
Когда программа получает большое количество параметров программисты частенько забывают правильно обработать некоторые параметры. Из-за этого резко падает надежность программы.
Чтобы решить эту проблему, сначала разберемся, каким образом происходит процесс получения параметров и работа с ними.
1. Программист получает параметр с помощью, например, модуля CGI.pm
2. Этот полученный параметр можно проверить каким-либо регулярным выражением.
Пример:
Код

use CGI 'param';

my $some_number = param('some_number');

unless ($some_number =~ /^\d+\.?\d*$/) {
    print "ERROR!!!";
} else {
    print "OK";
}


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

use CGI 'param';

sub clear_param
{
    my ($param, $type) = @_;

    if ($type eq 'string') {
        return $param if $param =~ /^[\w\s\t(){}_-]+$/;
    } elsif ($type eq 'number') {        
        return $param if $param =~ /^\d+\.?\d*$/;
    } elsif ($type eq 'date') {
        return $param if $param =~ /^\d{2}\.\d{2}\.\d{4}$/;
    } elsif ($type eq 'dirty') {
        return $param;
    } 
    return undef;
}

my $some_number1 = clear_param(param('some_number1'), 'number');
my $some_number2 = clear_param(param('some_number2'), 'number');

unless (defined($some_number)) {
    print "ERROR 1!!!";
} else {
    print $some_number1;
}

unless (defined($some_number2)) {
    print "ERROR 2!!!";
} else {
    print $some_number2;
}



Таким способом мы полностью избавились от повторения одних и тех же проверок для разных параметров одного типа, упростили и улучшили читаемость программы.
Но еще осталось выражение, которое можно автоматизировать.
Код

clear_param(param('some_number1'), 'number');

Здесь мы передаем параметр нашей функции очистки. А что если мы заключим в одну функцию и получение параметра и очистку?
Тогда для удобства можно написать модуль-интерфейс, который будет предоставлять 2 функции: получение очищенного и проверенного параметра и функцию только очистки параметра.
Код

package MyOrg::CGI;

use CGI;

require Exporter;
our @ISA = ("Exporter");
our @EXPORT = qw(
    param
    clear_param
);

sub clear_param
{
    my ($param, $type) = @_;

    if ($type eq 'string') {
        return $param if $param =~ /^[\w\s\t(){}_-]+$/;
    } elsif ($type eq 'number') {        
        return $param if $param =~ /^\d+\.?\d*$/;
    } elsif ($type eq 'date') {
        return $param if $param =~ /^\d{2}\.\d{2}\.\d{4}$/;
    } elsif ($type eq 'dirty') {
        return $param;
    } 
    return undef;
}

sub param
{
    my ($param_name, $type) = @_;
    return clear_param(CGI::param($param_name), $type);
}


Использовать этот модуль можно следующим образом:
Код

use MyOrg::CGI;

my $some_number1 = param('some_number1', 'number');
my $some_number2 = param('some_number2', 'number');

unless (defined($some_number)) {
    print "ERROR 1!!!";
} else {
    print $some_number1;
}

unless (defined($some_number2)) {
    print "ERROR 2!!!";
} else {
    print $some_number2;
}


Получившийся модуль можно приспособить не только для работы с модулем CGI, но и с другими, более легкими модулями.

В итоге у нас получилось решить задачу очистки и проверки параметров таким образом, что программист просто не сможет забыть очистить параметр, так как он автоматически очищается при получении.
--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
Bulat
Дата 30.1.2008, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


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

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



Цитата(Vaneska @  30.1.2008,  09:16 Найти цитируемый пост)
Все параметры, по сути, можно отнести к определенному типу. Например, строка, дата, число, файл. На каждый тип можно написать свою проверку, которая будет точно проверять, подходит данный параметр под этот тип или нет. Напишем функцию, которая будет проверять параметр на принадлежность к каким-нибудь типам, и применим ее.


Боюсь такая стандартизация не очень хорошо скажется на гибкости smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Vaneska
Дата 30.1.2008, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Почему?

В этот механизм можно добавить возможность определять дополнительные типы.
И будет все гибче некуда.  smile

--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
Bulat
Дата 30.1.2008, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


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

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



Цитата(Vaneska @  30.1.2008,  13:46 Найти цитируемый пост)
В этот механизм можно добавить возможность определять дополнительные типы.

Встречный вопрос, что мне даст определение таких типов??? Сколько я не писал интерфейсы, проблемы с надежностью у меня не было. Более того, если у меня нет необходимости проверять все приходящие параметры, и все зависит от того, пришел ли какой-то ключевой параметр, с ключевым значением. В конце концов, меня больше интересуют значения по данным параметрам, а не они сами smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Vaneska
Дата 30.1.2008, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Bulat @  30.1.2008,  13:56 Найти цитируемый пост)
Встречный вопрос, что мне даст определение таких типов???

1. Удобство работы со стандартными данными. Один раз описываешь проверку и пользуешься. Без такой штуки приходится один и тот же код писать по многу раз.
2. Улучшается читаемость кода.
3. Увеличивается скорость написания программ



Цитата(Bulat @  30.1.2008,  13:56 Найти цитируемый пост)
Более того, если у меня нет необходимости проверять все приходящие параметры, и все зависит от того, пришел ли какой-то ключевой параметр, с ключевым значением. 

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



--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
Bulat
Дата 31.1.2008, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


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

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



Vaneska, простой пример. Нередко в названии параметра присутствуют символы, которые также являются частью входных данных. Я делаю так, чтобы не перенасыщять количество передаваемых параметров, т.е. структурирую сами названия параметров. И в момент анализа входных параметров, также получаю определенную информацию из самого названия. А раз мне все равно приходится парсить само название параметра, то зачем мне еще и делать проверку на тип, причем как получается на свой тип, который мне еще придется дописать сюда ручками smile. Получается двойная работа. 

Цитата(Vaneska @  30.1.2008,  17:48 Найти цитируемый пост)
Удобство работы со стандартными данными.

В том-то и дело, что со стандартными данными, лично мне и так просто работается, да и наверно не только мне. В том числе и код не сложный и хорошо читается. Кроме того, в перле все же отсутствуют стандартные данные, в таком виде. Разделение на string, int и т.п. это особенность ряда других языков smile

Цитата(Vaneska @  30.1.2008,  17:48 Найти цитируемый пост)
3. Увеличивается скорость написания программ

А на это в большей степени вляет как ты его продумал в голове ;)

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


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Vaneska
Дата 31.1.2008, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Bulat @  31.1.2008,  14:59 Найти цитируемый пост)
И в момент анализа входных параметров, также получаю определенную информацию из самого названия.

Такого мне в голову не приходило.. Наверно не было соответствующих задач..

Цитата(Bulat @  31.1.2008,  14:59 Найти цитируемый пост)
но по-моему ты лишь пытаешься изобрести велосипед, что сделали уже до тебя.

Ну так это понятно, что велосипед. Здесь на форуме подобное вскользь упоминалось.. Я просто написал на эту тему статью. Никогда не писал, а тут как-то зацепило и написал  smile


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

Или тебя вообще не напрягает написание одного и того же по нескольку раз?
--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

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


 




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


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

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