Определенно возможно реализовать довольно надежное решение. Но это должно быть сделано на стороне сервера.
Основное правило безопасности: вы не доверяете данным клиента.
Переместите все свои чеки в PHP и сделайте свой JavaScript таким же тупым, как
$(".vote").click(function(e) {
$.post('/vote.php', vote_data, function(result) {
// update UI according to returned result
}
}
Однако обычно все еще выполняют проверки на клиенте, но для повышения удобства использования (отметьте обязательные поля формы, которые не были заполнены) или уменьшите нагрузку на сервер (не отправляя заведомо неполные данные). Эти клиентские чеки предназначены для удобства пользователя, а не для вашей безопасности.
Ответ на ваш обновленный вопрос :
Если вы храните полный журнал того, когда какой пользователь проголосовал за тот или иной вопрос, тогда да, довольно легко предотвратить многократное голосование (когда пользователь может голосовать за одну и ту же вещь несколько раз). Предполагая, конечно, что анонимные голоса не допускаются.
Но если у вас есть популярный сайт, этот журнал может стать довольно большим и стать проблемой. Некоторые системы пытаются уйти, отключив голосование по старым статьям (и удалив соответствующие записи в журнале).
Что если кто-то намеренно попытается взломать меня?
Существуют различные типы атак, которые может выполнять злонамеренный пользователь.
CSRF ( подделка межсайтовых запросов )
В статье перечислены некоторые методы предотвращения атаки. Современный Ruby on Rails имеет встроенную защиту, включенную по умолчанию. Не знаю, как это в мире PHP.
ClickJacking
Эта атака обманывает пользователей, заставляя их нажимать на то, что они не думают. Например, они могут нажать «Воспроизвести видео», но сайт перехватит этот щелчок и вместо этого разместит сообщение на стене пользователя.
В Интернете также есть несколько статей.