Как я могу проверить, не был ли сайт напрямую доступен? - PullRequest
1 голос
/ 07 сентября 2011

У меня есть сценарий голосования. Хорошо работает.

Но у меня есть небольшая проблема. Я не хочу, чтобы люди напрямую заходили на страницу подачи голосов (страницу, где голосование отправляется в БД). Я хочу, чтобы они достигли его только по определенной ссылке.

Мои ссылки для голосования:

<form>
<INPUT id="voteup1" type="BUTTON" VALUE="Vote it up!" ONCLICK="window.location.href='rankup.php?rankid=<? echo $id1; ?>'"> 
<INPUT id="votedown1" type="BUTTON" VALUE="Vote it down!" ONCLICK="window.location.href='rank.php?rankid=<? echo $id1; ?>'"> 
</form>

$id1 - для определения страницы, за которую проголосовал пользователь. (Важно, когда голос добавлен в базу данных)

Я не хочу, чтобы люди напрямую обращались в rankup.php и rank.php. Как я мог предотвратить это?

Ответы [ 3 ]

3 голосов
/ 07 сентября 2011

HTTP не имеет состояния. - это отсутствие «прямого / косвенного» доступа к странице - каждый запрос отключен от предыдущих.

В PHP есть механизм для преодоления этого ограничения: Сеансы , которые, в свою очередь, используют куки.

Итак, вы можете установить переменную сеанса, чтобы использовать в качестве флага: «can-voice-now», на своей странице, где у вас будут кнопки голосования, и запретитьголосование, если это не установлено.

Псевдокод на вашей странице с кнопками:

set_voting_variable_for($poll_identifier);

Псевдокод на rankup.php:

if (!is_voting_variable_set($poll_identifier)) {
  // redirect away
} else {
  // register the vote
}

О, и обратите внимание, чтостраницы, которые заставляют вещи происходить (так называемые "неидемпотентные" действия - например, увеличение количества голосов) не должны быть доступны через GET (так как GET зарезервирован для , показывая вещи без их изменения - «идемпотентные» действия): вы можете создать форму, в которой вместо нее будет использоваться POST.

2 голосов
/ 07 сентября 2011

Лучше всего использовать куки.Для голосования разрешается использовать только те значения файлов cookie, которые были сгенерированы вами в течение определенного периода времени.В противном случае было бы легко генерировать значения файлов cookie.

Вы можете легко сделать это с помощью сеансов PHP.

Вы также должны знать, что выполнение действия (изменение подсчета голосов) наGET запрос не рекомендуется.GET переменные следует использовать только при получении данных с определенным параметром.Вместо этого используйте POST.В противном случае, каждый раз, когда какой-нибудь поисковый робот наталкивается на ваш скрипт голосования, голоса меняются.

1 голос
/ 07 сентября 2011

Вы можете использовать переменную реферера PHP $_SERVER['HTTP_REFERER'], чтобы проверить, что ссылающийся URL принадлежит вам. Но вы не можете полагаться на эти 100%, потому что эта информация не может быть отправлена, и, поскольку она является частью заголовка HTTP, пользователь может изменить ее, если пожелает.

Сессии, как предлагается, могут быть хорошим способом сделать это. Я бы выбрал сеансы вместо файлов cookie, потому что пользователи могут отключить свои файлы cookie на вашем сайте - и файлы cookie редактируются пользователями. Сессии могут редактировать только те, у кого есть доступ к вашему серверу (обычно это общий хостинг).

Также я не согласен с тем, как вы это делаете. В настоящее время вы полагаетесь на то, что у пользователя включен JavaScript в их браузерах. Некоторые пользователи не имеют его, некоторые браузеры не поддерживают его. Некоторые пользователи даже отключают перенаправления страниц таким образом.

Лично вместо двух сценариев я бы использовал один сценарий, например:

<form action="rank.php" method="post">
<input type="submit" value="Vote up!" />
<input type="submit" value="Vote down!" />
</form>

В rank.php вы определяете, какая из двух кнопок была нажата, и соответственно запускаете функцию. Вы можете использовать переменную сеанса для хранения идентификатора элемента, по которому они будут голосовать, а затем считывать этот идентификатор из сеанса (хотя обязательно избегайте его), чтобы гарантировать, что идентификатор не может быть изменен пользователем в последний раз минут.

Надеюсь, это даст вам некоторые идеи.

...