【问题标题】:Only allow webpage to be viewed via link click只允许通过链接点击查看网页
【发布时间】:2011-09-20 13:25:24
【问题描述】:

有没有办法只在点击指向它的链接时才让网页被查看。我正在向我的组织成员发送电子邮件,其中包含将值附加到 URL 的链接,因此我可以使用 phps $_GET 来确定他们在网页上的身份并进行适当的更新。我担心的是个人更改链接的值并更改其他成员数据。如果有更好的方法来做到这一点,我全神贯注。不能使用登录系统。

【问题讨论】:

    标签: php html hyperlink web


    【解决方案1】:

    不完全是,不。

    您可以做的是包含一些与特定用户 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 或类似的字符中挑选出一堆字符并将它们捆绑在一起,然后将结果存储在用户的“令牌”列中。令牌值不必是任何特殊格式或任何东西,只要它们是随机生成的,以至于人们无法猜测它们会是什么。
    • 对,这比哈希好。但是现在不需要url中的参数了。
    • 那里不需要用户ID。您可以在没有它的情况下在数据库中查找令牌。任何因拥有用户 ID 而增加的“安全性”都可以通过使令牌更长一点来抵消。 +1
    • 这没什么大不了的,我会在下次会议时间给个人发送电子邮件,并带有 3 个按钮,表示参加,可能不参加。 (类似于聚会)当他们选择一个按钮时,我会更新他们的选择并统计它,这样我就知道有多少人期待。我只是不希望人们有一天感到无聊时玩弄它
    【解决方案2】:

    这确实不是保护您网站的正确方法。

    不过,对您来说最简单的解决方法是检查“referer”标题并确保它不为空。如果它不是空白的,那么它来自点击(或者他们欺骗了它,这就是不安全的原因)。

    真正保护数据的方法是实现具有一组权限的登录系统。

    【讨论】:

      【解决方案3】:

      要检查是否有人来自链接,请参阅 $_SERVER['HTTP_REFERER']。

      为了保护应用程序免受链接操纵,您可以将其与秘密密码短语(仅在内部,任何人都不得知道密码短语)结合起来,并在结果上使用 md5()。将 MD5 附加到 url。如果有人操纵了网址,您就会知道,因为“网址加上您的密码减去MD5”的MD5会有所不同。

      【讨论】:

      • MD5 不是加密哈希的好选择——以同样的方式签署每个 URL 也不是一个好主意(一旦你破坏了一个 URL,你就破坏了它们)。存储单个令牌更好 - 不仅暴力破解更加困难(因为您必须对服务器本身进行暴力破解),而且它也不会将一个用户的安全性与所有其他用户联系起来。
      【解决方案4】:

      很多密码重置系统都是这样工作的,所以如果你使用足够长的随机令牌,你可以说它是相当安全的。 32 个字符应该没问题。

      只需提供令牌就足够了,因为您不需要用户 ID 来检查数据库中已发布的令牌。

      /modify_info_script?token=aSDqWEqwejk2123salskqfilltill32chars
      

      另一种选择是使用登录系统,用户必须输入其凭据才能更改信息。

      此外,如果您真的担心有人可能会尝试猜测它,只需在 3 次错误的令牌尝试后暂停/禁止用户。无论如何,任何人都不应该尝试手动输入它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-24
        • 2016-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-21
        • 2017-05-06
        • 1970-01-01
        相关资源
        最近更新 更多