Спрашивали? Отвечаем - Школа MODX. Hibernate. Основные принципы работы с сессиями и транзакциями

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

Событие – это взаимодействие пользователя с контентом, которое можно отслеживать независимо от просмотров страниц или экранов. Скачивания файлов, клики по мобильным объявлениям, использование гаджетов, элементов Flash и AJAX, воспроизведение видео – все эти действия можно отслеживать в качестве событий.

Содержание

Просмотр данных о событиях

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

Чтобы просмотреть отчеты о событиях, выполните следующие действия:

  1. Выберите нужное представление .
  2. Откройте Отчеты .
  3. Выберите Поведение > События .

Компоненты событий

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

  • Категория
  • Действие
  • Ярлык (необязательно, но рекомендуется)
  • Значение (необязательно)

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

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

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

В этом случае в отчетах будет только одна категория – Videos (Видеозаписи) – и вы увидите сводные показатели взаимодействия пользователей со всеми элементами этого видеообъекта.

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

С другой стороны, можно создать отдельные категории для видеозаписей разных типов: одну – для кинофильмов, другую – для музыкальных видеоклипов, и т. д. Можно также создать отдельную категорию для скачивания видео:

  • Видео – фильмы
  • Видео – музыка
  • Скачивание видео

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

Объектная модель отслеживания событий обеспечивает максимальную гибкость, но все же мы рекомендуем сначала продумать структуру отчетов, а затем выбирать названия категорий. Если вы будете повторно использовать название категории, не используйте другие варианты названия. Например, если для отслеживания видео вы добавите категорию Video, а затем в названии по ошибке используете множественное число (Videos), то у вас будет две разных категории для отслеживания видео. Кроме того, если вы измените название категории объекта, который уже отслеживается, данные по исходной категории не будут изменены. Поэтому в отчетах показатели одного элемента страницы будут представлены в двух разных категориях.

Действие

Обычно параметр "Действие" используется для обозначения отслеживаемого события или взаимодействия, связанного с веб-объектом. Например, с помощью этого параметра можно отслеживать в одной категории Videos (Видеозаписи) несколько событий:

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

Ярлыки

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

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

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

  • Названия действий должны соответствовать данным отчета. При отслеживании событий показатели для действий с одним названием из двух разных категорий объединяются. Например, если действие под названием Click (Клик) используется в категории Downloads (Скачивание) и в категории Videos (Видеозаписи), то показатели для него в отчете "Основные действия" отображаются по всем взаимодействиям с этим названием. Подробные данные для действия Click (Клик) по категориям можно просмотреть на следующем уровне отчета. Однако неосмотрительное использование действия Click (Клик) в отслеживании различных событий снижает эффективность работы с отчетами. Если вы отслеживаете большое количество событий на сайте, выбирайте для действий имена, которые отражают категории отслеживаемых данных. Например, название Click (Клик) можно использовать для взаимодействия с гаджетами, а для действий с проигрывателем – названия Play (Воспроизведение), Pause (Пауза) и Stop (Стоп).
  • Используйте глобальные названия действий, чтобы получать сводные и раздельные данные по взаимодействиям пользователей. Например, можно использовать название Play (Воспроизведение) в категории Videos (Видеозаписи) для всех видеозаписей на сайте. Тогда отчет "Основные действия" будет содержать сводные данные о действии "Воспроизведение", и вы сможете сравнить это событие с другими событиями в видеозаписях, например "Пауза" или "Стоп".

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

  • "Действие" не всегда означает действие. В качестве значения этого компонента можно использовать любую строку. В некоторых случаях название события или действия не очень информативно, поэтому для отслеживания других элементов можно использовать параметр действия. Например, если требуется отслеживать скачивание файлов на странице, в качестве параметра действия для события скачивания можно указать тип файла документа. В этом случае отчеты по категории Downloads (Скачивание) будут разбиты по типам файлов (PDF, DOC, XLS).
  • Количество уникальных событий увеличивается только за счет уникальных действий. Каждое взаимодействие пользователя с объектом, помеченным определенным названием действия, регистрируется как одно уникальное событие, связанное с этим названием. Любое дополнительное взаимодействие с тем же триггером действия в рамках одного сеанса не влияет на подсчет уникальных событий, связанных с этим действием. Даже если пользователь выполнит действие с этим названием на другом объекте, количество уникальных событий не изменится.

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

Значения

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

Значение – это численная величина. Значения всех событий суммируются в отчете (см. раздел "Неявный подсчет" ниже). В отчете также определяется среднее значение для категории. В примере выше событие вызывается для действия "Время загрузки видео" сразу после завершения загрузки видеозаписи. Название видео указывается в ярлыке, а значение увеличивается с каждой загрузкой. После этого можно определить среднее время загрузки для всех действий "Время загрузки видео" из категории "Видеозаписи". Предположим, что у вас 5 уникальных загрузок видеозаписей с сайта со следующими значениями времени загрузки в секундах:

В этом случае среднее время загрузки в отчете подсчитывается так:
  • Сеансы с событиями: 5.
  • Значение: 53.
  • Среднее значение: 10,6.

Отрицательные значения не поддерживаются.

События без взаимодействия

Термин "без взаимодействия" относится к необязательному логическому параметру, который может быть передан методу, отправляющему событие. С помощью этого параметра вы можете задать, как должен определяться показатель отказов для страниц на сайте, на которых используется отслеживание событий. Предположим, у вас на главной странице есть встроенное видео и вы хотите узнать показатель отказов для этой страницы. Что следует считать отказом? Важно ли для вас взаимодействие с роликом на главной странице? Если да, то такое взаимодействие должно учитываться при подсчете показателя отказов. Сеансы, включающие только главную страницу с нажатием на видео, не должны считаться отказами. Если же вы хотите узнать показатель отказов для главной страницы независимо от взаимодействия с видео, тогда при подсчете отказов вам нужно исключить взаимодействия с видео.

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

Неявный подсчет

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

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

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

Отслеживание событий для категории Videos (Видеозаписи)

Действие Ярлык: Gone With the Wind (Унесенные ветром) Ярлык: Mr Smith Goes to Washington (Мистер Смит едет в Вашингтон) Всего
Play (Воспроизведение)

22 клика в 10 сеансах с событием

7 кликов в 5 сеансах с событием

29 событий всего

15 уникальных событий Play (Воспроизведение)

Pause (Пауза)

3 клика в 2 сеансах с событием

16 кликов в 8 сеансах с событием

19 событий всего

10 уникальных событий Pause (Пауза)

Stop (Стоп)

2 клика в 2 сеансах с событием

4 клика в 3 сеансах с событием

6 событий всего

5 уникальных событий Stop (Стоп)

Всего

27 событий всего

14 уникальных событий для Gone With the Wind

27 событий всего

16 уникальных событий для Mr Smith Goes to Washington

54 события всего

30 уникальных событий для категории Videos

О чем важно помнить

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

Влияние на показатель отказов

Обычно отказом считается сеанс, во время которого пользователь посетил только одну страницу сайта. В Google Аналитике отказом считается сеанс, в ходе которого был выполнен только один запрос GIF (например, если пользователь открыл одну страницу сайта и покинул его, не отправив других запросов к серверу Google Аналитики в рамках этого сеанса). Однако для страниц, на которых используется отслеживание событий, показатель отказов может изменяться. Это объясняется тем, что отслеживание событий, как и отслеживание страниц, классифицируется как запрос взаимодействия.

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

Поэтому для страниц с отслеживанием событий отказом считается посещение одной страницы сайта без взаимодействия с отслеживаемыми событиями.

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

Ограничение по количеству событий за сеанс

ga.js

Первые 10 событий, отправленных в Google Аналитику, обрабатываются сразу. Затем выполняется обработка не более одного события в секунду. За сеанс может быть обработано не более 500 событий.

analytics.js и gtag.js

Первые 20 событий, отправленных в Google Аналитику, обрабатываются сразу. Затем выполняется обработка не более двух событий в секунду. За сеанс может быть обработано не более 500 событий. Это ограничение распространяется на все обращения, за исключением типов item и transaction (данные по товарам и транзакциям).

Чтобы число обращений оставалось в пределах установленных ограничений, не рекомендуется делать следующее:

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

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

  • Заранее определите, для каких элементов вам может понадобиться отслеживать данные, даже если сейчас вас интересует только один объект на сайте. Это поможет вам разработать структуру отчетности, в рамках которой вы позднее сможете отслеживать сколько угодно событий любого типа.
  • Планируя отчеты по отслеживанию событий, обсудите все детали с теми, для кого эти отчеты предназначены. Четко понимая, что должно быть представлено в отчетах, вы сможете правильно реализовать отслеживание событий. Например, если в отчетах нужно отразить только взаимодействие с интерфейсом просмотра видео, структура категорий будет значительно отличаться от ситуации, когда требуется отслеживать другие элементы интерфейса на базе Flash, например меню, встроенные гаджеты и время загрузки. Кроме того, советуем обсудить с пользователями отчетов разные возможности отслеживания событий и выбрать наиболее подходящий вариант. Например, им может быть интересно не только взаимодействие пользователей с Flash-интерфейсом видеороликов, но и время их загрузки. Поэтому нужно заранее продумать, какие названия будут использоваться в вызовах событий.
  • Используйте точные и понятные названия: все названия категорий, действий и ярлыков, которые вы используете для отслеживания событий, отображаются в интерфейсе отчетов. Кроме того, в отчетах нельзя использовать одинаковые пары "категория-действие", поэтому заранее обдумайте, как будут рассчитываться показатели для всех объектов одной категории.

Чем отличаются события от целей-событий

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

Цель-событие – это заданная вами , определяющая событие как конверсию.

Была ли эта статья полезна?

Как можно улучшить эту статью?

Поисковая система Google (www.google.com) предоставляет множество возможностей для поиска. Все эти возможности – неоценимый инструмент поиска для пользователя впервые попавшего в Интернет и в то же время еще более мощное оружие вторжения и разрушения в руках людей с злыми намерениями, включая не только хакеров, но и некомпьютерных преступников и даже террористов.
(9475 просмотров за 1 неделю)

Денис Батранков
denisNOSPAMixi.ru

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

Введение

Я, например, за 0.14 секунд нашел 1670 страниц!

2. Введем другую строку, например:

inurl:"auth_user_file.txt"

немного меньше, но этого уже достаточно для свободного скачивания и для подбора паролей (при помощи того же John The Ripper). Ниже я приведу еще ряд примеров.

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

Впервые информация о Google Hacking появилась на рассылке Bugtruck еще 3 года назад. В 2001 году эта тема была поднята одним французским студентом. Вот ссылка на это письмо http://www.cotse.com/mailing-lists/bugtraq/2001/Nov/0129.html . В нем приведены первые примеры таких запросов:

1) Index of /admin
2) Index of /password
3) Index of /mail
4) Index of / +banques +filetype:xls (for france...)
5) Index of / +passwd
6) Index of / password.txt

Нашумела эта тема в англо-читающей части Интернета совершенно недавно: после статьи Johnny Long вышедшей 7 мая 2004 года. Для более полного изучения Google Hacking советую зайти на сайт этого автора http://johnny.ihackstuff.com . В этой статье я лишь хочу ввести вас в курс дела.

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

Как работает Google.

Для продолжения разговора напомню некоторые из ключевых слов, используемых в запросах Google.

Поиск при помощи знака +

Google исключает из поиска неважные, по его мнению, слова. Например вопросительные слова, предлоги и артикли в английском языке: например are, of, where. В русском языке Google, похоже, все слова считает важными. Если слово исключается из поиска, то Google пишет об этом. Чтобы Google начал искать страницы с этими словами перед ними нужно добавить знак + без пробела перед словом. Например:

ace +of base

Поиск при помощи знака –

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

рыбалка -водка

Поиск при помощи знака ~

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

Поиск точной фразы при помощи двойных кавычек

Google ищет на каждой странице все вхождения слов, которые вы написали в строке запроса, причем ему неважно взаимное расположение слов, главное чтобы все указанные слова были на странице одновременно (это действие по умолчанию). Чтобы найти точную фразу – ее нужно взять в кавычки. Например:

"подставка для книг"

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

книга безопасность OR защита

Кроме того в строке поиска можно использовать знак * для обозначения любого слова и. для обозначения любого символа.

Поиск слов при помощи дополнительных операторов

Существуют поисковые операторы, которые указываются в строке поиска в формате:

operator:search_term

Пробелы рядом с двоеточием не нужны. Если вы вставите пробел после двоеточия, то увидите сообщение об ошибке, а перед ним, то Google будет использовать их как обычную строку для поиска.
Существуют группы дополнительных операторов поиска: языки - указывают на каком языке вы хотите увидеть результат, дата - ограничивают результаты за прошедшие три, шесть или 12 месяцев, вхождения - указывают в каком месте документа нужно искать строку: везде, в заголовке, в URL, домены - производить поиск по указанному сайту или наоборот исключить его из поиска, безопасный поиск - блокируют сайты содержащие указанный тип информации и удаляют их со страниц результатов поиска.
При этом некоторые операторы не нуждаются в дополнительном параметре, например запрос "cache:www.google.com " может быть вызван, как полноценная строка для поиска, а некоторые ключевые слова, наоборот, требуют наличия слова для поиска, например " site:www.google.com help ". В свете нашей тематики посмотрим на следующие операторы:

Оператор

Описание

Требует дополнительного параметра?

поиск только по указанному в search_term сайту

поиск только в документах с типом search_term

найти страницы, содержащие search_term в заголовке

найти страницы, содержащие все слова search_term в заголовке

найти страницы, содержащие слово search_term в своем адресе

найти страницы, содержащие все слова search_term в своем адресе

Оператор site: ограничивает поиск только по указанному сайту, причем можно указать не только доменное имя, но и IP адрес. Например, введите:

Оператор filetype: ограничивает поиск в файлах определенного типа. Например:

На дату выхода статьи Googlе может искать внутри 13 различных форматов файлов:

  • Adobe Portable Document Format (pdf)
  • Adobe PostScript (ps)
  • Lotus 1-2-3 (wk1, wk2, wk3, wk4, wk5, wki, wks, wku)
  • Lotus WordPro (lwp)
  • MacWrite (mw)
  • Microsoft Excel (xls)
  • Microsoft PowerPoint (ppt)
  • Microsoft Word (doc)
  • Microsoft Works (wks, wps, wdb)
  • Microsoft Write (wri)
  • Rich Text Format (rtf)
  • Shockwave Flash (swf)
  • Text (ans, txt)

Оператор link: показывает все страницы, которые указывают на указанную страницу.
Наверно всегда интересно посмотреть, как много мест в Интернете знают о тебе. Пробуем:

Оператор cache: показывает версию сайта в кеше Google, как она выглядела, когда Google последний раз посещал эту страницу. Берем любой, часто меняющийся сайт и смотрим:

Оператор intitle: ищет указанное слово в заголовке страницы. Оператор allintitle: является расширением – он ищет все указанные несколько слов в заголовке страницы. Сравните:

intitle:полет на марс
intitle:полет intitle:на intitle:марс
allintitle:полет на марс

Оператор inurl: заставляет Google показать все страницы содержащие в URL указанную строку. Оператор allinurl: ищет все слова в URL. Например:

allinurl:acid acid_stat_alerts.php

Эта команда особенно полезна для тех, у кого нет SNORT – хоть смогут посмотреть, как он работает на реальной системе.

Методы взлома при помощи Google

Итак, мы выяснили что, используя комбинацию вышеперечисленных операторов и ключевых слов, любой человек может заняться сбором нужной информации и поиском уязвимостей. Эти технические приемы часто называют Google Hacking.

Карта сайта

Можно использовать оператор site: для просмотра всех ссылок, которые Google нашел на сайте. Обычно страницы, которые динамически создаются скриптами, при помощи параметров не индексируются, поэтому некоторые сайты используют ISAPI фильтры, чтобы ссылки были не в виде /article.asp?num=10&dst=5 , а со слешами /article/abc/num/10/dst/5 . Это сделано для того, чтобы сайт вообще индексировался поисковиками.

Попробуем:

site:www.whitehouse.gov whitehouse

Google думает, что каждая страница сайта содержит слово whitehouse. Этим мы и пользуемся, чтобы получить все страницы.
Есть и упрощенный вариант:

site:whitehouse.gov

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

Просмотр списка файлов в директориях

WEB серверы могут показывать списки директорий сервера вместо обычных HTML страниц. Обычно это делается для того, чтобы пользователи выбирали и скачивали определенные файлы. Однако во многих случаях у администраторов нет цели показать содержимое директории. Это возникает вследствие неправильной конфигурации сервера или отсутствия главной страницы в директории. В результате у хакера появляется шанс найти что-нибудь интересное в директории и воспользоваться этим для своих целей. Чтобы найти все такие страницы, достаточно заметить, что все они содержат в своем заголовке слова: index of. Но поскольку слова index of содержат не только такие страницы, то нужно уточнить запрос и учесть ключевые слова на самой странице, поэтому нам подойдут запросы вида:

intitle:index.of parent directory
intitle:index.of name size

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

Получение версии WEB сервера.

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

Apache1.3.29 - ProXad Server at trf296.free.fr Port 80

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

intitle:index.of server.at

Чтобы получить информацию для конкретного сервера уточняем запрос:

intitle:index.of server.at site:ibm.com

Или наоборот ищем сервера работающие на определенной версии сервера:

intitle:index.of Apache/2.0.40 Server at

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

Также можно получить версию сервера, просматривая страницы, которые по умолчанию устанавливаются при установке свежей версии WEB сервера. Например, чтобы увидеть тестовую страницу Apache 1.2.6 достаточно набрать

intitle:Test.Page.for.Apache it.worked!

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

Попробуйте найти страницы IIS 5.0

allintitle:Welcome to Windows 2000 Internet Services

В случае с IIS можно определить не только версию сервера, но и версию Windows и Service Pack.

Еще одним способом определения версии WEB сервера является поиск руководств (страниц подсказок) и примеров, которые могут быть установлены на сайте по умолчанию. Хакеры нашли достаточно много способов использовать эти компоненты, чтобы получить привилегированный доступ к сайту. Именно поэтому нужно на боевом сайте удалить эти компоненты. Не говоря уже о том, что по наличию этих компонентов можно получить информацию о типе сервера и его версии. Например, найдем руководство по apache:

inurl:manual apache directives modules

Использование Google как CGI сканера.

CGI сканер или WEB сканер – утилита для поиска уязвимых скриптов и программ на сервере жертвы. Эти утилиты должны знать что искать, для этого у них есть целый список уязвимых файлов, например:

/cgi-bin/cgiemail/uargg.txt
/random_banner/index.cgi
/random_banner/index.cgi
/cgi-bin/mailview.cgi
/cgi-bin/maillist.cgi
/cgi-bin/userreg.cgi

/iissamples/ISSamples/SQLQHit.asp
/SiteServer/admin/findvserver.asp
/scripts/cphost.dll
/cgi-bin/finger.cgi

Мы может найти каждый из этих файлов с помощью Google, используя дополнительно с именем файла в строке поиска слова index of или inurl: мы можем найти сайты с уязвимыми скриптами, например:

allinurl:/random_banner/index.cgi

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

Как защитить себя от взлома через Google.

1. Не выкладывайте важные данные на WEB сервер.

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

2. Проверьте свой сайт.

Используйте описанные методы, для исследования своего сайта. Проверяйте периодически свой сайт новыми методами, которые появляются на сайте http://johnny.ihackstuff.com . Помните, что если вы хотите автоматизировать свои действия, то нужно получить специальное разрешение от Google. Если внимательно прочитать http://www.google.com/terms_of_service.html , то вы увидите фразу: You may not send automated queries of any sort to Google"s system without express permission in advance from Google.

3. Возможно, вам не нужно чтобы Google индексировал ваш сайт или его часть.

Google позволяет удалить ссылку на свой сайт или его часть из своей базы, а также удалить страницы из кэша. Кроме того вы можете запретить поиск изображений на вашем сайте, запретить показывать короткие фрагменты страниц в результатах поиска Все возможности по удалению сайта описаны на сранице http://www.google.com/remove.html . Для этого вы должны подтвердить, что вы действительно владелец этого сайта или вставить на страницу теги или

4. Используйте robots.txt

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

User-agent: *
Disallow: /

Что еще бывает

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

Приложение.

Немного сладкого. Попробуйте сами что-нибудь из следующего списка:

1. #mysql dump filetype:sql - поиск дампов баз данных mySQL
2. Host Vulnerability Summary Report - покажет вам какие уязвимости нашли другие люди
3. phpMyAdmin running on inurl:main.php - это заставит закрыть управление через панель phpmyadmin
4. not for distribution confidential
5. Request Details Control Tree Server Variables
6. Running in Child mode
7. This report was generated by WebLog
8. intitle:index.of cgiirc.config
9. filetype:conf inurl:firewall -intitle:cvs – может кому нужны кофигурационные файлы файрволов? :)
10. intitle:index.of finances.xls – мда....
11. intitle:Index of dbconvert.exe chats – логи icq чата
12. intext:Tobias Oetiker traffic analysis
13. intitle:Usage Statistics for Generated by Webalizer
14. intitle:statistics of advanced web statistics
15. intitle:index.of ws_ftp.ini – конфиг ws ftp
16. inurl:ipsec.secrets holds shared secrets – секретный ключ – хорошая находка
17. inurl:main.php Welcome to phpMyAdmin
18. inurl:server-info Apache Server Information
19. site:edu admin grades
20. ORA-00921: unexpected end of SQL command – получаем пути
21. intitle:index.of trillian.ini
22. intitle:Index of pwd.db
23. intitle:index.of people.lst
24. intitle:index.of master.passwd
25. inurl:passlist.txt
26. intitle:Index of .mysql_history
27. intitle:index of intext:globals.inc
28. intitle:index.of administrators.pwd
29. intitle:Index.of etc shadow
30. intitle:index.of secring.pgp
31. inurl:config.php dbuname dbpass
32. inurl:perform filetype:ini

  • "Hacking mit Google"
  • Учебный центр "Информзащита" http://www.itsecurity.ru - ведущий специализированный центр в области обучения информационной безопасности (Лицензия Московского Комитета образования № 015470, Государственная аккредитация № 004251). Единственный авторизованный учебный центр компаний Internet Security Systems и Clearswift на территории России и стран СНГ. Авторизованный учебный центр компании Microsoft (специализация Security). Программы обучения согласованы с Гостехкомиссией России, ФСБ (ФАПСИ). Свидетельства об обучении и государственные документы о повышении квалификации.

    Компания SoftKey – это уникальный сервис для покупателей, разработчиков, дилеров и аффилиат–партнеров. Кроме того, это один из лучших Интернет-магазинов ПО в России, Украине, Казахстане, который предлагает покупателям широкий ассортимент, множество способов оплаты, оперативную (часто мгновенную) обработку заказа, отслеживание процесса выполнения заказа в персональном разделе, различные скидки от магазина и производителей ПО.

      Webasyst-приложение «Рассылки» умеет автоматически подсчитывать количество просмотров отправленного вами сообщения получателями. Чтобы использовать эту возможность, достаточно добавить любое изображение в сообщение с помощью встроенного визуального...

      Есть решение

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

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

      В приложении «Рассылки» есть встроенная функция, которая позволяет определять, сколько получателей email-рассылки прочитали ваше сообщение.Загрузка изображенийДля сбора такой информации используются изображения, вставленные в текст сообщения. Каждый...

      Введение Данное сообщение - не вопрос. Это, скорее, статья об одном из способов выжать из своего интернет-магазина больше производительности. Целевая аудитория статьи - пользователи с навыками администрирования и владельцы магазинов, у которых в...

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

      +2

      Здравствуйте. В приложении "Рассылки" не увидел возможности скачать список emailов клиентов, которые прочитали письмо. Есть возможность выгружать по 50 штук, но при нескольких сотнях прочитанных сообщений это займет много времени.Для чего это...

      Есть решение

      Ерунда такая с моей рассылкой. Если отправляю тестовую рассылку и пишу там пару выдуманых почтовых ящиков то в отчете рассылки показаны отказы. А когда отправляю своим подписчикам 2500 то нет ни одного отказа зато 70% неизвестно. Прочитано:663(30%)...

      Ваще-то, я должен сказать, 30% прочитано и 70% неизвестно - это весьма и весьма достойный результат. База адресов вполне живая. Я почти готов поверить, что там может и не быть битых ящиков.Когда будете отправлять следующую живую, не тестовую рассылку, добавьте туда вперемешку пару битых адресов (но чтобы не полная абракадабра, а которые выглядят как хорошие) и пару своих хороших адресов. Другого способа убедиться в том, что всё хорошо, я не могу придумать.Давайте ещё я опишу жизненный путь Email письма....

      -8 Не принято

      Предлагаю, чтобы плагины и приложения разработчиков перед продажей шифровались (обфусцировались) после проверки WebAsyst. Чтобы нельзя было втупую купить плагин и завтра продавать "копию" за полцены от оригинала.

      +1 Просто крик души в оформление заказа

      Являемся разработчиками темы https://www.webasyst.ru/store/theme/juicer_land/ в которой мы переделали оформление заказа, в частности доставка была представлена в виде вкладок аккордиона, за основы была взята тема для разработчиков Dummy. В итоге...

      Здравствуйте. Есть необходимость скачивания списка "неизвестно" после проведения рассылки для повторной рассылки по этой базе. В данный момент приложение "рассылки" позволяет выгружать вручную по 50 email адресов. При базе в 50...

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

      Прием платежей в Shop-Script через платежную систему «Яндекс.Деньги» осуществляется с помощью плагина, который нужно установить с помощью приложения «Инсталлер». Полезно знать: подключаясь к платежной системе через Webasyst, вы...

      Добавить вкладку в админке

      Подскажите, если добавить новую вкладку, в админке ShopScript5, возле товаров и отчетов, (вкладка называется Акции) то как можно перенести товари во вкладку акции, где можно прочитать об этом!

      подскажите как сгенерировать sitemap.xml для конкретного сайта на webasyst прочитал что framework делает это автоматически, но у меня есть сайт, а файла sitemap нет что конкретно нужно сделать, чтобы он появился

      После того как рассылка прошла, есть куча отказов адресов. где-то процентов 10.. перебирать руками это мучение. Сделайте ссылку из адреса который в отказе на аккаунт, или в поиск, куда угодно лишь бы не копировать эти адреса и не искать через поиск.....

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

      Безопастность хеша паролей

      Добрый день, прочитал статью: http://www.webasyst.ru/blog/security-improvement-advices-1/ Хочу сделать кастомный алгоритм шифрования и добавить соль. В предлагаемой функции в статье кажется не правильно указана соль. По идее солью должно быть...

      Есть решение

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

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

      Здравствуйте!У меня есть домен Lovere.ru. Сейчас он лежит на хостинге у другого провайдера.Создан сайт на вашей платформе http://lovere.host.webasyst.com/Меня все устроило и теперь я хочу открепить свой домен он своего хостера и положить свой домен к...

  • Блог компании Фонд развития интернет-инициатив
    • Перевод

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

    User story или «пользовательские истории/пожелания пользователя» являются методикой, опирающейся на другие практики agile, включая принципы непрерывной поставки и непосредственного общения с пользователями. Недостаточно просто понять, каким будет ваш пользователь; реальный пользователь вашей системы должен находиться рядом с командой на протяжении длительного времени.


    User story вкратце описывает:

    • человека, использующего систему (заказчик);
    • то, что должно содержаться в данной системе (примечание);
    • то, для чего она нужна пользователю (цель).
    User story может быть добавлена к бэклогу проекта на любом этапе спринта любым членом команды. Владелец проекта решает, как координировать и приоритезировать пожелания пользователя, и подбирает их вначале каждого цикла спринта.

    Обсудите историю перед планированием этапов с:

    • соответствующими членами команды;
    • экспертами по данному вопросу;
    • заинтересованными сторонами.

    Карточки пожеланий пользователя

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

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

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

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

    Структура

    Карточка составляется по стандартной схеме:
    • заголовок;
    • заказчик (actor, актер);
    • примечание;
    • цель.
    Она не отражает каждую мелочь, но вы должны детально обсудить пользовательскую историю в подходящее для команды время.

    Движение «от цели»
    Создание полезных программных систем трудоёмко, поэтому вы должны быть уверены, что решаете правильную проблему. В гибких методологиях применяют подход «от обратного» – что пытается получить пользователь системы на выходе? Если вы углубитесь в решение данного вопроса без достаточного понимания ваших пользователей, вы рискуете решить не ту проблему или найти решение, которое на самом деле не подходит вашим пользователям в реальной жизни. Поэтому самой важной частью user story является её цель.
    Цель
    Понимание целей поможет вам при решении вопроса о том, выполнили ли вы требования пользователя, иными словами, соответствует ли проделанная вами работа цели, стоящей перед пользователем?

    При написании user story с вашей командой разработчиков всегда начинайте с обдумывания и обсуждения целей вашего пользователя:

    • почему он хочет использовать эту систему?
    • чего он пытается достичь?
    • что заставило его искать ваш сервис?
    • в каких условиях он использует её: дома/на работе/по телефону/во время ухода за ребенком?
    • как часто он пользуется ей?
    Сюзанна и Джеймс Робертсон дают отличный совет по этому поводу в третьем издании книги «Mastering the Requirements Process».
    Заказчик (актер)
    Подробное описание заказчика (актера) поможет вам разбить процесс построения взаимодействия на логически связанные отрезки.
    Иногда заказчик будет пользователем вашей системы, в других случаях – администратором, техником или менеджером вашей организации.
    Убедитесь, что вы достаточно хорошо знаете своих пользователей на основании уже проделанной работы или проведенных ранее исследований. Если это не так, найдите время расширить свое понимание пользователей.
    Примечания
    Используйте их как блок передачи информации об основом типе взаимодействия, которое должно рассматриваться как часть пользовательского опыта. Помните, что карточка не должна отражать каждую деталь этого взаимодействия.
    Общение с пользователем напрямую
    Agile-команды предпочитают общение лицом к лицу подробной документации.

    Разговор лицом к лицу:

    • быстрее;
    • точнее, чем написанная документация;
    • позволяет разработчикам выстроить детальную модель целей пользователя, рабочих процессов, ограничений и многих вопросов, которые должны быть приняты во внимание при разработке ПО.
    Карточка – это всего лишь шаблон, гарантия, что разговор состоится в подходящее время. Воспользуйтесь карточками и несколькими вариантами для завязки разговора, чтобы оценить, сколько времени вам понадобится, чтобы завершить работу над составлением user story и поместить её в бэклог проекта.

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

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

    Критерии приемки для user story

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

    Истории «работают» только для agile-команд

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

    Откуда берутся пожелания пользователя

    Пожелания могут поступать из многих мест, но наиболее распространённые источники включают в себя:
    1. Воркшопы по написанию user story (чаще всего происходят на начальном этапе проекта); команда разработчиков и заинтересованные стороны собираются, чтобы обозначить пожелания пользователей.
    2. Интервью с реальными пользователями – в идеале, вы должны найти несколько пользователей, к которым команда разработчиков будет иметь постоянный доступ.
    3. Представители пользователя в составе вашей команды – это может быть сервис-менеджер или владелец продукта.
    4. Наблюдение – посмотрите, как реальные пользователи работают в вашей системе.
    Мы обсудили данный материал с рядом стартапов 4-го набора Акселератора ФРИИ [ближайший День открытых дверей Акселератора состоится в следующий четверг 12-го февраля 2015 г. ]:

    1. Используете ли вы user story? К каким источникам вы обращаетесь при составлении user story?

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


    Cкорее нет, чем да. Мы сначала разработали продукт и уже потом общались с пользователями. Да, мы вносили определённые изменения в контент, основываясь на отзывах, но никогда не ставили себе целью полностью основывать «таски» на user story.


    Термин user story мы никогда не использовали, но по факту отвечали на вопросы «Кто наш клиент?», «Как он использует наш сервис?» и «Почему ему нужен наш сервис?». Информацию получали из заявок клиентов, которые поступают к нам на сайт, и из личного общения с теми клиентами, кто заказал и кто не заказал наши услуги (услуги переводчиков).


    Александр Грицай, CEO, Forecast NOW!

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


    Ольга Книга, со-основатель и CEO, Merku.ru

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


    Согласны ли вы с утверждением, что методика user story подходит только для agile-команд?

    Александр Богомолов, экс-проектный менеджер, ПоискСтроек

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


    Леонид Тощев, технический директор, Datamonkey

    Сейчас понятие agile настолько размылось– мне кажется, нет таких компаний, которые не agile. Соответственно, user story могут использоваться всеми.


    Мария Теркина, со-основатель и CEO, Глоберлэнд

    Думаю, user story вписывается в agile-подход, но может использоваться и в других подходах к разработке.


    Мария Подоляк, со-основатель Gagarin Labs

    Подход к проектированию функционала продукта или интерфейса при помощи user stories – это же изначально не разработка Agile. Так называемые use cases (юс кейсы, примеры использования) существуют давно в практике разработки технических заданий. Подход такой же, немного был видоизменен под нужды Agile.

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

    User stories используются и при проектировании интерфейсов. С этим подходом я познакомилась в Школе проектирования интерфейсов. Мы рисовали портрет пользователя (еще их иногда персонами называют), писали сценарий истории, дальше мы вырезали из бумаги интерфейс для того, чтобы разыграть сценарий или историю (так происходило тестирование гипотезы).

    В ноябре я попробовала применить такой же подход для проектирования контент-стратегии компании или продукта на семинаре в Школе интернет-маркетинга в Нижнем Новгороде. И прекрасно получилось. Так что подход применим ко всему в продукте: функционалу, интерфейсу, маркетингу и т.д. Заставляет думать «головой пользователя», понимать его проблему, а не опускаться в галлюцинации.
    Так что Agile ничего нового не сделал, просто адаптировал существующий подход под свои нужды. Добавить метки

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

    Что это?

    Авторизация - это процесс предоставления доступа к контроллерам и методам действий для определенных пользователей, как правило, находящихся в определенных ролях (например, допуск к админке должны иметь только администраторы).

    Зачем нужно использовать?

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

    Как использовать в рамках MVC?

    Добавление поддержки ролей

    ASP.NET Identity содержит строго типизированный базовый класс для доступа и управления ролями, который называется RoleManager , где T является реализацией интерфейса IRole , описывающего механизм хранения данных, используемых для представления ролей. Entity Framework использует класс IdentityRole , являющийся реализацией интерфейса IRole и содержит следующие свойства:

    Мы не будем использовать напрямую объекты IdentityRole в нашем приложении, вместо этого добавьте файл класса AppRole.cs в папку Models со следующим содержимым:

    Using Microsoft.AspNet.Identity.EntityFramework; namespace Users.Models { public class AppRole: IdentityRole { public AppRole() : base() { } public AppRole(string name) : base(name) { } } }

    Класс RoleManager работает с экземплярами IRole с помощью методов и свойств, перечисленных в таблице ниже:

    Эти базовые методы реализуют тот же базовый шаблон, который использует класс UserManager для управления пользователями. Добавьте файл AppRoleManager.cs в папку Infrastructure со следующим содержимым:

    Using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.EntityFramework; using Microsoft.AspNet.Identity.Owin; using Microsoft.Owin; using System; using Users.Models; namespace Users.Infrastructure { public class AppRoleManager: RoleManager, IDisposable { public AppRoleManager(RoleStore store) : base(store) { } public static AppRoleManager Create(IdentityFactoryOptions options, IOwinContext context) { return new AppRoleManager(new RoleStore(context.Get())); } } }

    Этот класс определяет статический метод Create(), который позволит OWIN создавать экземпляры класса AppRoleManager для всех запросов, где требуются данные Identity, не раскрывая информации о том, как данные о ролях хранятся в приложении. Чтобы зарегистрировать класс управления ролями в OWIN, необходимо отредактировать файл IdentityConfig.cs, как показано в примере ниже:

    // ... namespace Users { public class IdentityConfig { public void Configuration(IAppBuilder app) { // ... app.CreatePerOwinContext(AppRoleManager.Create); // ... } } }

    Это гарантирует, что экземпляры класса AppRoleManager используют тот же контекст базы данных Entity Framework, что и экземпляры AppUserManager.

    Создание и удаление ролей

    Мы подготовили базовую инфраструктуру для работы с ролями, давайте теперь создадим средство администрирования для работы с ролями. Сначала давайте определим методы действия и представления для управления ролями. Добавьте контроллер RoleAdmin в проект приложения с кодом, показанным в примере ниже:

    Using System.Web; using System.Web.Mvc; using System.Threading.Tasks; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.Owin; using System.ComponentModel.DataAnnotations; using Users.Infrastructure; using Users.Models; namespace Users.Controllers { public class RoleAdminController: Controller { private AppUserManager UserManager { get { return HttpContext.GetOwinContext().GetUserManager(); } } private AppRoleManager RoleManager { get { return HttpContext.GetOwinContext().GetUserManager(); } } public ActionResult Index() { return View(RoleManager.Roles); } public ActionResult Create() { return View(); } public async Task Create(string name) { if (ModelState.IsValid) { IdentityResult result = await RoleManager.CreateAsync(new AppRole(name)); if (result.Succeeded) { return RedirectToAction("Index"); } else { AddErrorsFromResult(result); } } return View(name); } public async Task Delete(string id) { AppRole role = await RoleManager.FindByIdAsync(id); if (role != null) { IdentityResult result = await RoleManager.DeleteAsync(role); if (result.Succeeded) { return RedirectToAction("Index"); } else { return View("Error", result.Errors); } } else { return View("Error", new string { "Роль не найдена" }); } } private void AddErrorsFromResult(IdentityResult result) { foreach (string error in result.Errors) { ModelState.AddModelError("", error); } } } }

    Здесь мы применили многие из тех приемов, что использовали в контроллере Admin, в том числе добавили свойства UserManager и RoleManager для более быстрого запроса объектов AppRoleManager и AppUserManager. Также мы добавили аналогичный метод AddErrorsFromResult(), который обрабатывает ошибки в объекте IdentityResult и добавляет их в метаданные модели.

    Представления для контроллера RoleAdmin содержат простую HTML-разметку и операторы Razor. Нам необходимо отобразить не только список ролей, но и имена всех пользователей, входящих в каждую роль. Класс IdentityRole определяет свойство Users, которое возвращает коллекцию объектов IdentityUserRole , описывающих пользователей роли. Каждый объект IdentityUserRole имеет свойство UserId, которое возвращает уникальный идентификатор пользователя, с помощью которого мы будем получать имя пользователя.

    Добавьте файл класса IdentityHelpers.cs в папку Infrastructure со следующим содержимым:

    Using System.Web; using System.Web.Mvc; using Microsoft.AspNet.Identity.Owin; namespace Users.Infrastructure { public static class IdentityHelpers { public static MvcHtmlString GetUserName(this HtmlHelper html, string id) { AppUserManager mgr = HttpContext.Current .GetOwinContext().GetUserManager(); return new MvcHtmlString(mgr.FindByIdAsync(id).Result.UserName); } } }

    Этот код содержит определение вспомогательного метода HTML , определенного как расширение класса HtmlHelper. Метод GetUserName() принимает строковый аргумент, содержащий идентификатор пользователя, получает экземпляр класса AppUserManager с помощью метода GetOwinContext().GetUserManager() (где метод GetOwinContext является расширяющим HttpContext), использует метод FindByIdAsync(), чтобы найти экземпляр AppUser, связанный с идентификатором и возвращает значение свойства UserName.

    Следующий пример показывает содержимое файла Index.cshtml, находящегося в папке /Views/RoleAdmin:

    @using Users.Models @using Users.Infrastructure @model IEnumerable @{ ViewBag.Title = "Роли"; }

    Roles
    @if (Model.Count() == 0) { } else { foreach (AppRole role in Model) { } }
    ID Название Пользователи
    Нет ролей
    @role.Id @role.Name @if (role.Users == null || role.Users.Count == 0) { @: Нет пользователей в этой роли } else {

    @string.Join(", ", role.Users.Select(x => Html.GetUserName(x.UserId)))

    }
    @using (Html.BeginForm("Delete", "RoleAdmin", new { id = role.Id })) { @Html.ActionLink("Изменить", "Edit", new { id = role.Id }, new { @class = "btn btn-primary btn-xs", style= "float:left; margin-right:5px" }) }
    @Html.ActionLink("Создать", "Create", null, new { @class = "btn btn-primary" })

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

    Следующий пример содержит представление Create.cshtml в той же папке, которое используется для создания новых ролей:

    @model string @{ ViewBag.Title = "Создание роли"; }

    Создать роль

    @Html.ValidationSummary(false) @using (Html.BeginForm()) {

    Единственная информация, которая требуется для создания новой роли - ее название. Поэтому мы добавили один стандартный элемент и кнопку отправки формы POST-методу действия Create.

    Чтобы протестировать функционал создания ролей, запустите приложение и перейдите по адресу /RoleAdmin/Index в окне браузера. Чтобы создать новую роль нажмите кнопку «Создать», введите имя в поле ввода в появившейся форме и нажмите вторую кнопку «Создать». Новое представление будет отображать список ролей, сохраненных в базе данных:

    Вы можете также удалить роль из приложения нажав кнопку «Удалить».

    Редактирование ролей

    Для авторизации пользователей недостаточно просто создавать и удалять роли. Мы также должны уметь управлять ролями, назначать и удалять пользователей из роли. Это не сложный процесс, но для его реализации нам необходимо загружать данные о ролях с помощью класса AppRoleManager, а затем вызывать методы, определенные в классе AppUserManager на объектах, связанных с определенной ролью.

    Давайте начнем с добавления новых классов модели-представления (view-model) в файл UserViewModels.cs:

    Using System.Collections.Generic; using System.ComponentModel.DataAnnotations; namespace Users.Models { public class CreateModel { // ... } public class LoginViewModel { // ... } public class RoleEditModel { public AppRole Role { get; set; } public IEnumerable Members { get; set; } public IEnumerable NonMembers { get; set; } } public class RoleModificationModel { public string RoleName { get; set; } public string IdsToAdd { get; set; } public string IdsToDelete { get; set; } } }

    Класс RoleEditModel содержит информацию о роли и определяет список пользователей в роли в виде коллекции объектов AppUser. Благодаря этому, мы сможем извлечь ID и имя каждого пользователя в роли. Класс RoleModificationModel будет получать данные от системы привязки модели во время редактирования данных пользователя. Он содержит массив идентификаторов пользователей, а не объектов AppUser, для замены ролей.

    Определившись с классами моделей, давайте добавим методы редактирования ролей Edit в контроллер RoleAdmin:

    Using System.Web; using System.Web.Mvc; using System.Threading.Tasks; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.Owin; using System.ComponentModel.DataAnnotations; using Users.Infrastructure; using Users.Models; using System.Linq; using System.Collections.Generic; namespace Users.Controllers { public class RoleAdminController: Controller { // ... public async Task Edit(string id) { AppRole role = await RoleManager.FindByIdAsync(id); string memberIDs = role.Users.Select(x => x.UserId).ToArray(); IEnumerable members = UserManager.Users.Where(x => memberIDs.Any(y => y == x.Id)); IEnumerable nonMembers = UserManager.Users.Except(members); return View(new RoleEditModel { Role = role, Members = members, NonMembers = nonMembers }); } public async Task Edit(RoleModificationModel model) { IdentityResult result; if (ModelState.IsValid) { foreach (string userId in model.IdsToAdd ?? new string { }) { result = await UserManager.AddToRoleAsync(userId, model.RoleName); if (!result.Succeeded) { return View("Error", result.Errors); } } foreach (string userId in model.IdsToDelete ?? new string { }) { result = await UserManager.RemoveFromRoleAsync(userId, model.RoleName); if (!result.Succeeded) { return View("Error", result.Errors); } } return RedirectToAction("Index"); } return View("Error", new string { "Роль не найдена" }); } } }

    Большая часть кода в GET-версии метода Edit отвечает за формирование списков пользователей входящих и не входящих в роль и реализуется с помощью методов LINQ. После группировки пользователей возвращается представление, которому передается объект RoleEditModel.

    POST-версия метода Edit отвечает за добавление и удаление пользователей из ролей. Класс AppUserManager наследует ряд вспомогательных методов для работы с ролями из класса UserManager. Эти методы перечислены в таблице ниже:

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

    В примере ниже показан код представления Edit.cshtml, находящегося в папке /Views/RoleAdmin.cshtml:

    @using Users.Models @model RoleEditModel @{ ViewBag.Title = "Изменить роль"; }

    Изменить роль

    @Html.ValidationSummary() @using (Html.BeginForm()) {
    Добавить в роль @Model.Role.Name
    @if (Model.NonMembers.Count() == 0) { } else { foreach (AppUser user in Model.NonMembers) { } }
    Все пользователи в роли
    User ID Добавить в роль
    @user.UserName
    Удалить из роли @Model.Role.Name
    @if (Model.Members.Count() == 0) { } else { foreach (AppUser user in Model.Members) { } }
    Нет пользователей в роли
    User ID Удалить из роли
    @user.UserName
    @Html.ActionLink("Отмена", "Index", null, new { @class = "btn btn-default" }) }

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

    Давайте протестируем функциональность редактирования ролей. Добавление класса AppRoleManager в архитектуру OWIN заставит Entity Framework удалить базу данных и воссоздать новую схему. Это означает, что пользователи, которых мы создали ранее исчезнут. Поэтому после запуска приложения перейдите по адресу /Admin/Index и создайте нескольких пользователей.

    Чтобы проверить редактирование ролей, перейдите по адресу /RoleAdmin/Index и создайте несколько ролей, затем отредактируйте эти роли, добавив в них нескольких пользователей. На рисунке ниже показан пример приложения (я создал роль Users):

    Использование ролей для авторизации

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

    Public class AccountController: Controller { // ... public ActionResult Logout() { AuthManager.SignOut(); return RedirectToAction("Index", "Home"); } // ... }

    Давайте обновим контроллер Home и добавим новый метод действия, который будет передавать информацию об аутентифицированном пользователе в представление:

    Using System.Collections.Generic; using System.Web.Mvc; namespace Users.Controllers { public class HomeController: Controller { public ActionResult Index() { return View(GetData("Index")); } public ActionResult OtherAction() { return View("Index", GetData("OtherAction")); } private Dictionary GetData(string actionName) { Dictionary dict = new Dictionary(); dict.Add("Action", actionName); dict.Add("Пользователь", HttpContext.User.Identity.Name); dict.Add("Аутентифицирован?", HttpContext.User.Identity.IsAuthenticated); dict.Add("Тип аутентификации", HttpContext.User.Identity.AuthenticationType); dict.Add("В роли Users?", HttpContext.User.IsInRole("Users")); return dict; } } }

    В этом примере мы оставили атрибут Authorize для метода действия Index без изменений, но добавили этот атрибут к методу OtherAction, задав при этом свойство Roles, ограничивающее доступ к этому методу только для пользователей, являющихся членами роли Users. Мы также добавили метод GetData(), который добавляет некоторую базовую информацию о пользователе, используя свойства, доступные через объект HttpContext.

    В заключение, нам необходимо добавить кнопку выхода из приложения в представление Index.cshtml из папки /Views/Home:

    ... @Html.ActionLink("Выйти", "Logout", "Account", null, new {@class = "btn btn-primary"})

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

    Для тестирования системы авторизации, запустите приложение и перейдите по адресу /Home/Index. Браузер будет перенаправлен на страницу входа в приложение, где вы должны будете ввести данные существующей учетной записи. Метод действия Index является доступным для любого авторизованного пользователя. Однако если вы перейдете по адресу /Index/OtherAction, доступ будет открыт только тем пользователям, которые являются членами роли Users.

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

    Public class AccountController: Controller { public ActionResult Login(string returnUrl) { if (HttpContext.User.Identity.IsAuthenticated) { return View("Error", new string { "В доступе отказано" }); } ViewBag.returnUrl = returnUrl; return View(); } // ... }

    На рисунке ниже наглядно показано поведение нашего приложения, когда пользователю отказано в доступе: