PHP: проблемы с кодировкой URL (rawurlencode и rawurldecode) - PullRequest
1 голос
/ 24 февраля 2011

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

Мой URL выглядит следующим образом: /path/to/file.html?token=abcd123

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

<?php
//send

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


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

?>

[Редактировать]

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

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

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

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

1 Ответ

0 голосов
/ 24 февраля 2011

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

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

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

...