безопасность php и маркировка записей mysql для удаления с помощью ссылки html (GET)

Просто интересно, думают ли люди, что для веб-сайта безопасно использовать html-ссылку, позволяющую пользователям отмечать свои документы для удаления со своей защищенной страницы учетной записи?

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

http://www.examplewebsitename.com/delete_document.php?docid=5

Сценарий delete_document проверяет, является ли параметр docid числовым, затем проверяет, используя переменную сеанса их идентификатора пользователя, установленного при входе в систему, действительно ли этот человек создал этот документ, просмотрев идентификатор пользователя создателя документа. Если они являются создателем, то он помечает документ для удаления, в противном случае, если текущий зарегистрированный человек не был создателем, он не отмечает документ для удаления и возвращает страницу с ошибкой.

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


person user1052096    schedule 07.03.2012    source источник
comment
Старайтесь никогда не делать ничего, что меняет состояние, с помощью запроса GET.   -  person Cheekysoft    schedule 07.03.2012


Ответы (3)


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

  1. Семантическая причина, GET, согласно http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html, должен быть идемпотентным методом the side-effects of N > 0 identical requests is the same as for a single request.

  2. Более склонны к CSRF, кто-то может разместить ссылку на http://www.examplewebsitename.com/delete_document.php?docid=5 и превратите ссылку в безобидный вид привязка
    <a href="http://www.examplewebsitename.com/delete_document.php?docid=5">Click here for free puppy!</a>
    Если по какой-либо причине пользователь войдет в систему и щелкнет ссылку на своем доверенном веб-сайте, он непреднамеренно заставит пользователя удалить документ.

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

person Andreas Wong    schedule 07.03.2012
comment
Чтобы добавить к этому ответу, есть еще более серьезный и простой способ использовать это с помощью CSFR: <img src="http://www.examplewebsitename.com/delete_document.php?docid=5" /> - пользователю просто нужно просмотреть сайт с этим изображением - person MMM; 07.03.2012

Обычно я советую не использовать запросы GET для манипулирования данными, потому что это не то, для чего GET предназначен, если вы придерживаетесь спецификации HTTP. Если вы хотите полностью расслабиться, вам следует использовать запрос DELETE, но в большинстве случаев я использую страницу подтверждения с формой, которая выполняет запрос POST для удаления записи.

Прочтите Почему следует удалять с помощью HTTP POST или DELETE, а не GET? по причинам, лежащим в основе этого. Об этом уже спрашивали раньше в некоторых других контекстах.

person ChrisR    schedule 07.03.2012

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

В частности, было установлено соглашение о том, что методы GET и HEAD НЕ ДОЛЖНЫ иметь значение выполнения каких-либо действий, кроме извлечения. Эти методы следует считать «безопасными». Это позволяет пользовательским агентам особым образом представлять другие методы, такие как POST, PUT и DELETE, чтобы пользователь был осведомлен о том, что запрашивается возможно небезопасное действие.

Пользовательские агенты ожидают, что этот метод не будет иметь побочных эффектов:

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

Это означает, что GET не должен вызывать никаких изменений состояния на стороне сервера.

Другая причина, но довольно незначительная, заключается в том, что GET легче использовать этот POST, поскольку существует больше способов инициировать запрос GET, чем запускать запрос POST. Но независимо от того, какой метод, оба уязвимы для атак CSRF.

Поэтому, если вы убедитесь, что защищены от CSRF, вы может даже использовать GET для запросов на изменение состояния.

person Gumbo    schedule 07.03.2012