MVC, загрузка POST data в объекты модели

6yrop

Вот тут описаны Over\Under-Posting Problem:
 
What happens if the bad guy includes "Approved=true" in the form post? The model binder will happily set the Approved property to true. That's definitely not what you intended! It actually gets worse: if the bad guy guesses your entity object is called Blog, he might try posting values into fields like "Blog.Body" and actually be able to overwrite the body of the blog post. This is a potential disaster!
http://bradwilson.typepad.com/blog/2010/01/input-validation-...
  
Решение, которое предлагает ASP.NET MVC, конечно, полное говно... неудобно писать и майтейнить такие white списки и view-specific models:
 
Users who bind to ORM objects should, at a bare minimum, use white-lists with [Bind] or (Try)UpdateModel to ensure that no unwanted data ends up in their objects, but it would be much safer in the long run to use view-specific models.
  

1. Интересно, как этот вопрос решается в MVC Web фрайворках на других платформах?
2. Почему бы просто не подписывать электронной подписью список key-ев для post data? Т.е. при отправке на клиента подписываем список key-ев, а при последующем получении post-а проверяем, что этот список остался неизменным. Это покроет 99% реальных сценариев с post запросами.
3. Да, кстати, в всеми обсираемых Web Forms-ах с эти было все тип-топ :), слой контролов с этим отлично справлялся. Конечно, Web Forms-ы говно. Но хорошее то можно было и позаимствовать :).

ava3443

2. Почему бы просто не подписывать электронной подписью список key-ев для post data? Т.е. при отправке на клиента подписываем список key-ев, а при последующем получении post-а проверяем, что этот список остался неизменным. Это покроет 99% реальных сценариев с post запросами.
ты хоть примерно себе представляешь сколько миллисекунд добавит в каждый запрос электронная подпись? это из пушки по воробьям :)

okis

Может простой hmac имеется в виду?

ava3443

и чего с ним делать, с простым hmac? хранить для каждой отданной формы её hmac, затем сверять то что пришло POST с тем, что сохранили? тоже вариант в принципе, но какой-то всё-таки индусский подход, на мой взгляд, не?

pilot

1. Интересно, как этот вопрос решается в MVC Web фрайворках на других платформах?
В нормальных веб-фрэймворках такой проблемы нет.

Dasar

>2. Почему бы просто не подписывать электронной подписью список key-ев для post data? Т.е. при отправке на клиента подписываем список key-ев, а при последующем получении post-а проверяем, что этот список остался неизменным. Это покроет 99% реальных сценариев с post запросами.
так если ты знаешь список "хороших" имен при отправке, то почему ты поэтому списку ты не можешь проверить при получении?

6yrop

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

6yrop

хранить для каждой отданной формы её hmac, затем сверять то что пришло POST с тем, что сохранили?
Не, как раз хранить на сервере ничего не хочется. Хочется оставаться state less. Если хранить, то и подписывать не надо, можно просто сам список key-ев хранить. Суть подписи в том, что она ездит вместе с формой.

6yrop

так если ты знаешь список "хороших" имен при отправке, то почему ты поэтому списку ты не можешь проверить при получении?
Ха, в том то и проблема, как это закодировать? WebForms-ы это делали, а MVC out of the box не может. Суть в том, что должна быть некоторая часть source code-а, которая отрабатывает и при рендеренге ответа и при обработке последующего POST-а. В WebForms таким кодом был markup с контролами, а в MVC рендеринг и обработку POST-а разнесли полностью, и поэтому получили обсуждаемую проблему.
То есть удобство кодирования получили, а в секюрити потеряли. Вот и предлагается решить проблему секюрити через шифрование. А решать проблему за счет труда девелопера это не гуманно :).

pilot

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

6yrop

В нормальных веб-фрэймворках такой проблемы нет.
Проблема общего характера, дело не в реализации, а в самом подходе MVC. Как я написал в ответе на предыдущий пост:

Суть в том, что должна быть некоторая часть source code-а, которая отрабатывает и при рендеренге ответа и при обработке последующего POST-а.
 
Т.е. имеется всего три альтернативы:
1. некоторый общий код, использующийся и на рендеренге и при обработке соответствующего POST-а,
2. шифрование/подпись,
    2.2. хранение key-ев на сервере,
3. тупой труд девелопера.
Вот интересно что выбирают в MVC-фраймворках на других платформах?

pilot

Вот интересно что выбирают в MVC-фраймворках на других платформах?
Все вместе.
По модели строится формочка, в которую можно включать не все поля, в формочку добавляется защита от csrf.
В итоге имеем лишний код рендеринга и валидации и <тупой> (читай "не enterprise-way") труд девелопера. :smirk:

6yrop

Все вместе.
т.е. там всё еще хуже? :shocked:

pilot

т.е. там всё еще хуже? :shocked:
Ну хз, во фреймворках для быдлокодинга может и лучше, пусть они и не enterprise, а я-то про нормальные говорю.

6yrop

По модели строится формочка...
да и у нас есть такие извращенцы http://en.wikipedia.org/wiki/Naked_Objects_MVC
Но
These two patterns have been considered as antithetical. However, Trygve Reenskaug (the inventor of the MVC pattern) has made..

как бы там этот чувак не словоблудил, разные эти паттерны по сути.

ava3443

Я, кстати, не представляю, но попробую угадать. Одну?
SHA-1 + RSA с 1024-битным ключом, схема PKCS 1.5: в среднем порядка 15 миллисекунд на каждую операцию. Это на сервере годовалой свежести (середина 2009) с двумя 4-ядерными Intel Xeon на борту, под нагрузкой, в много потоков.

pilot

Что ты сказать-то хотел? Мысли твоей я не понял.
Naked-извращенцы есть только у вас (точнее, те кто недоделанность своего фрэймворка считает особым видом извращения а ты спрашивал про MVC-фрэймворки, я тебе про них и ответил:
Очевидно что по модели можно достаточно стандартным образом генерировать форму + печатанием нескольких букв можно из этой формы некоторые поля исключить. Так что naked object это доведенный до примитивизма (чтобы не писать <тупой> код) MVC.

pilot

SHA-1 + RSA с 1024-битным ключом, схема PKCS 1.5: в среднем порядка 15 миллисекунд на каждую операцию. Это на сервере годовалой свежести (середина 2009) с двумя 4-ядерными Intel Xeon на борту, под нагрузкой, в много потоков.
Слишком много умных слов, они меня только расстраивают.
Я правильно понимаю что этот способ гораздо проще и быстрее работает?

pilot

Слишком много умных слов, они меня только расстраивают.
Я правильно понимаю что этот способ гораздо проще и быстрее работает?
Что-то я недодумал, еще посоображаю :)

ava3443

Я правильно понимаю что этот способ гораздо проще и быстрее работает?
да, и гораздо проще, и гораздо быстрее, т.к. это и не подпись :)
Informally, we call this process "signing the request," and we call the output of the HMAC algorithm the "signature" because it simulates the security properties of a real signature.

pilot

да, и гораздо проще, и гораздо быстрее, т.к. это и не подпись :)
Это я знаю.
Так вот что я хотел сказать: для задачи в первом посте треда настоящая подпись и не нужна.

ava3443

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

6yrop

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

6yrop

Очевидно что по модели можно достаточно стандартным образом генерировать форму
нифига это не очевидно, по одной простой причине, что нет четкого общепринятого понятия "модель". Например, в ASP MVC прямолинейно заявляют
What is an MVC model?
An MVC model contains all of your application logic that is not contained in a view or a controller. ...
http://www.asp.net/mvc/tutorials/understanding-models-views-...

т.е. просто и незатейливо, модель это все то что не контроллер и не вью.
Очевидность генерации формочки по модели будет иметь место, если вы расскажите каким source code-ом вы делаете модель. Как, каким кодом, вы закладываете инфу о том как выглядит формочка? Практически ведь абсолютно пофиг как называть куски кода модель или виью или еще как.
Да, и у меня есть подозрение, что в вашей Java это какие-нибудь XML-ки. И нам такого не надо. И даже хорошо, что проблема у нас есть, а решения нет. Уж лучше отсутствие решения вовсе, чем решение на XML-ках, поскольку если бы оно было, то понабежала бы всякая словоблудистая пидоросня, восхваляющая это энтерпрайз “решение”.

pilot

нифига это не очевидно, по одной простой причине, что нет четкого общепринятого понятия "модель". Например, в ASP MVC прямолинейно заявляют
Вшмышле в вашем недофрэймворке нет такого понятия? Вот тут даже на русском написано.
Очевидность генерации формочки по модели будет иметь место, если вы расскажите каким source code-ом вы делаете модель. Как, каким кодом, вы закладываете инфу о том как выглядит формочка? Практически ведь абсолютно пофиг как называть куски кода модель или виью или еще как.

Ну как бы MVC не зря называется MVC а не ABC — потому как за этими названиями есть некий смысл :smirk:
Да, и у меня есть подозрение, что в вашей Java это какие-нибудь XML-ки. И нам такого не надо. И даже хорошо, что проблема у нас есть, а решения нет. Уж лучше отсутствие решения вовсе, чем решение на XML-ках, поскольку если бы оно было, то понабежала бы всякая словоблудистая пидоросня, восхваляющая это энтерпрайз “решение”.

Какие-то эротические фантазии. Не знаю что там в Жаве, а уж каким боком сюда XML относится боюсь даже представить. :grin:

6yrop

ахуенно, это ж насколько надо не уважать собеседника, чтобы на 20 сообщении давать ссылку MVC из вики
Оставить комментарий
Имя или ник:
Комментарий: