Php 仅允许通过链接单击查看网页

Php 仅允许通过链接单击查看网页,php,html,hyperlink,web,Php,Html,Hyperlink,Web,是否有一种方法仅在按下指向某个网页的链接时才允许查看该网页。我正在向我的组织成员发送电子邮件,其中包含将值附加到URL的链接,以便我可以使用phps$\u了解他们在网页上的身份并进行适当更新。我担心的是个人改变链接的值和其他成员的数据。如果有更好的方法做这件事,我洗耳恭听。使用登录系统不是一个选项。不完全是,不是 您可以做的是包含一些与特定用户id关联且很难猜测的令牌,并将其也包含在链接中-然后,当您收到get请求时,检查以确保令牌与您知道的用于该用户id的令牌匹配。(在发送电子邮件时,您可以将

是否有一种方法仅在按下指向某个网页的链接时才允许查看该网页。我正在向我的组织成员发送电子邮件,其中包含将值附加到URL的链接,以便我可以使用phps$\u了解他们在网页上的身份并进行适当更新。我担心的是个人改变链接的值和其他成员的数据。如果有更好的方法做这件事,我洗耳恭听。使用登录系统不是一个选项。

不完全是,不是

您可以做的是包含一些与特定用户id关联且很难猜测的令牌,并将其也包含在链接中-然后,当您收到get请求时,检查以确保令牌与您知道的用于该用户id的令牌匹配。(在发送电子邮件时,您可以将“正确”的令牌本地存储在数据库中。)

例如,你可能有

/modify_info_script?user_id=123&token=aSDqWEqwejk2123salskq
然后你会有一个数据库表或一些其他存储,它有

user_id          token
----------------------
...              ...
122              klqwkejajwie8u8213nak
123              aSDqWEqwejk2123salskq
...              ...
因此,如果有人试图更改URL中的用户id,令牌将不匹配,您可能会拒绝他们的请求。例如,这将被拒绝

/modify_info_script?user_id=122&token=aSDqWEqwejk2123salskq
因为
122
的正确标记应该是
klqwkejajwie8u82213nak
,而不是
aSDqWEqwejk2123salskq


如果不使用登录系统,这可能是最好的选择。但是,您应该确保使用登录系统根本不是一个选项,因为用户数据确实应该通过登录来保护。

这确实不是保护站点安全的正确方法

然而,简单的修复方法是检查“referer”标题并确保它不是空的。如果它不是空的,那么它来自于点击(或者他们欺骗了它,这就是为什么这是不安全的)


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

要检查是否有人来自链接,请参阅$\u服务器['HTTP\u REFERER']


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

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

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

/modify_info_script?token=aSDqWEqwejk2123salskqfilltill32chars
另一种选择是使用登录系统,用户必须键入其凭据才能更改信息


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

MD5不是加密哈希的好选择,也不是以同样的方式对每个URL进行签名的好主意(一旦你破坏了一个URL,你就破坏了所有URL)。存储单个令牌更好—不仅暴力更难(因为您必须对服务器本身进行暴力强制),但它也不会将一个用户的安全性与所有其他用户的安全性联系起来。如果我将此列添加到数据库中,有没有办法随机生成令牌值您有一个脚本可以添加用户行,对吗?好的,只需使用该脚本语言的随机数函数从
abcdefghijklmnopqrstuvwxyz012456789
或类似内容中选取一组字符,并将它们组合在一起,然后将结果存储在用户的“令牌”列中。令牌值不必是任何特殊格式或任何东西,只要它们是随机生成的,以至于有人无法猜测它们将是什么。对,这比散列要好。但是现在不需要在url中包含参数,也不需要在url中包含用户ID。您可以在数据库中查找不带标记的标记。任何增加的“安全性”都可以通过延长令牌的长度来抵消+1没什么大不了的,我会在下次会议时间向个人发送电子邮件,上面有3个按钮,上面写着“参加”、“不参加”,也许吧。(类似于meetup)当他们选择一个按钮时,我会更新他们的选择并对其进行计数,这样我就知道会有多少人参加。我只是不希望有一天人们感到无聊时就玩弄它