Является ли небезопасным использование $ _GET для обновления данных из базы данных? - PullRequest
2 голосов
/ 29 мая 2011

Является ли небезопасным использование $ _GET для обновления / удаления данных из таблицы MySQL ??

Я не могу использовать $ _POST, так как требуется использовать <form> tag

Например:

  <a href="status.php?approve='123'>Unapprove</a>
 <?php   
    if (isLoggedIn() && groupId() == 2) {
     if (isset($_GET['id']) && is_numeric($_GET['id']) {
      $query = $db->prepare("UPDATE table set unapprove='1' where id = :id");
      $query->bindParam(':id', $_GET['id'], PDO::PARAM_STR);
      $query->execute();
     }
    }
?>

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

Ответы [ 4 ]

5 голосов
/ 29 мая 2011

Несмотря на то, что вы не подвергаетесь SQL-инъекциям, то, что вы делаете, небезопасно, поскольку может подделка межсайтовых запросов .

Подумайте о том, как войти на свой сайт и посетить другой с таким изображением:

<img src="yoursite.com/admin/status.php?approve=123" />

В идеале всегда используйте POST для неидемпотентных запросов.

И, во всяком случае, вам нужно добавить секретный токен, который зависит как от сессии, так и от ссылки:

href="status.php?approve=123&amp;token=[random_stuff]"

Кроме того, '123' в ссылке, вероятно, должно быть 123.

1 голос
/ 29 мая 2011

Это небезопасно само по себе, если вы проверяете и дезинфицируете ввод. Ввод является вводом, но помните, что все вводные данные злые. Подумайте и о разрешениях. Как вы контролируете доступ к этому?

Границы проверки числовых данных. Из приведенного выше кода можно вставить числа, которые, вероятно, находятся за пределами диапазона.

Также, в порядке хорошей практики, я всегда пропускаю все через mysqli_real_escape_string() (или, если хотите, эквивалент ООП).

1 голос
/ 29 мая 2011

Нет, это небезопасно.

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

Используйте <form>.

0 голосов
/ 29 мая 2011

Для вашей базы данных не имеет значения, используете ли вы $ _GET или $ _POST, и это небезопасно, поскольку вы проверяете, вошел ли пользователь в систему. Однако это небезопасно. Зарегистрированный пользователь может иметь URL-адрес удаления в своей истории просмотра, что может привести к удалению ресурсов при последующем посещении этой страницы, случайно выбрав их в своей истории.

Лучше размещать такие данные.

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

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