Как создать одноразовые ссылки? Любые CMS или каркасные решения? - PullRequest
1 голос
/ 30 октября 2009

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

Итак, кто-нибудь может направить меня в сторону какой-то (я полагаю, PHP + mySQL) CMS или инфраструктуры, которая могла бы достичь этого? Я много искал, но не могу понять, как правильно сформулировать этот запрос в поисковой системе.

У меня умеренный опыт программирования, но с PHP у меня немного опыта, за исключением простых хаков Wordpress.

Спасибо!

1 Ответ

1 голос
/ 30 октября 2009

Я просто дам вам общие рекомендации по простому способу построения такой системы.

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

Итак, когда он отправляет образец, вы создаете запись в таблице «Образец». Затем вы отправите менеджеру письмо с примером и ссылкой. Эта ссылка будет указывать на скрипт, в котором в качестве параметра будет указан «идентификатор» базы данных образца (этот скрипт должен проверять, что менеджер вошел в систему - если нет, показать экран входа в систему и после успешного входа перенаправить его обратно).

Затем этот сценарий будет знать о намерении менеджера разрешить автору представить свою работу. Теперь начинается самое интересное.

Есть много возможностей:

  1. Вы можете создать запись в соответствующей таблице БД «SubmitAuthorizations», содержащую идентификатор Writer и дату, когда было дано это разрешение (т. Е. Дату, когда строка была добавлена ​​в вашу БД). Затем вы просто отправляете письмо в Writer со ссылкой типа «upload.php? Id = 42», где id - это идентификатор авторизации. Этот скрипт будет проверять, является ли зарегистрированный пользователь правильным Writer, и находится ли он в допустимых временных рамках (сравнивая сохраненную «дату авторизации» и текущую дату).

  2. Следующий - тот, который я предпочитаю: без специальной таблицы только для обработки чего-то тривиального (допустим, вы никогда не захотите ни «отредактировать» авторизацию, ни «отменить» ее, но она все равно может «истечь») ). Вы просто даете 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».

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

...