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