Данные php $ _REQUEST декодируются только наполовину - PullRequest
2 голосов
/ 14 мая 2010

Я получаю закодированный URL через строку запроса. Мне нужно снова передать его на следующую страницу. Когда я получаю его в первый раз, используя $_REQUEST['url'], декодируются только косые черты, например:

http://example.com/search~S10?/Xllamas&searchscope=10&SORT=D/Xllamas&searchscope=10&SORT=D&SUBKEY=llamas/51%2C64%2C64%2CB/browse

Страница php docs для urldecode не советует декодировать данные запроса и говорит, что они уже будут декодированы. Мне нужно, чтобы он был полностью декодирован, чтобы я мог снова его кодировать без двойного кодирования некоторых частей, или вообще не декодировал.

Я не уверен, почему мой опыт использования этих данных несовместим с документами php. Цени любую помощь или указатели на то же самое !!

РЕДАКТИРОВАТЬ: попытка опубликовать соответствующий код, который разбросан по:

URL кодируется и добавляется в строку запроса (в html-файле с использованием шаблона smarty):
<a class="button" href="{$baseurl}search_nojs?searcharg={$searcharg|escape:'url'}&url={$next|escape:'url'}"><span>Next&gt;&gt;</span></a>

если эта ссылка была пройдена, я возвращаю URL-адрес из строки запроса (в файле php):

       if(array_key_exists('url', $_REQUEST)) {
            $sm->assign("searchurl", $_REQUEST['url']);
        }

Тогда я бы хотел вставить URL-адрес обратно в строку запроса для следующей ссылки (в другом HTML-файле):
href="{$baseurl}detail?bibid={$res.bibid}&searcharg={$searcharg}{if $searchurl}&searchurl={$searchurl}{/if}"

Я также печатаю {$searchurl} прямо на странице и получаю тот же полу-экранированный результат.

Вот еще один пример строки запроса и данных, которые я получаю $_REQUEST:

первоначально закодированный URL в строке запроса:
searcharg=mammals&url=http%3A%2F%2Fexample.com%2Fsearch%7ES10%3F%2FXmammals%26searchscope%3D10%26SORT%3DD%2FXmammals%26searchscope%3D10%26SORT%3DD%26SUBKEY%3Dmammals%2F51%252C1114%252C1114%252CB%2Fbrowse

данные получены из $_REQUEST:
searcharg=mammals&searchurl=http://example.com/search~S10?/Xmammals&searchscope=10&SORT=D/Xmammals&searchscope=10&SORT=D&SUBKEY=mammals/51%2C1114%2C1114%2CB/browse

Я знаю, что этот метод может показаться любопытным - я пытаюсь сделать мобильный дисплей, работая с базой данных черного ящика. Еще раз спасибо за любую помощь !!

Ответы [ 2 ]

1 голос
/ 15 мая 2010

Вот еще один пример строки запроса и данных, которые я получаю из $ _REQUEST:

изначально закодированный URL в строке запроса: searcharg = млекопитающих и URL = HTTP% 3A% 2F% 2Fexample.com% 2Fsearch% 7ES10% 3F% 2FXmammals% 26searchscope% 3D10% 26SORT% 3DD% 2FXmammals% 26searchscope% 3D10% 26SORT% 3DD% 26SUBKEY% 3Dmammals% 2F51% 252C1114% 252C1114% 252CB% 2Fbrowse

Это двойное кодирование. Например: %252C -> %2C -> , Поэтому, когда вы кодируете параметр url, вы вводите двойное кодирование. Возможно, вы должны убедиться, что перед кодированием параметров вы декодируете их до тех пор, пока они больше не будут декодированы (иначе как канонизация). Для этого вы можете использовать urldecode в цикле.

Вы также хотите убедиться, что при возврате параметра url обратно в контекст html (в виде ссылки) вы также экранируете атрибуты HTML. В противном случае у вас есть уязвимость XSS.

0 голосов
/ 14 мая 2010

Запятая (U + 002C) является зарезервированным символом в запросе и, следовательно, должна кодироваться с помощью %2C:

3.4.Компонент запроса

Компонент запроса - это строка информации, которая должна интерпретироваться ресурсом.

  query         = *uric

Внутри компонента запроса символы ";", "/", "?", ":", "@", "&", "=", "+", "," и "$" являютсязарезервировано.

...