URL с которого пришел

NeoLynx

Новичок
URL с которого пришел

Подскажите как правильней передать урл текущей страницы на следующюю, если в текущий урл имеет вид
index.php?f=ffff&g=gggg&h=hhhhh
 

valyala

Новичок
можно еще закодировать urlencode():
PHP:
$old_url = 'index.php?f=ffff&g=gggg&h=hhhhh';
$new_url = 'http://microsoft.com/index.php?old_url=' . urlencode($old_url);
Тогда принимающему скрипту не нужно будет ничего декодировать.
 

valyala

Новичок
IntenT, для кодирования лучше использовать не base64(), а md5()
 

NeoLynx

Новичок
вопрос не в кодировании, а в передаче урла, в котором ничего секретного нет.

спасибо, сделал через base64
 

Falc

Новичок
valyala
>>IntenT, для кодирования лучше использовать не base64(), а md5()
md5 не кодирует, а хеширует.
 

valyala

Новичок
md5 не кодирует, а хеширует.
используй. о результатах - напиши.
Результаты превзошли все мои ожидания! Вы не понимаете тонкого юмора. Фанат, где ты? Смотри - не я один такой дубовый :)
Если серьезно, то я ответил на вопрос NeoLynx в третьем сообщении сверху.
А теперь о том, почему не рекомендуется использовать base64_encode() для передачи данных методом GET (это же относится и к методу POST). Почитайте вот это: http://www.faqs.org/rfcs/rfc2045, раздел 6.8. Обратите особое внимание на символ под номером 62. А теперь попробуйте передать данные скирпту test.php таким образом:
PHP:
$enc_data = base64_encode('<b>');
print($enc_data);
$new_url = 'test.php?data=' . $enc_data;
В скрипте test.php выведите на печать параметр data перед его декодированием и сравните с тем, что вывел первый скрипт.
Да, после декодирования вы получите ту же строку <b>. Но, прочитайте вот этот параграф из вышеупомянутого RFC:
Any characters outside of the base64 alphabet are to be ignored in base64-encoded data.
и подумайте: "соответствует ли функция base64_decode() этому RFC?". Вдруг мне захочется использовать в качестве разделителя закодированных блоков не символ перевода строки, а символ пробела. В этом случае функция base64_decode() не справится со своими обязанностями.
А если принимающее закодированные данные приложение использует функцию декодирования, полностью соответствующую стандарту RFC (как, например, функция decode_base64() из пакета MIME::Base64 в перле)?

Согласен, что данные, закодированные base64_encode(), обычно имеют меньшую длину, чем данные, закодированные urlencode(). Поэтому лучшее решение - использовать их вместе:
PHP:
$new_url = 'http://microsoft.com/application?data=' . urlencode(base64_encode($data));
-~{}~ 14.04.04 21:53:

md5 не кодирует, а хеширует.
Falc, сейчас посмотрим, что кодирует, а что хэширует :)
используй. о результатах - напиши.
IntenT, а вот и долгожданные результаты. Используем функцию md5() для кодирования данных, чтобы их можно было передать в качестве параметра в GET или POST запросе:
PHP:
function md5_encode($str) {
    static $a = NULL; // таблица для кодирования
    if (is_null($a)) {
        // создаем таблицу для кодирования
        $a = array();
        $i = 0;
        while ($i < 256) {
            $index = substr(md5($i * pi()), 28, 3);
            $a[chr($i)] = $index;
            $i++;
        }
    }
    // кодируем строку
    $out = '';
    $n = strlen($str);
    for ($i = 0; $i < $n; $i++) $out .= $a[$str{$i}];
    return $out;
}

function md5_decode($str) {
    static $a = NULL; // таблица для декодирования
    if (is_null($a)) {
        // создаем таблицу для декодирования
        $a = array();
        $i = 0;
        while ($i < 256) {
            $index = substr(md5($i * pi()), 28, 3);
            $a[$index] = chr($i);
            $i++;
        }
    }
    // декодируем строку
    $out = '';
    $n = strlen($str);
    $n = (int) ($n / 3);
    for ($i = 0; $i < $n; $i++) {
        $code = substr($str, 3 * $i, 3);
        if (isset($a[$code])) $out .= $a[$code];
        else continue;
    }
    return $out;
}
Еще есть вопросы?
 

SiMM

Новичок
Автор оригинала: valyala
Falc, сейчас посмотрим, что кодирует, а что хэширует :)
А тут и смотреть-то нечего - налицо незнание терминологии - кодирование предполагает существование процесса декодирования для восстановления данных, хэширование - это всего лишь получение некоего достаточно уникального ключа для конкретных данных. Однако, ты можешь ещё поломать свою голову над этим, и даже, возможно, заработать Нобелевскую премию (хотя... в области математики Нобелевские премии не выдают). Попробуй декодировать закодированную при помощи md5 строку a954fb782a2f6954e99c91efaaa6ab81 - о результатах - доложишь ;)
PS: могу лишь добавить, что вариантов ответа с этим кэш-значением на самом деле бесконечное множество.
 

Falc

Новичок
valyala
>>Falc, сейчас посмотрим, что кодирует, а что хэширует

А причем тут мд5?
Ты закодировал своим методом мд5 тут не причем.
 

valyala

Новичок
могу лишь добавить, что вариантов ответа с этим кэш-значением на самом деле бесконечное множество.
SiMM, а что такое кэш-значение? ;)
А я всю жизнь думал, что криптографические хэш-функции h(X) обратимы и на следующие три свойства никогда не обращал внимания:
1) по заданному Y = h(X) трудно определить X (односторонняя)
2) для заданного X1 трудно найти X2 такое, что h(X1) = h(X2) (свободная от коллизий)
3) трудно найти пару различных X1 и X2 такую, что h(X1) = h(X2) (строго свободная от коллизий)

Ты закодировал своим методом мд5 тут не причем
Как это ни при чем? Тогда в чем смысл и каково назначение следующего выражения:
PHP:
substr(md5($i * pi()), 28, 3)
Видишь, для кодирования кроме md5 еще и отношение длины окружности к ее диаметру используется ;)

А чтобы вам жизнь медом не казалась, я написал функцию шифрования, основанную на хэш-функции md5():
PHP:
function md5_encrypt($plain_text, $password) {
    $n = strlen($plain_text);
    if ($n % 16) $plain_text .= str_repeat("\0", 16 - ($n % 16));
    $i = 0;
    $enc_text = '';
    $key = $password;
    while ($i < $n) {
        $block = substr($plain_text, $i, 16) ^ pack('H*', md5($key));
        $enc_text .= $block;
        $key = substr($block . $key, 0, 512);
        $i += 16;
    }
    return base64_encode($enc_text);
}

function md5_decrypt($enc_text, $password) {
    $enc_text = base64_decode($enc_text);
    $n = strlen($enc_text);
    $n >>= 4;
    $key = $password;
    $plain_text = '';
    for ($i = 0; $i < $n; $i++) {
        $block = substr($enc_text, $i << 4, 16);
        $plain_text .= $block ^ pack('H*', md5($key));
        $key = substr($block . $key, 0, 512);
    }
    return $plain_text;
}
p.s. SiMM, хотелось бы узнать от знатока терминологии, в чем отличие кодирования от шифрования.
 

SiMM

Новичок
Автор оригинала: valyala
p.s. SiMM, хотелось бы узнать от знатока терминологии, в чем отличие кодирования от шифрования.
Вообще-то термин "кодирование" вовсе не означает шифрование (сжатие информации так же является кодированием, и этот термин употребляется чаще всего именно тогда, когда речь идёт о нём). Поэтому ваш пост
IntenT, для кодирования лучше использовать не base64(), а md5()
лишён всякого смысла во всех смыслах (хотя бы потому, что md5, в отличии от любого кодировщика и base64, необратима). Почитайте наконец исходный пост - в нём речь шла именно об обратимой функции, вы же куда-то сместили тему в дебри шифрования.
 
Сверху