我只会为您提供构建此类系统的简单方法的一般指导。
我假设作者以某种方式注册到系统中,并且他/她的个人资料包含有效的邮件地址。
因此,当他提交样本时,您将在“样本”表中创建一个条目。然后,您将向经理邮寄样品和链接。此链接将指向一个脚本,该脚本将样本的数据库“id”作为参数提供(此脚本应验证经理是否已登录——如果未登录,则显示登录屏幕并在成功登录后将其重定向回来)。
然后,此脚本将知道经理打算允许作者提交其作品的意图。现在乐趣开始了。
有很多可能性:
您可以在适当的“SubmitAuthorizations”数据库表中创建一个条目,其中包含写入者的 ID 和授予此授权的日期(即,将行添加到数据库的日期)。然后,您只需向 Writer 发送一封邮件,其中包含“upload.php?id=42”之类的链接,其中 id 是授权 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”表示“key”,将“d”表示为“authDate”。
- 对于日期,您可以选择另一种更“神秘”的格式,例如 unix 纪元。
- 最后,您可以使用“base64”之类的参数对参数进行编码(或者简单地应用一些字符替换函数,例如 rot13,但也将数字考虑在内)只是为了让它们更难猜到
- 为了完整起见,在验证脚本中,您还可以检查 Writer 是否已经在时间范围内发送了文件,从而使他无法在时间范围内发送许多文件。
我最近在我工作的公司两次实施了类似的事情,用于两种完全不同的用途。一旦你有了这个想法,实现它非常简单——整个密钥生成和验证过程可能不到 10 行代码。
在其中一个上,相当于您的 Writer 的代理没有进入系统的帐户(实际上这是他与系统的第一次接触)——系统上只有他的“个人资料”,由其他人管理。在这种情况下,您还必须在“Upload”脚本的参数中包含“Writer”的 id。
我希望这会有所帮助,并且已经足够清楚了。如果我有时间,我会在博客上写一个关于某种语言的工作示例。