SlideShare a Scribd company logo
MetaForm:  неизбыточная работа с метаданными  HTML- форм Метаданные формы, защита от подделки, валидация Дмитрий Котеров, архитектор и главный разработчик  MoiKrug.ru  компания Яндекс [email_address]
Что такое метаданные?   Данные то, что ввели array(   &quot;lastname&quot; => &quot; Пупкин &quot;,   &quot;gender&quot;  => &quot;m&quot; ) Метаданные &quot;данные о структуре данных&quot; array(   &quot;lastname&quot; => array(   &quot;type&quot; =>  &quot;text&quot;,   &quot;caption&quot; => &quot; Фамилия &quot;,   &quot;dbfield&quot; => &quot;p_lastname&quot;   ),   &quot;gender&quot; => array(   &quot;type&quot; =>  &quot;single&quot; ,   &quot;dbfield&quot; => &quot;p_gender&quot; ,   &quot;elements&quot; => array(   &quot;m&quot;  = > &quot; Муж &quot;,   &quot;f&quot; => &quot; Жен &quot;,   )   ) ) Фамилия:  <input type=&quot;text&quot; name=&quot;lastname&quot; /> Пол:  <input type=&quot;radio&quot; name=&quot;gender&quot; value=&quot;m&quot; />  Муж <input type=&quot;radio&quot; name=&quot;gender&quot; value=&quot;f&quot; />  Жен
Типы полей с точки зрения метаданных Текст <input type=&quot;text&quot;>, <input type=&quot;hidden&quot;>, <textarea> Файл (закачка) <input type=&quot;file&quot;> Единичный выбор <select></select> <input type=&quot;radio&quot;>… Множественный выбор (аналогично) <select multiple></select> <input type=&quot;checkbox&quot;>… Действие <input type=&quot;submit&quot;>, <input type=&quot;image&quot;>
Web-  или  G UI- приложение   Web- приложение &quot;Размазанность&quot; Двойная валидация ( PHP, JS) Нет доверия метаданным  ( неявная структура  POST) Дублирование метаданных в дизайне и обработчике Косвенный вызов обработчиков GUI- приложение Централизованная обработка Непосредственная валидация &quot;Доверие&quot; метаданным  (все в рамках одной оконной формы) Форма &quot;рисуется&quot; и обрабатывается в едином месте Мгновенные обработчики кнопок Рисовальщик формы Пользователь GUI- приложение: форма + обработчики событий Пользователь HTML POST errors Обработчик формы
&quot;Размазанность&quot; :  неявные зависимости от метаданных Различные компоненты системы Структура БД HTML- представление формы Рисовальщик (код начального заполнения формы) Обработчик (код приема данных и записи в БД) Серверный валидатор ( PHP) Клиентский валидатор  (JS) Как их объединяют, чтобы обойти проблему Структура БД HTML- представление формы + клиентский валидатор Рисовальщик + обработчик + серверный валидатор
Централизация метаданных Репозиторий метаданных Подход  MetaForm –  похож на  GUI -формы HTML +  JS Рисовальщик + обработчик  +  валидатор Metadata HTML + Metadata Генератор по явно выделенным метаданным сложность доработки неуниверсальность Рисовальщик +   модификатор + обработчик  +  валидатор БД БД
MetaForm:  шаблон + метаданные Метаданные объединены с представлением (как в  GUI) Автоматическое извлечение метаданных Использование возможностей  HTML  для привязки заглавия Назначение валидаторов (серверных + клиентских) Назначение произвольных мета-атрибутов Отправка формы &quot;на себя&quot; Обработка  HTML  &quot;на лету&quot;: Легкость адаптации старых проектов Совместимость с любыми имеющимися  framework- ами Неизбыточность (&quot;а добавим-ка новое поле&quot;) <label for=&quot;l&quot;> Фамилия </label> :  <input type=&quot;text&quot;    name=&quot;lastname&quot;    id=&quot;l&quot;    meta:dbfield=&quot;p_lastname&quot;   meta:validator=&quot;filled&quot;  /> Пол: <label for=&quot;m&quot;> Муж </label> <input type=&quot;radio&quot;    name=&quot;gender&quot;    value=&quot;m&quot;    id=&quot;m&quot;    meta:dbfield=&quot;p_gender&quot; /> <label for=&quot;f&quot;> Жен </label> <input type=&quot;radio&quot;    name=&quot;gender&quot;    value=&quot;f&quot;    id=&quot;f&quot;/>
MetaForm : традиционная обработка Обработка формы: распаковка метаданных проверка цифровой подписи валидация сохранение сообщений об ошибках сохранение сообщений в сессии &quot;редирект на себя&quot; Подготовка метаданных извлечение метаданных из  HTML  формы, &quot;чистка&quot; формы упаковка и цифровое подписывание метаданных вставка метаданных в  hidden- поле Отрисовка формы: вставка данных из  $_POST  ( FormPersister) назначение клиентских валидаторов привязка сообщений об ошибках к полям switch ($m->process()) {   //  Простой показ формы.   case  &quot;INIT&quot; :   $_POST = < достать из БД >;   break;   //  Нажата кнопка.   case  &quot; имя_кнопки &quot; :   $meta = $m->getMetadata();   < записать в БД >;   < запомнить сообщ. успеха >;   < редирект на себя >;   break;     //  Произошла ошибка валидации } < показать ошибки и сообщения >; < заполнить поля из  $_POST>; < подготовить метаданные >; < отрисовать форму >;
MetaForm : событийная обработка switch-case  хорошо подходит при переводе старой системы на  MetaForm событийная модель удобна для построения  CMF //  Контроллер  Page class Page {   function init() {   //  Простой показ формы.   $_POST = < достать из БД >;   }   function  имя_кнопки()  {   //  Нажата кнопка.   $meta = $m->getMetadata();   < записать в БД >;   < запомнить сообщ. успеха >;   < редирект на себя >;   } } <!--  Шаблон  Page --> < показать ошибки и сообщения >; < заполнить поля из  $_POST>; < подготовить метаданные >; < показать форму >;
Цифровая подпись метаданных Пусть  metadata  –  упакованные метаданные: сервер хранит секретный ключ  key signed =  metadata  + &quot;-&quot; + md5( metadata  +  key ) в  hidden- поле записывается  signed проверка:  md5(left(signed) +  key ) == right(signed) Необходимо хранить  key   в секрете!
Защита от подделки форм Принудительная валидация: hidden- поля должны быть константными: <input type=&quot;hidden&quot; name=&quot;a&quot; value=&quot;b&quot;> =>  $_POST['a'] = 'b' выбранный элемент из  single  или  multiple  должен содержаться в списке: <select name=&quot;s&quot;><option value=&quot;v&quot;> текст </select> =>  $_POST['s'] = 'v' форма послана  именно  тому скрипту, который указан в ее атрибуте  action : <form action=&quot;script&quot;> =>  REQUEST_URI ~ &quot;script&quot; DB constraints  никто не отменял! Отмена принудительной валидации <input type=&quot;hidden&quot; meta:dynamic> =>   поле можно заполнять на  JavaScript
Защита: &quot;лишние&quot; поля формы Провоцирование неявной зависимости от метаданных Имеем форму: <input type=&quot;text&quot; name=&quot;person[firstname]&quot; /> <input type=&quot;text&quot; name=&quot;person[lastname]&quot; /> Хакер добавляет &quot;лишнее&quot; поле: <input type=&quot;text&quot; name=&quot;person[firstname]&quot; /> <input type=&quot;text&quot; name=&quot;person[lastname]&quot; /> <input type=&quot;hidden&quot; name=&quot;person[is_admin]&quot; value=&quot;1&quot; /> Результат:  изменение   неожиданного поля MetaForm:  неизвестные поля считаются подделкой
Неизбыточная валидация Привязка валидаторов <input meta:validator=&quot;filled email&quot;> В полю привязано имя валидатора : вызов валидатора на стороне сервера ( PHP) function validator_ название ($value, $metadata) автопривязка валидатора на стороне клиента ( JavaScript) validator_ название  = function(value, metadata) Привязка нескольких валидаторов <input meta:validator=&quot;filled email&quot;> Валидаторы должны быть ортогональными Передача параметров валидаторам Пароль:  <input type=&quot;password&quot;   name=&quot;pass&quot;   meta:validator=&quot;password_match&quot;    meta:match_field=&quot;confirm&quot;  /> Еще раз : <input type=&quot;password&quot; name=&quot;confirm&quot; />
Привязка сообщений об ошибках Ошибка валидации привязана к полю формы Метаданные содержат  ID  (координаты)   всех полей Привязка ошибки к элементу на  JavaScript  (&quot;модель светофора&quot;) Фокус на ошибочном элементе Извлечение текста ошибки по имени валидатора (языковые константы ) 'validator_email' => ' Поле  &quot;%s&quot;  должно содержать корректный  E-mail!' Подстановка имен полей ( sprintf)
Резюме Плюсы   подхода  MetaForm: Родство с  GUI- программированием Неизбыточность Прозрачность для любого  framework- а Легкость адаптации существующих проектов Прозрачность для  HTML- верстальщика Минусы: Смешение логики метаданных и логики представления  ( характерно и для  GUI)
Приходите к нам работать! МойКруг.ру теперь – сервис Яндекса Мы расширяем свою команду! Открыты вакансии для: верстальщиков со знанием  Smarty отличных  PHP- программистов опытных БД-разработчиков ( PostgreSQL, Oracle) JavaScript- программистов Ждем Ваши резюме на  http://moikrug.ru/hire/

More Related Content

PDF
Sell More, Pay Less: Drive Conversions with Unrelated Keywords Edit Presentation
PPTX
Branch: An interactive, web-based tool for building decision tree classifiers
PPTX
call outs thoughts style 2 powerpoint presentation templates
PDF
6ª Manoca do Canto Gaúcho Fase Local
PDF
Manreet Deol Bangles
PPTX
Search Intelligence - Social Media e Search Marketing - Proxxima 2011
PPT
Communication Online
Sell More, Pay Less: Drive Conversions with Unrelated Keywords Edit Presentation
Branch: An interactive, web-based tool for building decision tree classifiers
call outs thoughts style 2 powerpoint presentation templates
6ª Manoca do Canto Gaúcho Fase Local
Manreet Deol Bangles
Search Intelligence - Social Media e Search Marketing - Proxxima 2011
Communication Online

Viewers also liked (14)

PPTX
A Vendinha Da Esquina
PDF
Measuring The Immeasurable - Visitor Engagement
PDF
Local, city democracy changing in the digital era. By Tomasz Nadolny. #RockitWAW
PDF
Storytelling with Shapes
PDF
Observing the-everyday jay.doc (6)
PPTX
Uce filosofia janeth andrade
PDF
KFIE Innovator Bios
PDF
5 ways to increase sales effectiveness
PPTX
Uce filosofia janeth andrade
PDF
Apresentacao Comite de Metricas IAB - Maio/2012
DOC
Apostila 05
PDF
December 2016 bio gas+ newsletter
PPT
Passeioda8seriefazzendaparkhotel
PDF
City Tours Celendin
A Vendinha Da Esquina
Measuring The Immeasurable - Visitor Engagement
Local, city democracy changing in the digital era. By Tomasz Nadolny. #RockitWAW
Storytelling with Shapes
Observing the-everyday jay.doc (6)
Uce filosofia janeth andrade
KFIE Innovator Bios
5 ways to increase sales effectiveness
Uce filosofia janeth andrade
Apresentacao Comite de Metricas IAB - Maio/2012
Apostila 05
December 2016 bio gas+ newsletter
Passeioda8seriefazzendaparkhotel
City Tours Celendin
Ad

Similar to Html Metaform дмитрий котеров (20)

PPT
Разработка сложного каталога средствами CMF Bitrix
PPT
Js Http Request дмитрий котеров
PPT
Введение в Django
PPSX
Введение в Windows Communication Foundation
PPT
Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference
PPT
Zen Coding
PPTX
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ODP
XML Schema
PPT
Web весна 2013 лекция 4
PPTX
Структура html документа
PPT
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
PPT
семинар I context
PPTX
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
PPTX
Metadata + JavaScript = ♥ Применение метаданных ViewModel для конфигурировани...
PDF
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
ODP
Работа с платежными системами в Django (Paypal, WebMoney)
PPT
Django шахрай. версия 4
ODP
XML Magic
PPTX
Реализация шаблонов корпоративных приложений в Magento
PPT
Энюшки
Разработка сложного каталога средствами CMF Bitrix
Js Http Request дмитрий котеров
Введение в Django
Введение в Windows Communication Foundation
Выступление Андрея Сумина, Mail.Ru Group, на High Performance Conference
Zen Coding
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
XML Schema
Web весна 2013 лекция 4
Структура html документа
ZFConf 2010: jQuery and Dojo Toolkit JavaScript-frameworks Integration with Z...
семинар I context
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
Metadata + JavaScript = ♥ Применение метаданных ViewModel для конфигурировани...
SECON'2014 - Павел Щеваев - Метаданные и автогенерация кода
Работа с платежными системами в Django (Paypal, WebMoney)
Django шахрай. версия 4
XML Magic
Реализация шаблонов корпоративных приложений в Magento
Энюшки
Ad

More from Media Gorod (20)

PDF
Itogi2013
PDF
Moneytree rus 1
PDF
Iidf market watch_2013
PDF
E travel 2013 ufs-f
PPTX
Travel shop 2013
PPT
Kozyakov pay u_e-travel2013
PDF
13909772985295c7a772abc7.11863824
PPT
As e-travel 2013
PDF
Ishounkina internet research-projects
PPTX
E travel13
PPTX
Orlova pay u group_290813_
PDF
Ep presentation (infographic 2013)
PDF
Iway slides e-travel_2013-11_ready
PPTX
Data insight e-travel2013
PDF
Электронное Правительство как Продукт
PPTX
Lean мышление / Специфика Lean Startup
PDF
Глобальный взгляд на мобильный мир (Nielsen)
PDF
Как россияне используют смартфоны (Nielsen)
PDF
Мобильный интернет в России (MailRuGroup)
PDF
Meta Mass Media
Itogi2013
Moneytree rus 1
Iidf market watch_2013
E travel 2013 ufs-f
Travel shop 2013
Kozyakov pay u_e-travel2013
13909772985295c7a772abc7.11863824
As e-travel 2013
Ishounkina internet research-projects
E travel13
Orlova pay u group_290813_
Ep presentation (infographic 2013)
Iway slides e-travel_2013-11_ready
Data insight e-travel2013
Электронное Правительство как Продукт
Lean мышление / Специфика Lean Startup
Глобальный взгляд на мобильный мир (Nielsen)
Как россияне используют смартфоны (Nielsen)
Мобильный интернет в России (MailRuGroup)
Meta Mass Media

Html Metaform дмитрий котеров

  • 1. MetaForm: неизбыточная работа с метаданными HTML- форм Метаданные формы, защита от подделки, валидация Дмитрий Котеров, архитектор и главный разработчик MoiKrug.ru компания Яндекс [email_address]
  • 2. Что такое метаданные? Данные то, что ввели array( &quot;lastname&quot; => &quot; Пупкин &quot;, &quot;gender&quot; => &quot;m&quot; ) Метаданные &quot;данные о структуре данных&quot; array( &quot;lastname&quot; => array( &quot;type&quot; => &quot;text&quot;, &quot;caption&quot; => &quot; Фамилия &quot;, &quot;dbfield&quot; => &quot;p_lastname&quot; ), &quot;gender&quot; => array( &quot;type&quot; => &quot;single&quot; , &quot;dbfield&quot; => &quot;p_gender&quot; , &quot;elements&quot; => array( &quot;m&quot; = > &quot; Муж &quot;, &quot;f&quot; => &quot; Жен &quot;, ) ) ) Фамилия: <input type=&quot;text&quot; name=&quot;lastname&quot; /> Пол: <input type=&quot;radio&quot; name=&quot;gender&quot; value=&quot;m&quot; /> Муж <input type=&quot;radio&quot; name=&quot;gender&quot; value=&quot;f&quot; /> Жен
  • 3. Типы полей с точки зрения метаданных Текст <input type=&quot;text&quot;>, <input type=&quot;hidden&quot;>, <textarea> Файл (закачка) <input type=&quot;file&quot;> Единичный выбор <select></select> <input type=&quot;radio&quot;>… Множественный выбор (аналогично) <select multiple></select> <input type=&quot;checkbox&quot;>… Действие <input type=&quot;submit&quot;>, <input type=&quot;image&quot;>
  • 4. Web- или G UI- приложение Web- приложение &quot;Размазанность&quot; Двойная валидация ( PHP, JS) Нет доверия метаданным ( неявная структура POST) Дублирование метаданных в дизайне и обработчике Косвенный вызов обработчиков GUI- приложение Централизованная обработка Непосредственная валидация &quot;Доверие&quot; метаданным (все в рамках одной оконной формы) Форма &quot;рисуется&quot; и обрабатывается в едином месте Мгновенные обработчики кнопок Рисовальщик формы Пользователь GUI- приложение: форма + обработчики событий Пользователь HTML POST errors Обработчик формы
  • 5. &quot;Размазанность&quot; : неявные зависимости от метаданных Различные компоненты системы Структура БД HTML- представление формы Рисовальщик (код начального заполнения формы) Обработчик (код приема данных и записи в БД) Серверный валидатор ( PHP) Клиентский валидатор (JS) Как их объединяют, чтобы обойти проблему Структура БД HTML- представление формы + клиентский валидатор Рисовальщик + обработчик + серверный валидатор
  • 6. Централизация метаданных Репозиторий метаданных Подход MetaForm – похож на GUI -формы HTML + JS Рисовальщик + обработчик + валидатор Metadata HTML + Metadata Генератор по явно выделенным метаданным сложность доработки неуниверсальность Рисовальщик + модификатор + обработчик + валидатор БД БД
  • 7. MetaForm: шаблон + метаданные Метаданные объединены с представлением (как в GUI) Автоматическое извлечение метаданных Использование возможностей HTML для привязки заглавия Назначение валидаторов (серверных + клиентских) Назначение произвольных мета-атрибутов Отправка формы &quot;на себя&quot; Обработка HTML &quot;на лету&quot;: Легкость адаптации старых проектов Совместимость с любыми имеющимися framework- ами Неизбыточность (&quot;а добавим-ка новое поле&quot;) <label for=&quot;l&quot;> Фамилия </label> : <input type=&quot;text&quot; name=&quot;lastname&quot; id=&quot;l&quot; meta:dbfield=&quot;p_lastname&quot; meta:validator=&quot;filled&quot; /> Пол: <label for=&quot;m&quot;> Муж </label> <input type=&quot;radio&quot; name=&quot;gender&quot; value=&quot;m&quot; id=&quot;m&quot; meta:dbfield=&quot;p_gender&quot; /> <label for=&quot;f&quot;> Жен </label> <input type=&quot;radio&quot; name=&quot;gender&quot; value=&quot;f&quot; id=&quot;f&quot;/>
  • 8. MetaForm : традиционная обработка Обработка формы: распаковка метаданных проверка цифровой подписи валидация сохранение сообщений об ошибках сохранение сообщений в сессии &quot;редирект на себя&quot; Подготовка метаданных извлечение метаданных из HTML формы, &quot;чистка&quot; формы упаковка и цифровое подписывание метаданных вставка метаданных в hidden- поле Отрисовка формы: вставка данных из $_POST ( FormPersister) назначение клиентских валидаторов привязка сообщений об ошибках к полям switch ($m->process()) { // Простой показ формы. case &quot;INIT&quot; : $_POST = < достать из БД >; break; // Нажата кнопка. case &quot; имя_кнопки &quot; : $meta = $m->getMetadata(); < записать в БД >; < запомнить сообщ. успеха >; < редирект на себя >; break; // Произошла ошибка валидации } < показать ошибки и сообщения >; < заполнить поля из $_POST>; < подготовить метаданные >; < отрисовать форму >;
  • 9. MetaForm : событийная обработка switch-case хорошо подходит при переводе старой системы на MetaForm событийная модель удобна для построения CMF // Контроллер Page class Page { function init() { // Простой показ формы. $_POST = < достать из БД >; } function имя_кнопки() { // Нажата кнопка. $meta = $m->getMetadata(); < записать в БД >; < запомнить сообщ. успеха >; < редирект на себя >; } } <!-- Шаблон Page --> < показать ошибки и сообщения >; < заполнить поля из $_POST>; < подготовить метаданные >; < показать форму >;
  • 10. Цифровая подпись метаданных Пусть metadata – упакованные метаданные: сервер хранит секретный ключ key signed = metadata + &quot;-&quot; + md5( metadata + key ) в hidden- поле записывается signed проверка: md5(left(signed) + key ) == right(signed) Необходимо хранить key в секрете!
  • 11. Защита от подделки форм Принудительная валидация: hidden- поля должны быть константными: <input type=&quot;hidden&quot; name=&quot;a&quot; value=&quot;b&quot;> => $_POST['a'] = 'b' выбранный элемент из single или multiple должен содержаться в списке: <select name=&quot;s&quot;><option value=&quot;v&quot;> текст </select> => $_POST['s'] = 'v' форма послана именно тому скрипту, который указан в ее атрибуте action : <form action=&quot;script&quot;> => REQUEST_URI ~ &quot;script&quot; DB constraints никто не отменял! Отмена принудительной валидации <input type=&quot;hidden&quot; meta:dynamic> => поле можно заполнять на JavaScript
  • 12. Защита: &quot;лишние&quot; поля формы Провоцирование неявной зависимости от метаданных Имеем форму: <input type=&quot;text&quot; name=&quot;person[firstname]&quot; /> <input type=&quot;text&quot; name=&quot;person[lastname]&quot; /> Хакер добавляет &quot;лишнее&quot; поле: <input type=&quot;text&quot; name=&quot;person[firstname]&quot; /> <input type=&quot;text&quot; name=&quot;person[lastname]&quot; /> <input type=&quot;hidden&quot; name=&quot;person[is_admin]&quot; value=&quot;1&quot; /> Результат: изменение неожиданного поля MetaForm: неизвестные поля считаются подделкой
  • 13. Неизбыточная валидация Привязка валидаторов <input meta:validator=&quot;filled email&quot;> В полю привязано имя валидатора : вызов валидатора на стороне сервера ( PHP) function validator_ название ($value, $metadata) автопривязка валидатора на стороне клиента ( JavaScript) validator_ название = function(value, metadata) Привязка нескольких валидаторов <input meta:validator=&quot;filled email&quot;> Валидаторы должны быть ортогональными Передача параметров валидаторам Пароль: <input type=&quot;password&quot; name=&quot;pass&quot; meta:validator=&quot;password_match&quot; meta:match_field=&quot;confirm&quot; /> Еще раз : <input type=&quot;password&quot; name=&quot;confirm&quot; />
  • 14. Привязка сообщений об ошибках Ошибка валидации привязана к полю формы Метаданные содержат ID (координаты) всех полей Привязка ошибки к элементу на JavaScript (&quot;модель светофора&quot;) Фокус на ошибочном элементе Извлечение текста ошибки по имени валидатора (языковые константы ) 'validator_email' => ' Поле &quot;%s&quot; должно содержать корректный E-mail!' Подстановка имен полей ( sprintf)
  • 15. Резюме Плюсы подхода MetaForm: Родство с GUI- программированием Неизбыточность Прозрачность для любого framework- а Легкость адаптации существующих проектов Прозрачность для HTML- верстальщика Минусы: Смешение логики метаданных и логики представления ( характерно и для GUI)
  • 16. Приходите к нам работать! МойКруг.ру теперь – сервис Яндекса Мы расширяем свою команду! Открыты вакансии для: верстальщиков со знанием Smarty отличных PHP- программистов опытных БД-разработчиков ( PostgreSQL, Oracle) JavaScript- программистов Ждем Ваши резюме на http://moikrug.ru/hire/

Editor's Notes

  • #2: Меня зовут… Я работаю в должности … компании .. Доклад называется …