Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> get и post-запросы, В чем опасность использования get 
V
    Опции темы
serious
Дата 3.6.2007, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 15.2.2003
Где: Пенза

Репутация: 1
Всего: 1



Привет!

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

P.S. почитал несколько статей по этой теме, но до конца так и не понял :(


--------------------
Я знаю то, что ничего не знаю, а некоторые не знают и этого.
PM MAIL   Вверх
y3u
Дата 3.6.2007, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 9.9.2006
Где: Москва

Репутация: 5
Всего: 13



да уж, явная проверка на гет - это жесть smile Нафига это нужно, в сервлете есть же метод doPost... Модифицировать что-то в БД надо только по POST запросам, т.к. гет подразумевает вывод информации, а пост - ввод...


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
serious
Дата 3.6.2007, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 15.2.2003
Где: Пенза

Репутация: 1
Всего: 1



Нет, я понимаю, что get это вывод, post это изменение. В чем будет проблема, если вместо post в данном случае использовать get?

Добавлено через 3 минуты и 43 секунды
Цитата(y3u @  3.6.2007,  05:17 Найти цитируемый пост)
в сервлете есть же метод doPost...

У меня нет такого метода, я использую Struts и вся обработка выполняется в execute().


--------------------
Я знаю то, что ничего не знаю, а некоторые не знают и этого.
PM MAIL   Вверх
y3u
Дата 3.6.2007, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 9.9.2006
Где: Москва

Репутация: 5
Всего: 13



Цитата(serious @  3.6.2007,  14:23 Найти цитируемый пост)
В чем будет проблема, если вместо post в данном случае использовать get?


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


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
serious
Дата 3.6.2007, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 15.2.2003
Где: Пенза

Репутация: 1
Всего: 1



А если ввести некий UID операции?


--------------------
Я знаю то, что ничего не знаю, а некоторые не знают и этого.
PM MAIL   Вверх
kkorsakoff
Дата 3.6.2007, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.10.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 14



y3u, а на основании чего сделано такое разделение на get и post? где-то вывод производится на post (например, получение какой-либо статистики), а где то изменение на get. Тем более

1. get имеет известное ограничение на длину
2. клик по ссылке ты post'ом не отправишь
3. да просто кому что удобнееsmile

ИМХО, не надо так разделять эти запросы, а абстрагироваться от этого всего.


А если необходимо защитить от F5, то тут только применением паттерна token. Кстати вроде struts имеет встроенную поддержку этого, но честно скажу - не применял

http://www.javaworld.com/javaworld/javatip...javatip136.html

Это сообщение отредактировал(а) kkorsakoff - 3.6.2007, 16:16
PM MAIL WWW ICQ   Вверх
COVD
Дата 3.6.2007, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Запрос get и, соответственно, все его параметры, виден в адресном поле браузера, а также эта строка сохраняется в логах (в логе Томката, например). Поэтому пару login - password через get обычно не передают. 

Параметры get могут быть только текстовые.  
PM MAIL   Вверх
Maksym
Дата 4.6.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 14
Всего: 62



Цитата(serious @  3.6.2007,  13:01 Найти цитируемый пост)
Понятно, что нелогично использовать get-запрос для изменения БД, но хотелось бы получить более конкретные обоснования этой проблемы. 

Разделение на post и get запросы было придумано для четкого отделения запросов на изменение данных от запросов на получение информации. Конечно, можно написать как угодно (точно так же как можно не использовать, например, mvc паттерн), но правила хорошего тона web-разработки требуют такого разделения. Нелогично, к примеру, когда пользователь может сохранить в избранном (намеренно или случайно) или переслать другу линк, вызывающий изменения профиля пользователя и переводящий после этого на страницу "ваш профиль изменен".
С другой стороны, плохо когда информация о том в какой раздел каталога перешел пользователь передается через post запрос, в этому случае сохраненный в избранное линк может привести куда угодно, но не на выбранный каталог (так как информация из тела запроса само собой не сохранися браузером).
Была неплохая статья Применимость методов GET и POST, но что-то сейчас не открывается, может заработает еще.. Но резюмировалась она тем же: get -- для навигации, post -- для модификации.

PM MAIL   Вверх
kkorsakoff
Дата 4.6.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.10.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 14



Несомненно, какие-то рекомендации каждый сам для себя выработал. Но они скорее "работают" на клиентской стороне, то есть по большому счету выбирает верстальщик. Просто я бы так четко не разделял: get для отображения, post для модификации. В реальной жизни эти два подхода постоянно перемешиваются, что сложно выделить четкое правило. Опять же мое ИМХО. А ссылку будем ждать, пока не откроетсяsmile

Серверу должно быть все равно, что за запрос к нему пришел (ну кроме file upload есс-но). Или не так? И проверка на GET это как уже сказали - "жесть":)
PM MAIL WWW ICQ   Вверх
Maksym
Дата 4.6.2007, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 14
Всего: 62



Цитата(kkorsakoff @  4.6.2007,  16:55 Найти цитируемый пост)
В реальной жизни эти два подхода постоянно перемешиваются, что сложно выделить четкое правило.

Цитата(kkorsakoff @  4.6.2007,  16:55 Найти цитируемый пост)
Серверу должно быть все равно, что за запрос к нему пришел

Согласен smile Описанное мной -- рекомендация, не больше.

PM MAIL   Вверх
y3u
Дата 4.6.2007, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 9.9.2006
Где: Москва

Репутация: 5
Всего: 13



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


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
Maksym
Дата 5.6.2007, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 14
Всего: 62



y3u
Однозначных правил не бывает, даже если из придумывали умные дяди, всегда слепо следовать их инструкциям не стоит. Они хороши для общего случая. Тогда когда нет веских и взвешенных оснований делать по другому.
PM MAIL   Вверх
Stampede
Дата 5.6.2007, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 24
Всего: 144



Цитата(Maksym @  5.6.2007,  04:34 Найти цитируемый пост)
Однозначных правил не бывает, даже если из придумывали умные дяди, всегда слепо следовать их инструкциям не стоит.


Согласен с Maksym. Насчет POST: разумеется, такие вещи как сабмит формы лучше делать постом. Но, к сожалению, если на все действия, которые меняют состояние на сервере (а в современных веб-приложениях это практически любые действия) вешать кнопки вместо ссылок, то будет не очень-то юзабельно.

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

Так что тут важно не только выбрать подходящий метод выполнения запроса, но и применять всякие отработанные схемы защиты от дурака пользователя от самого себя. Например, PRG (POST-Redirect-Get), страницы подтверждений и пр.



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0739 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.