防止作弊

时间:2012-01-12 10:49:08

标签: html cookies ip

我正在制作一个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/

4 个答案:

答案 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)

第一个问题是你想要防止的攻击是什么?如果只是为了确保有人在提交答案之前加载页面,您需要:

  • 在页面中生成一个唯一标记,该标记是提交表单的一部分(隐藏)
  • 提交时,请检查该令牌是否有效且之前未使用过

然而,这并不能阻止有人写机器人多次投票。

如果你想确保一个真正的人已经点击了每个负载,你需要做上面的事情并且还包括验证码来验证点击的人是否是人。