如何生成一次性使用链接?任何CMS或框架解决方案?

时间:2009-10-29 22:59:34

标签: content-management-system hyperlink

我正在为一家作家管理公司建立一个网站。他们每天都会从潜在的,经常是未经请求的作家那里获得大量的剧本提交。新网站将允许潜在的作者提交他或她的想法的简短日志/样本。此想法将发送到管理组的电子邮件帐户。如果管理组喜欢他们看到的内容,他们希望能够从电子邮件中批准该提交,并将一个唯一的链接分派给提交者以上传他们的完整脚本。此链接要么只运行一次,要么只运行一段时间,以便只有预期的收件人可以使用它。

那么,任何人都能指出我可以实现这一目标的某种方式(我是错误的PHP + mySQL)CMS或框架吗?我搜索了很多,但我似乎无法找出将此查询用于搜索引擎的正确方法。

我有一定的编程经验,但在一些简单的Wordpress黑客之外没有太多的PHP。

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

因此,当他提交样本时,您将在“Sample”表上创建一个条目。然后,您将使用示例和链接向Manager发送邮件。此链接将指向一个脚本,将示例的数据库“id”作为参数(此脚本应验证管理器是否已登录 - 如果不是,则显示登录屏幕,并在成功登录后将其重定向回来)。

然后,该脚本将知道管理员允许Writer提交其作品的意图。现在好玩的开始了。

有很多可能性:

  1. 您可以在相应的“SubmitAuthorizations”数据库表中创建一个条目,其中包含Writer的ID和授予此授权的日期(即行添加到数据库的日期)。然后,您只需使用“upload.php?id = 42”之类的链接向Writer发送邮件,其中id是授权ID。此脚本将检查记录的用户是否是正确的Writer,以及他是否在允许的时间范围内(通过比较存储的“授权日期”和当前日期)。

  2. 接下来就是我喜欢的那个:没有一个特殊的表只是为了处理一些微不足道的事情(假设你永远不想“编辑”一个授权,也没有“取消”它,但它可能仍然“过期” )。您只需向Writer提供一个包含2个参数的链接:授权日期授权密钥,例如:“upload.php?authDate = 20091030& key = 87a62d726ef7 ...“

  3. 让我解释它是如何运作的。

    该脚本将首先验证Writer是否已登录(如果没有,请在成功登录后显示带有重定向的登录页面。)

    所以,现在是时候验证请求了:也就是说,检查这是不是“伪造”链接。这该怎么做?这只是构建此授权密钥的“智能”方式。

    您可以执行以下操作:

    key = hash(concat(userId, ";", authDate, ";", seed));
    

    好吧,这里 hash()就是我们所谓的“单向函数”,比如MD5,SHA1等。然后 concat()只是一个字符串连接功能。最后种子就像一个“主密码”,完全随机,不会改变(如果你改变它所有发布的链接都会停止工作)只是为了增加安全性 - 让我们说黑客正确猜测你正在使用MD5(这很容易),他试图通过散列用户名和日期的某些组合来破解你的系统。

    此外,对于有效的请求,它必须在正确的时间范围内。

    因此,如果密钥都有效,并且日期在时间范围内,则您可以接受上传。

    需要注意的一些要点:

    • 这是一个非常简单的系统,但可能正是您所需要的。
    • 您应该避免使用MD5进行散列函数,而是使用类似SHA1的内容。
    • 对于发送到Writer的链接,您可以“混淆”参数名称,即“k”代表“key”,“d”代表“authDate”。
    • 对于这个日期,你可以选择另一种格式,更像“神秘”,就像unix时代一样。
    • 最后,您可以使用类似“base64”的方式对参数进行编码(或者只是应用一些字符替换函数,例如rot13,但是考虑到数字也是如此),只是为了让它们更难猜测
    • 为了完整起见,在验证脚本中,您还可以检查Writer是否已经在时间范围内发送了一个文件,从而使他无法在时间范围内发送许多文件。

    我最近在我工作的公司上实施了两次这样的事情,两种完全不同的用途。一旦你明白了,实现起来就非常简单极其 - 整个密钥生成和验证过程可能少于10行代码。

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

    我希望这会有所帮助,而且很明显。如果我找到时间,我会用一些语言的实例来博客。