php MySQL CRUD: безопасно ли я удаляю?

Я пытаюсь определить самый безопасный способ или наилучшую практику удаления в CRUD с использованием php и MySQL. Меня учили создавать ссылку <a href="delete.php=?{$id}">Delete</a> и заставлять delete.php запускать мой метод delete() для идентификатора, переданного в переменной $_GET.

  1. Если я позволю веб-сканеру увидеть эту страницу, не сможет ли он удалить всю базу данных, если он просканирует каждую ссылку удаления на каждой странице?

  2. Не мог ли кто-то, кто каким-то образом вычислил страницу, которая вызывает delete(), вручную загрузить URL-адрес с любым номером, который он хотел, в $_GET и удалить записи?

  3. Лучше никогда ничего не удалять через CRUD, а добавить в таблицу столбец «Удалено» и сделать так, чтобы он выглядел так, как если бы он был удален для пользователя?

  4. Я просто параноик?


person Jonathan Eckman    schedule 05.05.2012    source источник
comment
Вы вовсе не параноик — все это обоснованные опасения.   -  person jedwards    schedule 05.05.2012
comment
Компания, в которой я работаю, все скрывает. Но я думаю, что короткий ответ - использовать аутентификацию для таких вещей...   -  person Kyle Macey    schedule 05.05.2012
comment
Пример проблемы №1   -  person jprofitt    schedule 05.05.2012


Ответы (5)


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

да.

Не мог ли кто-то, кто каким-то образом вычислил страницу, которая вызывает метод delete(), вручную загрузить URL-адрес с любым числом, которое он хотел, в $_GET и удалить записи?

да.

Не лучше ли никогда ничего не удалять с помощью CRUD, а добавить в таблицу столбец «Удалено» и сделать так, чтобы он выглядел так, как если бы он был удален для пользователя?

Если вы действительно хотите удалить его, имхо, лучше удалить.

Я просто параноик?

Нисколько.


Если у вас только что был скрипт delete.php, который имел что-то вроде следующего (игнорируя CRUD atm и говоря о MySQL):

$q = "DELETE FROM mytable WHERE row = $_GET['id']";
$r = mysql_query($q);

Тогда да, ваши первые две проблемы на самом деле связаны с тем, что произойдет. Паук, который наткнется на эти ссылки, приведет к удалению записей БД, а злоумышленник, обнаруживший ссылки, может аналогичным образом удалить строки из БД.

Обычно это решается двумя способами:

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

  2. В сценарии delete.php убедитесь, что пользователю разрешено удалять строки. Большую часть времени выполняется путем проверки переменных сеанса, которые были установлены при входе в систему (например, if($_SESSION['can_delete'] != true){ die('Insufficient Privileges'); }).

Хотя полезно не предлагать ссылку на delete.php людям, у которых она не должна быть, вам необходимо явным образом проверить разрешения в сценарии delete.php, если вы хотите, чтобы он был безопасным.

person jedwards    schedule 05.05.2012

Прочтите Паука Судьбы.

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

Таким образом, ваш метод delete() должен делать больше, чем просто удаление (или скрипт контроллера, который вызывает delete()). Всегда проверяйте авторизацию пользователя перед выполнением любого изменения или удаления.

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

person Michael Berkowski    schedule 05.05.2012

  1. да. Это случилось с большим количеством людей, Google сканирует страницу «удалить» и удаляет их содержимое. Я помню, что в блоге была действительно хорошая запись об этом, но, похоже, не могу ее найти.

  2. Да, это вполне возможно и очень легко сделать. Вот почему вам нужно построить систему авторизации. Это означает, что прежде чем что-либо будет выполнено, система должна проверить, разрешено ли пользователю делать то, что он запросил, прежде чем выполнять действие.

  3. Опять же, это зависимости. Если данные больше не нужны, то обязательно удалите их и избавьтесь от них. Но если вы хотите поддерживать какое-то «восстановление», просто отметьте элемент как удаленный.

  4. No :)

person F21    schedule 05.05.2012

Одним из простых способов было бы инициировать сеанс, например:

$somevar = 'abc123'
$_SESSION['secureDelete'][$id] = $somevar;

а затем распечатайте это:

<a href="delete.php?id={$id}&action={$somevar}">Delete</a>

Когда вы хотите удалить файл, вы проверяете, существует ли этот сеанс с этим значением $somevar:

if (isset($_SESSION['secureDelete'][$id]) && $_SESSION['secureDelete'][$id] == $_GET['action']) {
  deleteFunction($_GET['id']);
}
person Marian Zburlea    schedule 05.05.2012

Попробуйте использовать метод POST и скрыть идентификатор, должно быть так

<form action="" method="POST">
<input type="hidden" name="id" value="<?= $id; ?>"/> 
<button type="submit">Delete</button> 
</form>
person Jake Pucan    schedule 06.05.2014