PHP: проблемы с кодировкой url (rawurlencode и rawurldecode)

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

Мой URL-адрес выглядит так: /path/to/file.html?token=abcd123

Вот фрагмент кода, который я использую. Я делаю что-то явно неправильное? В противном случае есть ли лучший способ создать (зашифрованные) токены и передать их в URL-адресе?

<?php
//send

$raw = "some secret string";
$token = rawurlencode($raw);


//recieve
$data = rawurldecode($token);

?>

[Изменить]

Я удалил функцию шифрования enc (dec) - они не были причиной проблемы - и были отвлекающим маневром. Я сузил проблему до того, что rawurlencode / decode не является симметричным в том, как они работают.

Строка в кодировке rawurlencoded при декодировании дает другую строку (аналогичную строку, но с отсутствующими частями). Конечно, не может быть ошибки в чем-то столь же фундаментальном для URL-адресов - так что я, должно быть, делаю что-то не так. Проблема в том, что я не могу его обнаружить, и пока, кажется, никто другой не может его обнаружить ...

[Дополнительная информация]

Я использую веб-фреймворк Symfony (v1.3.8), который, вероятно, возится с запросами, кодируя и декодируя вещи за кулисами. Я попытаюсь получить параметр токена непосредственно из переменной $ _POST и посмотреть, не является ли Symfony виновником всего этого.


person oompahloompah    schedule 24.02.2011    source источник
comment
Хорошо, я исправил это. На самом деле это была проблема, вызванная моим концом. Ошибка произошла до вызова rawurlencode ().   -  person oompahloompah    schedule 24.02.2011


Ответы (1)


Вам не нужно rawurldecode получать токен по URL-адресу, потому что PHP обрабатывает это за вас. например "foo.php? q = hello% 20world" приводит к тому, что $_GET['q'] будет иметь 'hello world', а не 'hello% 20world'

Поскольку вы используете режим ECB, IV игнорируется, что хорошо, поскольку вам нужно будет использовать тот же IV для шифрования и дешифрования.

Что касается того, что может вызвать сбой - расшифрованная строка будет дополнена до размера блока, поэтому она может быть длиннее исходной строки. Вы можете обойти это, передав длину строки и используя substr после дешифрования.

person Long Ears    schedule 24.02.2011