我正在制作一个facemash模拟器,我发现它很容易作弊^^如果你在浏览器中多次输入:http://domain.com/rate.php?winner=1&loser=2,你可以使照片№1成为赢家。我知道可以通过cookie和ip-blocking来阻止它,但我不知道究竟是怎么回事。请帮我。谢谢!
Thant是一个例子(不是我的): http://facemash.moefelt.dk/
UPD我可以根据需要提供源代码。
UPD 1 rate.php http://jsfiddle.net/6xLR6/ index.php http://jsfiddle.net/AvF4M/1/
答案 0 :(得分:1)
你可以简单地使用$ _POST实例$ _GET,作弊会更难!
cookie可以保存在缓存中,但如果用户每次都清理它,那么它可能没用。
编辑:
<form METHOD=POST ACTION="rate.php">
<table>
<tr>
<td><img src="images/<?=$images[0]->filename?>" /></td>
<td><img src="images/<?=$images[1]->filename?>" /></td>
<input type="radio" name="winer" value="First"> First<br>
<input type="radio" name="winer" value="Second"> Second
<input type="hidden" name="first" value="<?=$images[0]->image_id?>">
<input type="hidden" name="second" value="<?=$images[1]->image_id?>">
</tr>
</table>
</form>
在rate.php中:
<?php
$winerId = $_POST['winer'];
if ($_POST['winer'] == $_POST['first']){
$looser = $_POST['second'];}
else { $looser = $_POST['second']; }
...
我认为你现在得到了所有你想要的东西; - )
答案 1 :(得分:1)
不要使用查询参数。用户POST请求将数据发送到服务器。
答案 2 :(得分:1)
你可以尝试这个:
<?php
session_start();
if(isset($_POST['face']))
{
//add another session verifier, at least you can prevent multiple votes in 1 browser session
if(!isset($_SESSION['done']))
{
$face = trim($_POST['pace']);
//store $face votes to db
$_SESSION['done'] = true;
}
}
?>
<form method="post">
<input type="hidden" name="face" value="1" />
<input type="image" src="image1.gif" />
</form>
<form method="post">
<input type="hidden" name="face" value="2" />
<input type="image" src="image2.gif" />
</form>
答案 3 :(得分:1)
第一个问题是你想要防止的攻击是什么?如果只是为了确保有人在提交答案之前加载页面,您需要:
然而,这并不能阻止有人写机器人多次投票。
如果你想确保一个真正的人已经点击了每个负载,你需要做上面的事情并且还包括验证码来验证点击的人是否是人。