Forum Webscript.Ru
Программирование => Perl => Тема начата: Evgeny от 04 Июня 2002, 12:19:25
-
Привет все!
Я кодирую значение переменной и отправляю её как сookie.
Среди прочих символов встречается символ "\\n". Как быть?
Какие ещё символы могут навредить.
-
Вот, немного потестировал, получил ещё символы, которые нехороши:
Конечно же \'=\' и \';\' - это логично.
Потом 0x0D - можно понять
0x88 - это уже непонятно.
Есть ли ещё какие-нибудь?
Подскажите пожалуйста.
-
Не у кого так и нет никаких идей?
Я каждый символ его кодом заменил (числом) и \';\'-ой разбил, но это как-то коряво выглядит.
Что говорит стандандарт о вышеописанных символах?
-
Вроде бы \'=\' не вызывает проблем, а ";" видимо нужно заменять.
-
Вроде бы \'=\' не вызывает проблем
Почему же. Ведь если в значении переменной \'=\' стоит, то как определить, где имя переменной заканчивается, а где значение начинается?
Вот пример:
"var1=name1;var2=name2=name;"
По-моему \'=\' лучше тоже заменять...
-
Определить легко - для разделения разных cookie достаточно одного символа-разделителя -";". А для отделения имени от значения используется только первое "=".
Я проверял: второе "=" не вызывает проблем,
ты можешь убедиться сам.
-
Определить легко - для разделения разных cookie достаточно одного символа-разделителя -";". А для отделения имени от значения используется только первое "=".
Я проверял: второе "=" не вызывает проблем,
ты можешь убедиться сам.
Да, всё правильно, только это нужно учитывать если сам куки анализируешь, т.е. это не прокатит:
($name,$val)=split(/=/,"name=long=value");
-
Неужели?
А так:
$val=($ENV{\'HTTP_COOKIE\'}=~/$name=([^;]+)/)[0];
Ты же сам писал эту куку, значит имя знаешь, следовательно и значение вытащить сможешь. Для нескольких cookie-переменных можно и цикл организовать, например такой:
foreach (qw(name1 name2 name3))
{
${$_}=($ENV{\'HTTP_COOKIE\'}=~/$_=([^;]+)/)[0];
}
-
Неужели?
$ENV{\'HTTP_COOKIE\'}="name1=name2=1;name2=2";
-
Ну, вот это, вроде, всегда должно работать:
foreach (qw(name1 name2 name3))
{
${$_}=($ENV{\'HTTP_COOKIE\'}=~/(?}
-
Ну, вот это, вроде, всегда должно работать:
По-моему, самое правильное слово здесь - "вроде". :)
$ENV{\'HTTP_COOKIE\'}="name1=name2=1;name2=2";
foreach (qw(name1 name2 name3))
{ ${$_}=($ENV{\'HTTP_COOKIE\'}=~/(? print $_."=".${$_}."\\n";
}
Вывод (версия Perl 5.6.0):
name1=name2=1
name2=
name3=
Лично я решил отказаться от знака \'=\' в куках. :)
-
Лично я решил отказаться от знака \'=\' в куках.
Сдаешся? Это не спортивно! :)
Сейчас разберемся с этими куками;)
Все правильно. В твоем $ENV{\'HTTP_COOKIE\'} после точки с запятой нет пробела. Я точно не помню, может ли такое быть на самом деле. Т.е. что является разделителем - точка с запятой, точка с запятой + пробел или могут быть оба варианта?...
Вечером проверю и напишу работающий вариант.
-
Пожалуйста, можно и пробел после точки с запятой поставить (только как назло о ещё и в значении предыдущей переменной появляется :)):
$ENV{\'HTTP_COOKIE\'}="name1= name2=1; name2=2";
;)
-
Разделитель - точка с запятой + пробел.
На входе:
$ENV{\'HTTP_COOKIE\'}="name1= name2=1; name2=2; name3=name 3";
Код:
foreach (qw(name1 name2 name3))
{
${$_}=($ENV{\'HTTP_COOKIE\'}=~/(^|(?<=; ))$_=([^;]+)/)[1];
print $_.": ".${$_}."\\n";
}
На выходе:
name1: name2=1
name2: 2
name3: name 3
Так пойдет? ;)
Только использовать пробел в cookie мне даже в голову не приходило. И не уверен, можно ли (нужно ли) это это делать.
-
Пойдёт. :)
Ничего нового я не придумал. :)