Первая линия защиты - печенье.
По сути, вы устанавливаете куки на их машине и отключаете голосование, если оно присутствует.
setcookie('cookiename', 'voted=1');
// and later
if(isset($_COOKIE['cookiename']) && $_COOKIE['cookiename'] = "voted=1")
{
// error
}
Это избавляет от вызова базы данных, который вам может понадобиться, чтобы подтвердить свое голосование. Это хорошая идея, чтобы сохранить это на месте, потому что это похоже на кэширование: чем меньше попаданий в базу данных, тем лучше.
Вторая линия защиты - ограничение IP. По сути, вы должны проверить журнал IP-адресов в вашей базе данных и посмотреть, проголосовали ли они недавно.
mysql_query('INSERT INTO TABLE (`IP_ADDR`, `TIME`) VALUES("'.$_SERVER['REMOTE_ADDR'].'", "'.time().'")');
// and later
$results = mysql_query('SELECT IP_ADDR FROM TABLE WHERE IP_ADDR="'.$_SERVER['REMOTE_ADDR'].'"');
if(mysql_num_rows($results) != 0)
{
// error
}
Превращение всего вашего сценария во что-то вроде
if(isset($_COOKIE['cookiename']) && $_COOKIE['cookiename'] = "voted=1")
{
die("You have voted recently.");
}
$results = mysql_query('SELECT IP_ADDR FROM TABLE WHERE IP_ADDR="'.$_SERVER['REMOTE_ADDR'].'"');
if(mysql_num_rows($results) != 0)
{
die("You have voted recently");
}
//Do Voting Stuff Here
vote($_GET['vote']);
// Record the vote.
setcookie('cookiename', 'voted=1');
mysql_query('INSERT INTO TABLE (`IP_ADDR`, `TIME`) VALUES("'.$_SERVER['REMOTE_ADDR'].'", "'.time().'")');
Вы также должны добавить время истечения срока действия и тому подобное, но основной момент этого есть.