Forum Webscript.Ru

Программирование => Perl => Тема начата: Evgeny от 04 Июня 2002, 12:19:25

Название: Символ "\\n" в значении cookie-переменной.
Отправлено: Evgeny от 04 Июня 2002, 12:19:25
Привет все!
Я кодирую значение переменной и отправляю её как сookie.
Среди прочих символов встречается символ "\\n". Как быть?
Какие ещё символы могут навредить.
Название: Символ "\\n" в значении cookie-переменной.
Отправлено: Evgeny от 04 Июня 2002, 13:44:00
Вот, немного потестировал, получил ещё символы, которые нехороши:
Конечно же \'=\' и \';\' - это логично.
Потом 0x0D - можно понять
0x88 - это уже непонятно.

Есть ли ещё какие-нибудь?
Подскажите пожалуйста.
Название: Символ "\\n" в значении cookie-переменной.
Отправлено: Evgeny от 11 Июня 2002, 18:42:27
Не у кого так и нет никаких идей?
Я каждый символ его кодом заменил (числом) и \';\'-ой разбил, но это как-то коряво выглядит.
Что говорит стандандарт о вышеописанных символах?
Название: Символ "\\n" в значении cookie-переменной.
Отправлено: YA от 26 Июня 2002, 00:20:46
Вроде бы \'=\' не вызывает проблем, а ";" видимо нужно заменять.
Название: Символ "\\n" в значении cookie-переменной.
Отправлено: Evgeny от 26 Июня 2002, 14:32:50
Цитировать
Вроде бы \'=\' не вызывает проблем

Почему же. Ведь если в значении переменной \'=\' стоит, то как определить, где имя переменной заканчивается, а где значение начинается?
Вот пример:
"var1=name1;var2=name2=name;"
По-моему \'=\' лучше тоже заменять...
Название: Символ "\\n" в значении cookie-переменной.
Отправлено: YA от 27 Июня 2002, 09:21:12
Определить легко - для разделения разных cookie достаточно одного символа-разделителя -";". А для отделения имени от значения используется только первое "=".

Я проверял: второе "=" не вызывает проблем,
ты можешь убедиться сам.
Название: Символ "\\n" в значении cookie-переменной.
Отправлено: Evgeny от 01 Июля 2002, 18:50:10
Цитировать
Определить легко - для разделения разных cookie достаточно одного символа-разделителя -";". А для отделения имени от значения используется только первое "=".

Я проверял: второе "=" не вызывает проблем,
ты можешь убедиться сам.

Да, всё правильно, только это нужно учитывать если сам куки анализируешь, т.е. это не прокатит:

($name,$val)=split(/=/,"name=long=value");
Название: Символ "\\n" в значении cookie-переменной.
Отправлено: YA от 01 Июля 2002, 21:31:44
Неужели?

А так:
$val=($ENV{\'HTTP_COOKIE\'}=~/$name=([^;]+)/)[0];
Ты же сам писал эту куку, значит имя знаешь, следовательно и значение вытащить сможешь. Для нескольких cookie-переменных можно и цикл организовать, например такой:

foreach (qw(name1 name2 name3))
{
${$_}=($ENV{\'HTTP_COOKIE\'}=~/$_=([^;]+)/)[0];
}
Название: Символ "\\n" в значении cookie-переменной.
Отправлено: Evgeny от 03 Июля 2002, 19:52:03
Цитировать
Неужели?


$ENV{\'HTTP_COOKIE\'}="name1=name2=1;name2=2";
Название: Символ "\\n" в значении cookie-переменной.
Отправлено: YA от 04 Июля 2002, 02:22:38
Ну, вот это, вроде, всегда должно работать:

foreach (qw(name1 name2 name3))
{
${$_}=($ENV{\'HTTP_COOKIE\'}=~/(?}
Название: Символ "\\n" в значении cookie-переменной.
Отправлено: Evgeny от 04 Июля 2002, 12:05:14
Цитировать
Ну, вот это, вроде, всегда должно работать:

По-моему, самое правильное слово здесь - "вроде". :)


$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=


Лично я решил отказаться от знака \'=\' в куках. :)
Название: Символ "\\n" в значении cookie-переменной.
Отправлено: YA от 04 Июля 2002, 17:55:25
Цитировать
Лично я решил отказаться от знака \'=\' в куках.

Сдаешся? Это не спортивно! :)
Сейчас разберемся с этими куками;)

Все правильно. В твоем $ENV{\'HTTP_COOKIE\'} после точки с запятой нет пробела. Я точно не помню, может ли такое быть на самом деле. Т.е. что является разделителем - точка с запятой, точка с запятой + пробел или могут быть оба варианта?...

Вечером проверю и напишу работающий вариант.
Название: Символ "\\n" в значении cookie-переменной.
Отправлено: Evgeny от 04 Июля 2002, 20:44:10
Пожалуйста, можно и пробел после точки с запятой поставить (только как назло о ещё и в значении предыдущей переменной появляется :)):

$ENV{\'HTTP_COOKIE\'}="name1= name2=1; name2=2";
;)
Название: Символ "\\n" в значении cookie-переменной.
Отправлено: YA от 04 Июля 2002, 21:43:01
Разделитель - точка с запятой + пробел.


На входе:
$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 мне даже в голову не приходило. И не уверен, можно ли (нужно ли) это это делать.
Название: Символ "\\n" в значении cookie-переменной.
Отправлено: Evgeny от 11 Июля 2002, 17:40:14
Пойдёт. :)
Ничего нового я не придумал. :)