Как скрыть переменную GET? - PullRequest
       8

Как скрыть переменную GET?

3 голосов
/ 10 сентября 2010

Я играю над идеей создания автоматических электронных сертификатов. Создать собственный сертификат с помощью класса PHP fpdf довольно просто. То, как я его настроил, - это URL

.

<a href="http://www.example.com/makepdf.php?name=myname&class=classname" rel="nofollow noreferrer">http://www.example.com/makepdf.php?name=myname&class=classname</a>

вы получаете сертификат в формате PDF с именем ученика и классом, взятым из переменной $ _GET. Конечно, это означает, что любой может манипулировать URL, чтобы очень легко создать собственный сертификат. (В любом случае они могли бы сделать это в Photoshop, но идея состоит в том, чтобы манипулировать сертификатом не совсем тривиально.) Когда класс закончится, я хочу отправить слияние для всех с уникальным URL-адресом для их сертификата.

Как бы вы подошли к этой проблеме? Должен ли я просто создать набор случайных чисел и связать их с парами ученик / мастерская в базе данных? Существуют ли стандартные способы решения этой проблемы?

Ответы [ 5 ]

6 голосов
/ 10 сентября 2010

Пара решений выделяются:

  • Хранить имена и классы в базе данных и ссылаться на них с помощью числового идентификатора вместо передачи данных в запросе
  • Сохраните информацию в запросе, но добавьте безопасный хеш, который предотвратит подделку данных

Механизм хеширования будет выглядеть примерно так:

При создании ссылки для сертификата у вас есть $name и $class. Вы создадите третью переменную GET, которая является хешем $name, $class и секретной строкой, которую знает только ваша программа. Примерно так:

$salt = "this is my secret";
$hash = md5($name . $class . $salt);
$url = "http://www.mysite.com/certificate.php?name=" . urlencode($name) . "&class=" . urlencode($class) . "&hash=" . $hash;

Теперь, когда пользователь заходит на страницу создания вашего сертификата, вы должны проверить хеш:

$salt = "this is my secret";
$expected = md5($_GET['name'] . $_GET['class'] . $salt);
if ($expected != $_GET['hash']) {
  die("You are not authorized");
} else {
  // User is OK; generate the certificate
}
0 голосов
/ 10 сентября 2010

Предполагая, что вы сами генерируете эти URL на сервере, вы можете объединить все значения ваших параметров в строку:

hash_string = "myname:classname";

Затем добавьте последний параметр, который представляет собой хэш этой строки вместе с некоторым секретным начальным числом:

query_string .= "&h=" . md5("my_secret_key:" . hash_string)

Затем, когда вы получите запрос обратно, просто убедитесь, что хеш совпадает:

hash_string = params['name'] . ':' . params['class'];
if (params['h'] == md5("my_secret_key:" . hash_string)) ...

Я действительно не знаю синтаксис PHP, но вы поняли.

0 голосов
/ 10 сентября 2010

Лучше всего было бы иметь список студентов / классов (какая-то база данных) и разрешать только генерацию разрешенных сертификатов. Таким образом, вам не нужно запутывать имя ученика или класса, , потому что могут быть сгенерированы только действительные сертификаты .

Если спросить слишком много - вы можете сгенерировать хеш MD5 на основе комбинации и соли , а затем добавить этот хеш в URL. Таким образом, соль должна быть известна, чтобы подделать URL.

http://www.example.com/makepdf.php?name=Tim&class=PHP&hash=c2c455ce438112b44499561131321126

Тогда скрипт генерации просто делает это:

$hash = md5($_GET['name'] . $_GET['class'] . $salt);
if($hash != $_GET['hash']){
  //invalid request
}

Конечно, вам нужно сгенерировать URL с той же солью.

0 голосов
/ 10 сентября 2010

Стоит ли просто создать набор случайных чисел и связать их с парами ученик / мастерская в базе данных?

Да.

0 голосов
/ 10 сентября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...