我有一个投票脚本。效果很好。
但我有一点问题。我不希望人们直接到达投票提交页面(投票提交给数据库的页面)。我希望他们只通过特定的链接到达它。
我的投票链接:
<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。我怎么能阻止这个?
答案 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分钟。
希望这应该给你一些想法。