Предотвращение обмана - PullRequest
0 голосов
/ 12 января 2012

В настоящее время я делаю аналог facemash и обнаружил, что его очень легко обмануть ^^ Если вы наберете это несколько раз в браузере: http://domain.com/rate.php?winner=1&loser=2,, вы сможете сделать фотографию №1 победителем. Я знаю, что это можно предотвратить с помощью куки и ip-блокировки, но я не знаю, как именно. Пожалуйста, помогите мне. Спасибо!

Это пример (не мой): http://facemash.moefelt.dk/

UPD При необходимости могу предоставить исходный код.

UPD 1 rate.php http://jsfiddle.net/6xLR6/ index.php http://jsfiddle.net/AvF4M/1/

Ответы [ 4 ]

1 голос
/ 12 января 2012

Первый вопрос: какую атаку вы хотите предотвратить?Если вы просто хотите убедиться, что кто-то загружает страницу перед отправкой ответа, вам необходимо:

  • Создать на странице уникальный токен, который является частью формы отправки (скрыто)
  • При отправке убедитесь, что токен действителен и ранее не использовался

Однако это не мешает кому-то писать бота, чтобы голосовать много раз.

Если вы хотите убедиться, что подлинный человек нажал на каждую загрузку, вам нужно будет выполнить вышеизложенное и добавить капчу, чтобы убедиться, что человек, нажимающий кнопку, является человеком.

1 голос
/ 12 января 2012

Не используйте параметры запроса. Пользователь POST запрос на отправку данных на сервер.

1 голос
/ 12 января 2012

Вы можете попробовать это:

<?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>
1 голос
/ 12 января 2012

Вы можете просто использовать $ _POST instread из $ _GET, чит будет сложнее!

куки могут быть сохранены в кеше, но если пользователь чистит их каждый раз, это может быть бесполезно.

РЕДАКТИРОВАТЬ:

<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']; }
...

Я думаю, что вы получили все, что вы хотите прямо сейчас; -)

...