【发布时间】:2011-09-20 13:25:24
【问题描述】:
有没有办法只在点击指向它的链接时才让网页被查看。我正在向我的组织成员发送电子邮件,其中包含将值附加到 URL 的链接,因此我可以使用 phps $_GET 来确定他们在网页上的身份并进行适当的更新。我担心的是个人更改链接的值并更改其他成员数据。如果有更好的方法来做到这一点,我全神贯注。不能使用登录系统。
【问题讨论】:
有没有办法只在点击指向它的链接时才让网页被查看。我正在向我的组织成员发送电子邮件,其中包含将值附加到 URL 的链接,因此我可以使用 phps $_GET 来确定他们在网页上的身份并进行适当的更新。我担心的是个人更改链接的值并更改其他成员数据。如果有更好的方法来做到这一点,我全神贯注。不能使用登录系统。
【问题讨论】:
不完全是,不。
您可以做的是包含一些与特定用户 ID 保持关联并且很难猜到的令牌,并将其也包含在链接中 - 然后,当您收到 GET 请求时,您检查以确保该令牌与您知道对该用户标识正确的那个相匹配。 (发送电子邮件时,您可以将“正确”令牌本地存储在数据库中。)
例如,您可能有...
/modify_info_script?user_id=123&token=aSDqWEqwejk2123salskq
然后您将拥有一个数据库表或其他存储...
user_id token
----------------------
... ...
122 klqwkejajwie8u8213nak
123 aSDqWEqwejk2123salskq
... ...
因此,如果有人试图更改 URL 中的 user_id,令牌将不匹配,您可以拒绝他们的请求。例如,这会被拒绝...
/modify_info_script?user_id=122&token=aSDqWEqwejk2123salskq
因为122 的正确标记是klqwkejajwie8u8213nak,而不是aSDqWEqwejk2123salskq。
如果不能使用登录系统,这可能是最好的选择。但是,您确实应该确保根本不能使用登录系统,因为用户数据确实应该受到登录的保护。
【讨论】:
abcdefghijklmnopqrstuvwxyz0123456789 或类似的字符中挑选出一堆字符并将它们捆绑在一起,然后将结果存储在用户的“令牌”列中。令牌值不必是任何特殊格式或任何东西,只要它们是随机生成的,以至于人们无法猜测它们会是什么。
这确实不是保护您网站的正确方法。
不过,对您来说最简单的解决方法是检查“referer”标题并确保它不为空。如果它不是空白的,那么它来自点击(或者他们欺骗了它,这就是不安全的原因)。
真正保护数据的方法是实现具有一组权限的登录系统。
【讨论】:
要检查是否有人来自链接,请参阅 $_SERVER['HTTP_REFERER']。
为了保护应用程序免受链接操纵,您可以将其与秘密密码短语(仅在内部,任何人都不得知道密码短语)结合起来,并在结果上使用 md5()。将 MD5 附加到 url。如果有人操纵了网址,您就会知道,因为“网址加上您的密码减去MD5”的MD5会有所不同。
【讨论】:
很多密码重置系统都是这样工作的,所以如果你使用足够长的随机令牌,你可以说它是相当安全的。 32 个字符应该没问题。
只需提供令牌就足够了,因为您不需要用户 ID 来检查数据库中已发布的令牌。
/modify_info_script?token=aSDqWEqwejk2123salskqfilltill32chars
另一种选择是使用登录系统,用户必须输入其凭据才能更改信息。
此外,如果您真的担心有人可能会尝试猜测它,只需在 3 次错误的令牌尝试后暂停/禁止用户。无论如何,任何人都不应该尝试手动输入它们。
【讨论】: