如何检查网站是否未直接到达?

时间:2011-09-07 16:12:03

标签: php hyperlink voting-system

我有一个投票脚本。效果很好。

但我有一点问题。我不希望人们直接到达投票提交页面(投票提交给数据库的页面)。我希望他们只通过特定的链接到达它。

我的投票链接:

<form>
<INPUT id="voteup1" type="BUTTON" VALUE="Vote it up!" ONCLICK="window.location.href='rankup.php?rankid=<? echo $id1; ?>'"> 
<INPUT id="votedown1" type="BUTTON" VALUE="Vote it down!" ONCLICK="window.location.href='rank.php?rankid=<? echo $id1; ?>'"> 
</form>

$id1用于定义用户投票的页面。 (将投票添加到数据库时很重要)

我不希望人们直接达到rankup.php和rank.php。我怎么能阻止这个?

3 个答案:

答案 0 :(得分:3)

HTTP是无状态的。 没有“直接/间接”到达页面 - 每个请求都与之前的请求断开连接。

PHP有一种克服此限制的机制:Sessions,后者又使用cookie。

因此,你可以设置一个会话变量,用作你可以拥有投票按钮的页面上的“can-vote-now”,如果没有设置,则禁止投票。

页面上的伪代码带按钮:

set_voting_variable_for($poll_identifier);

rankup.php上的伪代码:

if (!is_voting_variable_set($poll_identifier)) {
  // redirect away
} else {
  // register the vote
}

哦,请注意,让事情发生的页面(所谓的“非幂等”行为 - 例如增加投票数)不应该通过GET到达(作为GET保留用于显示事物而不更改它们 - “幂等”操作):您可能想要创建一个使用POST的表单。

答案 1 :(得分:2)

最好的办法是使用cookie。仅允许使用您在特定时间范围内生成的Cookie值进行投票。否则,生成cookie值会很容易。

您可以使用PHP会话轻松完成此操作。

您还应该知道,不建议在GET请求中导致操作发生(更改投票计数)。仅在使用特定参数检索数据时才应使用GET个变量。请改用POST。否则,每当某个搜索机器人在你的投票脚本中绊倒时,投票就会改变。

答案 2 :(得分:1)

您可以使用PHP的引用变量$_SERVER['HTTP_REFERER']来检查引用的URL是否属于您。但你不能依赖这100%,因为这些信息可能不会被发送,因为它是HTTP标题的一部分,用户可以根据需要修改它。

如建议的那样,会话可能是一个很好的方法。我选择会话而不是cookie,因为用户可以在您的网站上禁用他们的cookie - 并且cookie可由用户编辑。会话只能由有权访问您服务器的人编辑(通常是共享主机)。

我也不同意你这样做的方式。目前,您依赖于用户在其浏览器中启用了JavaScript。有些用户没有启用它,有些用户的浏览器不支持它。有些用户甚至会禁用此类页面重定向。

就个人而言,我不是使用两个脚本,而是使用一个类似的脚本:

<form action="rank.php" method="post">
<input type="submit" value="Vote up!" />
<input type="submit" value="Vote down!" />
</form>

在rank.php中,您可以检测到按下了哪两个按钮,然后相应地运行一个功能。您可以使用会话变量来存储他们将要投票的项目的ID,然后从会话中读取该ID(确保将其转义)以确保用户最后无法更改ID分钟。

希望这应该给你一些想法。