Я пытаюсь кодировать идентификатор сообщения в 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-адреса).
Разве это не позволяет другим пользователям открывать личные сообщения других пользователей с помощью 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 и большого множителя + смещения.