Использование куки для ограничения доступа - PullRequest
3 голосов
/ 22 июня 2011

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

Вот основной сценарий, который я разработал:

<?php
if(isset($_POST['accept'])) {
  setcookie ('accept', '1');
  header('Location: http://www.the_page_that_was_requested');
  exit();
} elseif(isset($_POST['decline'])) {
  setcookie('accept', '0');
  exit();
}
?>

и форма:

<form action='' method ='post'>
<ul>
    <li> <input type= 'radio' name = 'accept' value = 'accept' /> I accept </li>
    <li> <input type= 'radio' name = 'decline' value = 'decline' /> I decline </li>
    <li> <input type = 'submit' value = 'Submit' name = 'submit' /> </li>
</ul>

Возможно, я не был достаточно ясен с моим первым постом:

Сайт, для которого я хочу использовать это веб-комикс, размещенный на WP.У комикса есть «зрелый» контент (насилие, язык, и я хотел использовать cookie только как механизм, позволяющий читателю «согласиться» с тем фактом, что он будет просматривать такой контент. Да, я подумал об использовании $ _SESSIONчтобы сделать это, но в этом случае, если кто-то хочет «подделать» свою готовность просматривать такой контент, мне было бы все равно, если у него есть доступ к cookie.

Что касается безопасности, я простоЯ хочу убедиться, что моя форма безопасна, и не открывать мой сайт для какой-либо простой эксплойт.

Ответы [ 2 ]

3 голосов
/ 22 июня 2011

Любая конфиденциальная информация никогда не должна храниться в cookie, включая флаги безопасности / разрешений.

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

1 голос
/ 22 июня 2011

Используйте взамен сессий . Информация о сеансе хранится на веб-сервере, а не на локальном клиенте.

<?php
sessions_start();
if(isset($_POST['accept'])) {
  $_SESSION['accept'] = TRUE;
}

Что касается реферера, HTTP_REFERER не сохраняется через SSL (что вам следует делать, если ваша форма собирает конфиденциальную информацию).

Если вы используете SSL, вы можете сделать что-то вроде этого:

  • Страница ссылается на вашу форму:
    <a href="myform.php?r=<?=urlencode("http://your.url")?>">My form</a>

  • Ваша форма добавляет скрытый ввод со значением r:
    <input type="hidden" name="r" value="<?=$_GET['r']?>" />

Если вы не используете SSL (не рекомендуется), вы можете сделать что-то вроде этого:

  • Ваша форма добавляет скрытый ввод со значением HTTP_REFERER:
    <input type="hidden" name="r" value="<?=urlencode($_SERVER['HTTP_REFERER'])?>" />

В любом случае, ваш POST-скрипт будет использовать это значение POST r для перенаправления:
header("Location: ".urldecode($_POST['r']));

Затем вы можете проверить переменную сеанса в любом другом месте на любой другой странице вашего домена:

<?php  
session_start();
if($_SESSION['accept'] == TRUE) {
  //they have access
}
?>
...