Чем чревато использование не alnum символов в query части URL

Scud

Новичок
Чем чревато использование не alnum символов в query части URL

Люди укажите грабли: чем чревато использование символов отличных от _A-Za-z в query части URL?
В RFC2396 (Uniform Resource Identifiers (URI): Generic Syntax) написано что
query = *uric
uric = reserved | unreserved | escaped
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
unreserved = alphanum | mark
mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
escaped = "%" hex hex
т.е. в query может быть все что угодно......
Первое что я нашел если передавать что-нибудь типа ?foo.bar=test, то PHP в $_REQUEST(соответственно и в $_GET, $_POST, $_COOKIE) поместит элемент с ключем "foo_bar", а не "foo.bar", а вот если вместо точек поставить запятые то все OK.
 

lucas

Guest
нашел если передавать что-нибудь типа ?foo.bar=test, то PHP в $_REQUEST(соответственно и в $_GET, $_POST, $_COOKIE) поместит элемент с ключем "foo_bar", а не "foo.bar",
Наверно, дело в следующем (цитирую мануал):
Имена переменных соответствуют тем же правилам, что и остальные наименования в PHP. Правильное имя переменной должно начинаться с буквы или символа подчеркивания с последующими в любом количестве буквами, цифрами или символами подчеркивания Это можно отобразить регулярным выражением: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
(Если кто-то спросит, при чем тут имя переменной, так как речь идет об индексе массива, то это скорее всего сделано для обратной совместимости с register_globals on.)
 

Scud

Новичок
Тогда не понятно почему проходят запятые.
Следующий запрос /index.php?foo,bar=test приведет к
$_REQUEST["foo,bar"] == "test"
 

SiMM

Новичок
Scud, в индексе массива может быть, судя по всему, всё, что угодно.
PHP:
<? $a['']='asd'; echo $a[''] ?>
 

Yaguan

пилот
SiMM
ключ массива - обычный string, поэтому там действительно может быть все, что угодно.

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

Scud

Новичок
Просто нет ни какой уверенности что в следующей версии PHP не станет также на подчеркивания заменять и запятые, а мне это важно для проектирования приложения :(.
 

Yaguan

пилот
Я бы просто отказался от использования не a-z0-9 знаков в именах параметров. :)
 
Сверху