закодировать GET запрос чтоб не параметры не были видны

zagrenat

Гуру форума
Регистрация
26 Дек 2006
Сообщения
245
Реакции
68
Всем привет, вопрос
как закодировать GET запрос чтоб не параметры не были видны и ссылка уник была доступна

/index.php?d=18&m=12&y=1990&fi3x7&format=twig-html
задача простая, лишить людей возможности менять самим параметры в урле

в какую сторону хоть смотреть ?
 
Дополнительное поле ХЕШ сделайте, который будет как-то считаться из всех входящих параметров.
Дальше перед обработкой данных вычисляется хеш и сравнивается с вашими параметрами. Сошелся - запрос дальше пошел... Не сошелся - Error 404.

Как-то так:
/index.php?d=18&m=12&y=1990&fi3x7&format=twig-html&hash=asdklfjdhfkhasdfjlkajfl

Можно почитать Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование:
Как вариант - использовать эти две функции
PHP:
<?php

$params = range(0, 10);

echo $params = json_encode($params);
echo PHP_EOL;
echo $encrypt = md5_encrypt($params, 'someStrongKeyForEncrypt');
echo PHP_EOL;
echo $decrypt = md5_decrypt($encrypt, 'someStrongKeyForEncrypt');

function md5_encrypt($plain_text, $password, $iv_len = 16) {
    $plain_text .= "\x13";
    $n = strlen($plain_text);
    if ($n % 16) $plain_text .= str_repeat("\0", 16 - ($n % 16));
    $i = 0;
    $enc_text = get_rnd_iv($iv_len);
    $iv = substr($password ^ $enc_text, 0, 512);
    while ($i < $n) {
        $block = substr($plain_text, $i, 16) ^ pack('H*', md5($iv));
        $enc_text .= $block;
        $iv = substr($block . $iv, 0, 512) ^ $password;
        $i += 16;
    }
    return base64_encode($enc_text);
}

function md5_decrypt($enc_text, $password, $iv_len = 16) {
    $enc_text = base64_decode($enc_text);
    $n = strlen($enc_text);
    $i = $iv_len;
    $plain_text = '';
    $iv = substr($password ^ substr($enc_text, 0, $iv_len), 0, 512);
    while ($i < $n) {
        $block = substr($enc_text, $i, 16);
        $plain_text .= $block ^ pack('H*', md5($iv));
        $iv = substr($block . $iv, 0, 512) ^ $password;
        $i += 16;
    }
    return preg_replace('/\\x13\\x00*$/', '', $plain_text);
}
function get_rnd_iv($iv_len) {
    $iv = '';
    while ($iv_len-- > 0) {
        $max_rand = mt_rand(0, 255);
        $iv .= chr($max_rand & 0xff);
    }

    return $iv;
}

А результат работы md5_encrypt показывать в параметре УРЛ. При смене хотя бы одного символа на выходе каша
 
PHP:
<?php

$secret = 'D)*@Adoia2hdg0a29d7atoyljjfd#*&$^*^';

if (count($_GET))
{
    // Проверка
    $hash = $_GET['hash'];
    unset($_GET['hash']);
  
    ksort($_GET);
  
    if (md5(http_build_query($_GET)) === $hash)
    {
        echo 'success';
    }
    else
    {
        echo 'fail';
    }
}
else
{
    // Генерация
    $data = [
        'a' => 'b',
        'c' => 'd',
    ];
  
    ksort($data);
    $data['hash'] = md5(http_build_query($data));
  
    $get = http_build_query($data);
  
    header("Location: {$_SERVER['REQUEST_URI']}?{$get}");
}
 
Код:
//уникальная ссылка закодим с текущим временем
$get = "?d=18&m=12&y=1990&fi3x7&format=twig-html"."&time=".time();
$param = base64_encode($get);
$url = $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['HTTP_HOST'].'/index.php?param='.$param
header("Location: $url");

//раскодим
$param = base64_decode(urldecode($_GET['param']));
parse_str($param, $output);
  foreach($output as $key => $value) {
     echo "key=$key / value=$value";
   }
 
Назад
Сверху