Эффективный способ сохранить идентификатор таблицы в форме, чтобы пользователь не мог перезаписать другую запись таблицы - PullRequest
1 голос
/ 28 июня 2010

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

<form action="goToThisPage.php" method="get">
    <input type="hidden" name="blogID" value="4" />
    <input type="text" name="blogTitle" value="" />
    <textarea name="blogContent"></textarea>
    <input type="submit" name="submit" value="Update Blog" />
</form>

Теперь для этого пользователя для идентификатора блога установлено значение 4, поэтому при обновлении записи он обновит таблицу блога с идентификатором 4. Теперь, используя firebug или другие методы подмены, пользовательможет изменить этот идентификатор на что-то вроде 8 и обновить запись 8, которая может быть чужой записью.

Как мне предотвратить это?До сих пор я думал о двух методах, задаваясь вопросом, что вы считаете лучшей идеей (или предложите другой).

  1. Кодируйте идентификатор случайной строкой, а затем декодируйте строку после отправки, получая правильный идентификатор.
  2. Оставьте его как числовой номер, а затем проверьте, чтобы после обновления убедиться, что он записан по запросу базы данных.

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

Заранее спасибо

Ответы [ 4 ]

2 голосов
/ 28 июня 2010

При создании веб-приложения вы будете счастливы, если предположите следующее:

  1. клиенту (то есть браузеру) нельзя доверять.Предположим, что любые данные, отправленные на ваш сервер, были отправлены плохим парнем.

  2. приложение не имеет состояния.Вы не можете предположить, что только потому, что вы предполагали, что запрос X будет предшествовать запросу Y, чтобы они произошли таким образом.Если вам требуется, чтобы аутентифицированный пользователь обновлял сообщение в блоге, и вы требуете, чтобы пользователь был авторизован для этого, проверьте эти требования в коде, который обновляет сообщения в блоге.Вероятно, у вас не будет проблем со слишком большим количеством запросов к базе данных, и если вы это сделаете, вы можете решить эту проблему, когда будете это делать.

0 голосов
/ 28 июня 2010

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

Я опишу еще несколько деталей реализации.

Предположения:

  • В таблице блога есть столбец ownerId, который содержит userId того пользователя, которому принадлежит / создал сообщение.
  • У вас есть какая-то система входа в систему пользователя и где-то хранится идентификатор пользователя в сеансе.

Самый простой способ убедиться, что пользователь обновляет только свои собственные сообщения, - это просто проверить заранее:

<?PHP
$blog = get_blog_by_id($_POST['blogId']);
if ($blog['ownerId'] != $_SESSION['userId']){
   die("You're a BAD MAN.  Cut it out!");
}
$blog['blogContent'] = $_POST['blogContent'];
$blog['blogTitle'] = $_POST['blogTitle'];

update_blog($blog); //escapes any strings, and runs an update.

Если вы действительно не хотите извлекать запись блога из базы данных перед обновлением, по любой причине, вы всегда можете сделать что-то вроде этого:

<?PHP
$title = mysql_real_escape_string($_POST['blogTitle']);
$content = mysql_real_escape_string($_POST['blogContent']);
$id = mysql_real_escape_string($_POST['blogId']);
$userId = $_SESSION['userId'];

$sql = "UPDATE blog SET blogTitle='$title', blogContent='$content' WHERE blogId = '$id' AND ownerId = $user_id";

mysql_query($sql);

Это спасает вас при первоначальном поиске, но в основном молчит, если текущий пользователь не владеет блогом, поскольку условие WHERE будет соответствовать нулю записей.

0 голосов
/ 28 июня 2010

Есть много способов подойти к этому, некоторые из них:

  1. Хэш (sha1 или аналогичный) секретная строка вместе с идентификатором, при подтверждении подтверждения хэш.Если он не совпадает, отклоните.

  2. Сохраните все блоги, к которым у пользователя есть доступ, в сеансе var, после отправки проверьте, находится ли отправленный блог в массиве сеанса, если не отклоните.

  3. Поскольку вы сказали, что хотите ограничить запросы к базе данных, вы можете просто добавить другой критерий where в ваш запрос на обновление.Фактический запрос, конечно, будет зависеть от вашей схемы базы данных.

    ОБНОВЛЕНИЕ блогов SET ... snip ... WHERE BLOG id = FORM_SUBMITTED_ID AND blog.owner = CURRENT_USER

    Это обеспечит обновление только в том случае, если пользователь является фактическим владельцем.

0 голосов
/ 28 июня 2010

Делать что-либо на уровне HTML - пустая трата времени.PHP просто не должен позволять это, то есть проверять, действительно ли запись принадлежит пользователю, который внес изменения.

...