Я просто дам вам общие рекомендации по простому способу построения такой системы.
Я предполагаю, что Writer каким-то образом зарегистрирован в системе, и его / ее профиль содержит действующий почтовый адрес.
Итак, когда он отправляет образец, вы создаете запись в таблице «Образец». Затем вы отправите менеджеру письмо с примером и ссылкой. Эта ссылка будет указывать на скрипт, в котором в качестве параметра будет указан «идентификатор» базы данных образца (этот скрипт должен проверять, что менеджер вошел в систему - если нет, показать экран входа в систему и после успешного входа перенаправить его обратно).
Затем этот сценарий будет знать о намерении менеджера разрешить автору представить свою работу. Теперь начинается самое интересное.
Есть много возможностей:
Вы можете создать запись в соответствующей таблице БД «SubmitAuthorizations», содержащую идентификатор Writer и дату, когда было дано это разрешение (т. Е. Дату, когда строка была добавлена в вашу БД). Затем вы просто отправляете письмо в Writer со ссылкой типа «upload.php? Id = 42», где id - это идентификатор авторизации. Этот скрипт будет проверять, является ли зарегистрированный пользователь правильным Writer, и находится ли он в допустимых временных рамках (сравнивая сохраненную «дату авторизации» и текущую дату).
Следующий - тот, который я предпочитаю: без специальной таблицы только для обработки чего-то тривиального (допустим, вы никогда не захотите ни «отредактировать» авторизацию, ни «отменить» ее, но она все равно может «истечь») ). Вы просто даете Writer ссылку с 2 параметрами: дата, на которую было дано разрешение , и ключ авторизации , например: "upload.php? AuthDate = 20091030 & key = 87a62d726ef7 ... «
Позвольте мне объяснить, как это работает.
Сценарий сначала проверит, вошел ли Writer в систему (если нет, отобразит страницу входа с перенаправлением после успешного входа).
Итак, пришло время проверить запрос: проверить, не является ли это «поддельной» ссылкой. Как это сделать? Это просто «умный» способ создания этого ключа авторизации.
Вы можете сделать что-то вроде:
key = hash(concat(userId, ";", authDate, ";", seed));
Хорошо, здесь hash () - это то, что мы называем «односторонней функцией», такой как MD5, SHA1 и т. Д. Тогда concat () - это просто функция конкатенации строк , Наконец, seed - это что-то вроде «мастер-пароля», совершенно случайный, и он не изменится (поскольку, если вы измените его, все выданные ссылки перестанут работать), просто для повышения безопасности - скажем, хакер правильно угадывает вы используете MD5 (что легко), и он пытается взломать вашу систему, хэшируя некоторые комбинации имени пользователя и даты.
Кроме того, для того, чтобы запрос был действительным, он должен быть в правильных временных рамках.
Итак, если и ключ действителен, и дата находится в пределах временного интервала, вы можете принять загрузку.
Несколько замечаний:
- Это очень простая система, но может быть именно то, что вам нужно.
- Вам следует избегать MD5 для функции хеширования, вместо этого взять что-то вроде SHA1.
- Для ссылки, отправленной в Writer, вы могли бы «запутать» имена параметров, то есть назвать их «k» для «ключа» и «d» для «authDate».
- На сегодняшний день вы можете выбрать другой формат, более «загадочный», как эпоха Unix.
- Наконец, вы можете закодировать параметры с помощью чего-то вроде «base64» (или просто применить некоторую функцию замены символов, например, например, rot13, но с учетом цифр), просто чтобы их было сложнее угадать
- Просто для полноты, в сценарии проверки вы также можете проверить, отправил ли Writer уже файл за определенный промежуток времени, что лишает его возможности отправлять много файлов за указанный промежуток времени.
Недавно я дважды внедрил нечто подобное в компании, в которой я работаю, для двух совершенно разных целей. Как только вы поймете, что это просто, чрезвычайно просто реализовать - возможно, менее 10 строк кода для всего процесса генерации и проверки ключей.
На одном из них агент, эквивалентный вашему Writer, не имел учетной записи в системе (фактически это был его первый контакт с системой) - в системе был только его «профиль», управляемый кем-то другим. В этом случае вам также необходимо включить идентификатор «Writer» в параметры скрипта «Upload».
Надеюсь, это поможет, и это было достаточно ясно. Если я найду время, я напишу об этом с рабочим примером на каком-нибудь языке.