Как предотвратить декодирование mod_rewrite строки в пути? [дубликат]

I ' m пытается создать спокойный API с помощью mod_rewrite.

У меня есть правило:

RewriteRule v2/(.*)$ v1/index.php?request=$1 [QSA,NC,L]

Однако путь может содержать строки в кодировке base64 (т.е. могут иметь + или /), и они декодируются до того, как попадут в PHP.

Например, если я перейду на

/v2/cards/9VwQLli%2Bf0ogFl19AVRFLuztbp8cP0rYCgXBu3H9%2BDc%3DBe

, PHP получит $ _ REQUEST ['запрос'] как карты / 9VwQLli f0ogFl19AVRFLuztbp8cP0rYCgXBu3H9 Dc = Be '.

И что еще хуже, если я добавлю косую черту (например, 9VwQLli% 2Bf0ogFl19AVRFLuztbp8c% 2FP0rYCgXBu3H9% 2BDc% 3DBe - % 2F будет 404.

Как я могу предотвратить это?

Примечание. Я пробовал использовать флаги B и NE , но они не дали никакого эффекта. Я полагаю, что в качестве взлома я мог бы просто преобразовать все символы + в _ и все / в - , или, возможно, даже двойное кодирование URL это, но мне было интересно, есть ли лучший способ.

1
задан 16 April 2015 в 10:01
1 ответ

Нельзя. Веб-сервер имеет право декодировать символы, закодированные в процентах, которые не декодируются в специальные символы перед применением правил перезаписи, а также имеет право декодировать оставшиеся символы, закодированные в процентах, перед передачей данных в ваше веб-приложение. (См. RFC 3986.)

Вам необходимо применить шаблон фронт-контроллера в вашем веб-приложении и самостоятельно обрабатывать все процентное декодирование (и маршрутизацию запросов). В этом случае вы просто перенаправите все запросы, которые не соответствуют файлу или каталогу, на /index.php, а затем прочитаете URL из $_SERVER['REQUEST_URI']. Вот как основные PHP-приложения, такие как WordPress и MediaWiki, справляются с этим.

.
7
ответ дан 3 December 2019 в 16:34

Теги

Похожие вопросы