#php #browser #get #urldecode
Вопрос:
Я не могу сказать вам, сколько часов своей жизни я потратил впустую на такого рода идиотские ошибки.
Я в основном создаю URL-адрес, такой как: https://example.com/?test=' . urlencode('meow foo@gmail.com');
Затем я показываю его с URL-адреса, вот так: echo urldecode($_GET['test']);
И тогда это показывает: meow foo@gmail.com
.
Тьфу.
Если бы я вместо этого сделал это: echo $_GET['test'];
Я получаю: meow foo@gmail.com
.
(Естественно, повторять такую переменную GET-это безумие, поэтому я бы, конечно htmlspecialchars
, обошел ее в реальности. Но я здесь не об этом.)
Итак, поскольку браузеры (или что-то в этом роде) явно выполняют этот «перевод» или «декодирование» автоматически, повторное выполнение приводит к путанице, удаляя определенные символы, в данном случае » » (плюс). Что наводит меня на мысль, что я вообще не должен использовать urldecode
/ rawurldecode
.
Но тогда почему они существуют?
Комментарии:
1. Руководство PHP по
$_GET
утверждениям:The GET variables are passed through urldecode().
2. @PaulT. Так когда же кто-нибудь захочет их использовать?
3. Я не знаю , использовал ли я когда-либо
rawurldecode
, но использовалurldecode
сторонние API, в которых применялась кодировка.
Ответ №1:
Так когда же кто-нибудь захочет их использовать
Недавно у меня был случай, когда мы добавили триггеры в корзину S3, которые были подобраны лямбда-функцией и отправлены через HTTP-запрос в конечную точку API.
Если бы путь к файлу на S3 был многословным, он заменил бы пробел на a
, и в этот момент он нарушил бы наш код, потому что технически путь неверен.
Как только вы запустите его, urldecode
он станет допустимым путем, потому что в соответствии с документами:
Декодирует любую кодировку %## в данной строке. Символы плюс (» «) декодируются в символ пробела.
Это было бы допустимым вариантом использования этой функции, поскольку браузер не задействован. Просто фоновые процессы/запросы.