Почему Apache будет URL, декодирующим мою строку запроса? - PullRequest
3 голосов
/ 14 января 2009

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

У меня есть два (среди прочих) домена на Dreamhost:

1) thefigtrees.net 2) shouldivoteformccain.com

Сегодня я заметил, что когда я размещаю CGI-скрипт на # 1, к тому времени Сценарий CGI выполняется, строка запроса HTTP GET передается ему как QUERY_STRING Переменная окружения уже была декодирована URL. Это проблема, потому что это означает, что стандартная библиотека CGI (например, CGI.pm в Perl) попытается разделить на амперсанды, а затем декодировать саму строку. Есть два потенциальные проблемы с этим:

1) строка дважды декодируется, поэтому, если значение передается в сценарий например, «% 2525», он будет обрабатываться как просто «%» (декодируется дважды) а не "% 25" (декодируется один раз)

2) (чаще) если в представленном значении есть амперсанд, то он будет (должным образом) отправлен как% 26, но будет окружение QUERY_STRING. переменная воля если он уже декодирован в «&», и библиотека CGI будет неправильно разделить строку запроса в этом амперсанде. Это большая проблема!

Сценарий на http://thefigtrees.net/test.cgi демонстрирует это. Это перекликается с переменные окружения это называется с. Навигация в браузере:

http://thefigtrees.net/lee/test.cgi?x=y%26z

Вы видите, что REQUEST_URI правильно содержит x = y% 26z (без кодирования), но это QUERY_STRING уже декодировал его в x = y & z. Если я повторю тест на домене № 2 ( http://www.shouldivoteformccain.com/test.cgi?x=y%26z) Я вижу, что QUERY_STRING остается не закодированным, поэтому CGI.pm затем разделяется и декодируется правильно.

Я попытался отключить мои файлы .htaccess на обоих, чтобы убедиться, что это не проблема, и не видел никакой разницы.

Может ли кто-нибудь предположить возможные причины этого, поскольку мой веб-хостинг, похоже, не желает мне помочь?

спасибо, Lee

Ответы [ 2 ]

1 голос
/ 26 января 2010

У меня такое же поведение в Apache.

Я полагаю, что mod_rewrite автоматически декодирует URL, если он установлен, однако я видел поведение авто-декодирования даже без него. Я не выследил другого преступника.

Обычный обходной путь - это двойное кодирование входного параметра (при этом преимущество заключается в том, что декодирование URL безопасно при вызове по некодированному URL).

0 голосов
/ 15 января 2009

Любопытный. Ничто из того, что я вижу, не даст нам понять, почему это произойдет ... Я могу только подтвердить, что это ошибка среды, и подозревать, что, возможно, различия в конфигурации, например, правила перезаписи.

В соответствии с CGI 1.1, это декодирование должно происходить только для ИМЯ СКРИПТА и ИНФОРМАЦИИ ПУТИ, а не QUERY-STRING. Это бессмысленно и раздражает, что это вообще происходит, но это спецификация. Использование REQUEST-URI вместо тех переменных, где они доступны (т. Е. Apache), является обычным обходным решением для мест, где вы хотите поместить символы за пределами границ и Unicode в части пути, поэтому может быть разумно сделать то же самое для строк запроса пока какое-либо разрешение не будет доступно с хоста.

VPS сегодня дешевы ...

...