【问题标题】:How to generate one-time-use links? Any CMS or framework solutions?如何生成一次性链接?任何 CMS 或框架解决方案?
【发布时间】:2010-12-11 10:48:05
【问题描述】:

我正在为一家作家管理公司制作网站。他们每天都会收到大量来自潜在且经常是不请自来的作家提交的剧本。新网站将允许潜在作家提交他或她的想法的简短日志/示例。这个想法被发送到管理组的电子邮件帐户。如果管理组喜欢他们看到的内容,他们希望能够从电子邮件中批准该提交,并将一个独特的链接发送给提交者以上传他们的完整脚本。此链接要么只有效一次,要么只有效一段时间,以便只有预期的收件人可以使用它。

那么,任何人都可以为我指明某种(我假设 PHP + mySQL)CMS 或框架可以实现这一目标的方向吗?我进行了很多搜索,但似乎无法找到正确的方法来将此查询表达到搜索引擎。

我有中等的编程经验,但除了一些简单的 Wordpress hack 之外,我对 PHP 的了解不多。

谢谢!

【问题讨论】:

  • 只工作一次是个坏主意。如果客户在上传他们的文件时出现任何错误,他们就会被搞砸,你必须再次经历这个过程。有时间限制的窗口更好,或者是一个多步骤的过程,以确保链接只有在成功上传后才起作用。

标签: content-management-system hyperlink


【解决方案1】:

我只会为您提供构建此类系统的简单方法的一般指导。

我假设作者以某种方式注册到系统中,并且他/她的个人资料包含有效的邮件地址。

因此,当他提交样本时,您将在“样本”表中创建一个条目。然后,您将向经理邮寄样品和链接。此链接将指向一个脚本,该脚本将样本的数据库“id”作为参数提供(此脚本应验证经理是否已登录——如果未登录,则显示登录屏幕并在成功登录后将其重定向回来)。

然后,此脚本将知道经理打算允许作者提交其作品的意图。现在乐趣开始了。

有很多可能性:

  1. 您可以在适当的“SubmitAuthorizations”数据库表中创建一个条目,其中包含写入者的 ID 和授予此授权的日期(即,将行添加到数据库的日期)。然后,您只需向 Writer 发送一封邮件,其中包含“upload.php?id=42”之类的链接,其中 id 是授权 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”表示“key”,将“d”表示为“authDate”。
  • 对于日期,您可以选择另一种更“神秘”的格式,例如 unix 纪元。
  • 最后,您可以使用“base64”之类的参数对参数进行编码(或者简单地应用一些字符替换函数,例如 rot13,但也将数字考虑在内)只是为了让它们更难猜到
  • 为了完整起见,在验证脚本中,您还可以检查 Writer 是否已经在时间范围内发送了文件,从而使他无法在时间范围内发送许多文件。

我最近在我工作的公司两次实施了类似的事情,用于两种完全不同的用途。一旦你有了这个想法,实现它非常简单——整个密钥生成和验证过程可能不到 10 行代码。

在其中一个上,相当于您的 Writer 的代理没有进入系统的帐户(实际上这是他与系统的第一次接触)——系统上只有他的“个人资料”,由其他人管理。在这种情况下,您还必须在“Upload”脚本的参数中包含“Writer”的 id。

我希望这会有所帮助,并且已经足够清楚了。如果我有时间,我会在博客上写一个关于某种语言的工作示例。

【讨论】:

  • 布鲁诺太棒了!非常翔实,非常感谢!刚刚订阅了你的博客 :) 再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多