Кодировать и декодировать идентификатор сообщения URL-адреса, используя php

Я пытаюсь кодировать идентификатор сообщения в php-приложении, и я не могу найти четкое описание того, как это сделать.

В основном у меня есть URL-адрес, например – http://www.mymessager.com?messageID=1234

Я хочу, чтобы система кодировала идентификатор сообщения для URL-адреса, но не меняла его в базе данных, например – http://www.mymessager.com?messageID=38927648726894762345768

Как я могу сделать такую ​​вещь, чтобы, если кто-то перейдет на кодированный url, php отобразит http://www.mymessager.com?messageID=38927648726894762345768 в адресной строке, но сценарий вытащит из базы данных сообщение 1234?

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

Related of "Кодировать и декодировать идентификатор сообщения URL-адреса, используя php"

Разве это не позволяет другим пользователям открывать личные сообщения других пользователей с помощью messageID = 4321 и т. Д.? Потому что тогда этот путь – не выход!

Вы должны убедиться, что пользователю, открывающему сообщение, действительно разрешено это делать.

Если сообщения не являются частными, и вы просто не хотите, чтобы люди постепенно просматривали сообщения, изменяя число. Затем вы можете добавить поле «messageKey» в базу данных и установить случайные строки определенной длины. Пример http://www.mymessager.com?messageKey=jadg23sf34lhs

Теперь просто выполните поиск в БД для сообщений с этим сообщением. Не забудьте убедиться, что messageKey уникален.

Таким образом, вы также можете установить messageKey на что-то легкое для запоминания, или SEO, возможно, дружелюбный. Пока это уникально.

Я фактически перевел их на строку:

$consts = array(66016,57721, 42344,56714,76422); define( 'BASE', 36 ); $to_encrypt = 5789; // Generate a random seed value as an index of the constants $seed = rand(0,count()-1); // Add the constant the product of the seed and the to the value to be encrypted // (the multiplication just serves to create more noise) $base_crypt = ( $consts[ $seed ] + $to_encrypt * ( $seed + 1 ) ); //SEE NOTES ON FLOATING POINT ISSUES IN PHP DOCS! $encrypted = base_convert( BASE * $base_crypt + $seed, 10, BASE ); 

Затем расшифруйте:

  $encrypted = base_convert( $_GET[ 'encrypted' ], BASE, 10 ); $seed = $encrypted % BASE; $decrypted = ( ( $encrypted - $seed )/BASE - $consts[ $seed ])/( $seed + 1 ); 

Вероятно, вам придется использовать bcadd и тому подобное, но у меня есть производственная копия этой системы, и она работает.

(Я должен включить ссылку на то, где я впервые опубликовал это).

если вы хешируете (например, с md5), вы можете сравнить хешированные значения id, например:

  $SQL = "SELECT * FROM `messages` WHERE MD5(ID) = '".$_GET['id']."'"; 

Обычно это делается путем хранения другого идентификатора для каждой записи в базе данных. Если вы не хотите идти по этому маршруту, вам придется использовать функцию, которая может конвертировать в / из «общедоступных» идентификаторов. Подобно…

 function toPublicId($id) { return $id * 1498158 + 825920496; } function toInternalId($publicId) { return ($publicId - 825920496) / 1498158; } 

или что-то еще. Я иногда использую гарантированные уникальные буквенно-цифровые идентификаторы для общедоступных идентификаторов, конвертируя их в / из них путем преобразования в / из, например, base36 и большого множителя + смещения.