Редактировать: С тех пор я нашел и опубликовал эффективное и элегантное решение, которое преобразует идентификаторы, такие как 3141592
, в строки, такие как vJST
и обратно. Это доступно для PHP здесь:
https://github.com/delight-im/PHP-IDs
Предоставляя некоторый фон, он использует мультипликативное хеширование Кнута с последующим базовым преобразованием для генерации уникальных, обратимых непоследовательных идентификаторов.
Проблема:
У меня есть динамические страницы в PHP, где содержимое отображается в соответствии с заданным идентификатором. Идентификатор всегда передается через параметр GET: page.php? Id = X Это вызывает проблему: посетители сайта могут перечислять идентификаторы и просто просматривать все страницы с различным контентом. Конечно, это не должно быть возможным.
Как это можно решить?
Мой подход заключается в кодировании всех идентификаторов в ссылках и формах, которые позже используются в качестве параметра GET. В начале каждой страницы данный идентификатор декодируется в «реальный» идентификатор, который используется в базе данных. Это хороший подход? Вы бы выбрали другой путь?
Возможное решение моего подхода:
Я бы преобразовал целочисленный идентификатор в целое число 38 и заменил цифры на символы из данного списка. Я бы использовал эти символы для идентификатора кодированной строки:
a-z 0-9 - _
Не могли бы вы использовать и других персонажей? Для этих персонажей мой сценарий будет таким:
function id2secure($old_number) {
$alphabet_en = array(0=>'1', 1=>'3', 2=>'5', 3=>'7', 4=>'9', 5=>'0', 6=>'2', 7=>'4', 8=>'6', 9=>'8', 10=>'a', 11=>'c', 12=>'e', 13=>'g', 14=>'i', 15=>'k', 16=>'m', 17=>'o', 18=>'q', 19=>'s', 20=>'u', 21=>'w', 22=>'y', 23=>'b', 24=>'d', 25=>'f', 26=>'h', 27=>'j', 28=>'l', 29=>'n', 30=>'p', 31=>'r', 32=>'t', 33=>'v', 34=>'x', 35=>'z', 36=>'-', 37=>'_');
$new_number = '';
while ($old_number > 0) {
$rest = $old_number%38;
if (!isset($alphabet_en[$rest])) { return FALSE; }
$new_number .= $alphabet_en[$rest];
$old_number = floor($old_number/38);
}
$new_number = strrev($new_number);
return $new_number;
}
Дополнительный вопрос:
Какая была бы обратная функция для моей функции?
Надеюсь, вы мне поможете. Спасибо!