Форма POST или сессии? - PullRequest
1 голос
/ 07 января 2011

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

Я хотя бы использовал скрытое поле в форме, однако это можно легко изменить с помощью плагинов, таких как firebug:

<form method="post" action="blah">
<input type="hidden" name="item_id" value="<?php echo $item_id; ?>">
<!-- other form data here -->
<input type="submit" name="submit">
</form>

Или просто используя сессию:

$_SESSION['item_id'] = $item_id

Существует ли безопасный способ отправки данных элемента в форме?

Edit: Это после проверки, ... Я реализую некоторую защиту XSS (токены форм и т. Д.). Причина, по которой я спрашивал, состояла в том, чтобы просто знать, что такое лучшая практика.

Я хотел бы сделать что-то вроде

$_SESSION['item_id'] = $id //this is set when they visit the current item

тогда в форме есть скрытое поле:

<input type="hidden" name="item_id" value="<?php echo $id?>">

Наконец, проверьте, совпадает ли сессия с идентифицированным идентификатором:

if ($_SESSION('item_id') !== $item_id) //the value posted in the form
{
   die('There\'s got to be a morning after
       If we can hold on through the night
       We have a chance to find the sunshine
       Let\'s keep on looking for the light');
}

Однако после прочтения некоторых ваших комментариев, я думаю, это плохая идея?

Честно говоря (@Surreal Dreams): не так уж сложно, если они меняют идентификатор, я, как я уже сказал, я просто искал лучшую практику.

Приветствие.

Ответы [ 6 ]

8 голосов
/ 07 января 2011

Использование сеанса, как вы предложили, облажало бы случаи, когда (1) посетитель открывает несколько разных статей на нескольких вкладках и (2) пытается написать ответ на любой вкладке, кроме той, которая была открыта последней. Пользователь может даже написать два ответа одновременно на разных вкладках; Я иногда делаю это на StackOverflow. Веб-разработчики так легко забывают, что у сегодняшних посетителей может быть открыто несколько вкладок браузера. На самом деле, мы больше не используем IE6.

Решением было бы сделать $_SESSION['item_id'] массивом недавно просмотренных идентификаторов статей, но тогда вы не сможете помешать некоторым пользователям Firebug (или любому другому технически подкованному человеку) ответить на ранее просмотренную статью. Добавление временных ограничений тоже ничего не изменит.

Но почему кто-то намеренно меняет идентификатор сообщения, на которое он отвечает, кроме как для тролля или спама на сайте? И если кто-то действительно хочет испортить ваш сайт, он может легко обойти любую защиту, заставив своего бота запросить соответствующую страницу непосредственно перед публикацией спам-комментария. Вам было бы гораздо выгоднее инвестировать в лучший генератор CSRF-токенов, спам-фильтр, ограничитель скорости и т. Д.

1 голос
/ 07 января 2011

У вас может быть такая форма

<?
$saltedhash = md5("MYSEED"+$item_id;)
?>

<form method="post" action="blah">
<!-- form data here -->
<input type="hidden" name="item_id" value="<? echo $item_id ?>">
<input type="hidden" name="item_hash" value="<? echo $saltedhash ?>">
<input type="submit" name="submit">
</form>

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

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

1 голос
/ 07 января 2011

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

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

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

Обратите внимание, что, возможно, вы пытаетесь решить не ту проблему здесь;почему бы не подтвердить, если у человека есть доступ, чтобы оставить комментарий к сообщению, которое он комментирует?Если у вас есть доступ, то вам следует разрешить комментировать - если вы хотите подделать идентификатор и сделать свой комментарий не тем, что пост ... ну, это в основном ваша проблема.Я имею в виду, что пользователь также может перейти к другому сообщению и сделать там неправильный комментарий вручную ... так в чем же проблема?

1 голос
/ 07 января 2011

Используйте скрытое поле.

Если пользователь изменяет DOM, говоря, что это ответ на другой комментарий, и что? Это влияет только на них.

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

1 голос
/ 07 января 2011

Честно говоря, вы, вероятно, в порядке, используя скрытый элемент формы. Если вы действительно беспокоитесь о том, чтобы кто-то изменил его, вы всегда можете base64() кодировать его, чтобы его было сложнее изменить.

Однако вы всегда можете установить переменную сеанса на странице, а затем при отправке формы вызвать это значение обратно.

Форма

<?
session_start();

//Make a random ID for this form instance
$form_id = rand(1, 500);

//Set session variable for this form
$_SESSION[$form_id]['item_id'] = $item_id;
?>

<form method="post" action="process.php?n=<?=$form_id?>">
<!-- form data here -->
<input type="submit" name="submit">
</form>

Процесс

<?
session_start();

//Process only if the number submitted matches the SESSION variable
if(array_key_exists($_GET['n'], $_SESSION) {
  //Process tasks
  echo $_SESSION[$_GET['n']['item_id'];

  //Unset session variable when done processing
  unset($_SESSION[$_GET['n']);
}
?>
0 голосов
/ 07 января 2011

Использование $ _SESSION для хранения идентификатора записи является идеальным решением, поскольку оно не позволяет изменять это значение.

При этом, каковы преимущества для того, кто это делает?Кроме того, во многих системах комментариев есть процесс утверждения, который требует от администратора утверждения комментария перед публикацией.

Но да, я бы рекомендовал придерживаться значения сеанса.

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