Как структурировать HTML-формы

This Battle for Azeroth Inscription leveling guide will help you to level your profession from 1 to 150. The guide"s primary focus is to show you how to level this profession, so if you are looking for more detailed information about BfA Inscription, check out my Battle for Azeroth Inscription guide .

Inscription is the best combined with Herbalism because you can save a lot of gold by farming the needed herbs, so check out my if you want to level Herbalism.

If you are low on gold, I recommend you to try this . It can help you to make loads of gold.

If you are still leveling your character or you just started a new alt, I recommend you to use a leveling guide. You can level your character to .

Learning BfA Inscription

The new BfA Inscription skill is named differently for the two factions, but the name is the only difference between them.

is the Alliance version and is the Horde version.

Inscription Trainers:

  • Horde: You can find Chronicler Grazzul in Dazar"alor at the Terrace of Crafters. Coordinates: /way 42.3, 39.6
  • Alliance: Zooey Inksprocket is in Boralus at the Tradewinds Market. Coordinates: /way 73.4, 6.33

You can walk up to a guard in Dazar"alor or Boralus then ask where the Inscription trainer is. Asking the guard will place a red marker on your map at the trainer"s location.

Leveling BfA Inscription

Nightborne characters have +15 Inscription skill because of their passive . An extra 15 Inscription skill means recipes stay orange for 15 more points. You can save a lot of gold by doing lower level recipes for 15 more points.

You can buy from the Inscription Supply vendors near your trainer, or sometimes from your trainer directly.

1 - 50

You will need around 900 , 550 , and 80 to reach 150. So, make inks until you reach 50, but don"t mill more herbs than you need, because you will unlock Mass Mill at 50 which will give skill points up to 80.

50 - 80

Use the Mass Mill spell that you learned from your trainer to Mass mill any herb. You will use the pigments to make Inks, and then use the Inks to level up Inscription, so these are basically free skill points.

Make if you don"t want to mill herbs.

80 - 85

8 x - 64 Crimson Ink

This recipe will be yellow, so you will have to make around 5-8.

85 - 142

These recipes are locked behind Honored reputation, but reaching honored with one of these factions is really easy. You can reach Honored just by completing your War Campaign quests and then doing a few faction Assaults.

Alternative recipes

It"s a good idea to make a few different kinds of contract recipes because it"s easier to sell them at the Auction House. You should only make these if you can buy the rank 2 version because Rank 2 recipes will give skill points longer, and also cost fewer materials, and you should only make them until they turn yellow at 105 . (unless you get the rank 3)

Check your map every day and look for Inscription World quests like "Work Order: Contract: Talanji"s Expedition". These rewards you with the rank 3 recipe, which is even better and you can make contracts up to around 130. (you have to get the rank 2 to learn the rank 3)

Rank 2 recipes

Alliance:

Neutral:

Darkmoon Faire free +5 skill points

You should check your Calendar in-game to see if the Darkmoon Faire is open, the event starts at 00:01 on the Sunday before the first Monday of each month.

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

Существует два способа связывания объекта и метки. Первый заключается в использовании идентификатора внутри элемента формы и указании его имени в качестве атрибута for элемента . При втором способе элемент формы помещается внутрь контейнера .

Синтаксис

Текст Текст

Закрывающий тег

Обязателен.

Пример

LABEL

Выберите напиток

Коньяк
Арманьяк
Кальвадос

Примечание

IE до версии 6.0 включительно не позволяет активировать поле формы при щелчке по тексту, когда поле с текстом находится внутри .

IE до версии 8.0 включительно корректно работает с только при наличии в нём текста. Если добавить изображение ( ), то активировать поле формы щелчком по картинке нельзя.

Спецификация

Каждая спецификация проходит несколько стадий одобрения.

  • Recommendation (Рекомендация ) - спецификация одобрена W3C и рекомендована как стандарт.
  • Candidate Recommendation (Возможная рекомендация ) - группа, отвечающая за стандарт, удовлетворена, как он соответствует своим целям, но требуется помощь сообщества разработчиков по реализации стандарта.
  • Proposed Recommendation (Предлагаемая рекомендация ) - на этом этапе документ представлен на рассмотрение Консультативного совета W3C для окончательного утверждения.
  • Working Draft (Рабочий проект ) - более зрелая версия черновика после обсуждения и внесения поправок для рассмотрения сообществом.
  • Editor"s draft (Редакторский черновик ) - черновая версия стандарта после внесения правок редакторами проекта.
  • Draft (Черновик спецификации ) - первая черновая версия стандарта.

Особняком стоит живой стандарт HTML (Living ) - он не придерживается традиционной нумерации версий, поскольку находится в постоянной разработке и обновляется регулярно.

Чтобы описать суть проблемы, мне нужно рассказать, как вообще устроен HTML. Вы наверняка в общих чертах представляли себе, но я все равно коротко пробегусь по основным моментам, которые понадобятся для понимания. Если кому-то не терпится, сразу переходите к сути .


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



Тут - это имя атрибута, а - это его значение. В статье я буду использовать квадратные скобки вокруг кода, чтобы было понятно, где он начинается и заканчивается. После имени стои́т знак равенства, а после него - значение, заключенное в кавычки. Значение атрибута начинается сразу после первого символа кавычки и заканчивается сразу перед следующим символом кавычки, где бы он не находился. Это значит, что если вместо вы запишете , то значение атрибута name будет , а еще у вашего элемента будет три других атрибута с именами: [рога] , [и] и [копыта"."] , но без значений.


Если это не то, чего вы ожидали, вам нужно как-то изменить значение атрибута, чтобы в нем не встречалась кавычка. Самое простое, что можно придумать - просто вырезать кавычки.


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


Чтобы вы могли указать в качестве значения любую строку, формат языка HTML предлагает возможность экранировать значения атрибутов. Вместо кавычки в строке значения вы можете записать последовательность символов ["] и парсер поймет, что в этом месте в исходной строке, которую вы хотите использовать в качестве значения атрибута, была кавычка. Такие последовательности называются HTML entities.


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


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


Собственно, так работает большинство форматов, с которыми мы сталкиваемся: есть синтаксис, есть способ экранирования контента от этого синтаксиса и способ экранирования символов экранирования, если вдруг такая последовательность встречается в исходной строке. Большинство, но не…

Тег

Тег служит для встраивания в HTML фрагментов, написанных на других языках. На сегодняшний день в 99% случаев это Javascript. Скрипт начинается сразу после открывающего тега и заканчивается сразу перед закрывающим тегом . Парсер HTML внутрь тега не заглядывает, для него это просто какой-то текст, который он потом отдает в парсер Javascript.


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


var s = "surprise!alert("whoops!")";

Что тут должно происходить: переменной s должна присваиваться безобидная строка.


Что тут происходит на самом деле: Скрипт, в котором объявляется переменная s на самом деле заканчивается так: , что приводит к ошибке синтаксиса. Весь текст после него интерпретируется как чистый HTML и в него может быть внедрена любая разметка. В данном случае открывается новый тег и выполняется зловредный код.


Мы получили тот же эффект, как когда в значении атрибута присутствует кавычка. Но в отличие от значений атрибута, для тега нет никакого способа экранировать исходный контент. HTML entities внутри тега не работают, они будут переданы в парсер Javascript без изменений, то есть либо приведут к ошибке, либо изменят его смысл. Стандарт HTML прямо говорит, что в содержимом тега не может быть последовательности символов ни в каком виде. А стандарт Javascript не запрещает такой последовательности быть где угодно в строковых литералах.


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


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

Как эксплуатируется уязвимость

Конечно, когда вы просто пишете какой-то код, трудно представить, что вы напишете в строке и не заметите проблем. Как минимум, подсветка синтаксиса даст вам знать, что тег закрылся раньше времени, как максимум, написанный вами код не запустится и вы будете долго искать, что произошло. Но это не является основной проблемой с этой уязвимостью. Проблема возникает там, где вы вставляете какой-то контент в Javascript, когда генерируете HTML. Вот частый кусок кода приложений на реакте с серверным рендерингом:


window.__INITIAL_STATE__ = ;

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


Другой пример:


analytics.identify("", ...);

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


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

В этом примере мы:

  • Внутри первой формы:
    • Разместили две радиокнопки ( ) для выбора одного из ограниченного числа вариантов. Еще раз обратите внимание, что для радиокнопок внутри одной формы необходимо указывать одинаковое имя , значения мы указали разные. Для первой checked , который указывает, что элемент должен быть предварительно выбран при загрузке страницы (в данном случае радиокнопка со значением yes ). Кроме того, мы указали для радиокнопок глобальные атрибуты , которые определяют уникальный идентификатор для элемента.
    • Разместили два элемента , которые определяют текстовые метки для наших текстовых полей. Обратите внимание, что мы использовали атрибут for , чтобы определить к какому элементу формы относится текущая метка. Значение атрибута for соответствует значению глобального атрибута необходимой нам радиокнопки.
  • Внутри второй формы:
    • Разместили две радиокнопки ( ) для выбора одного из ограниченного числа вариантов. Для второй радиокнопки мы указали атрибут

Тег (от англ. script - скрипт, сценарий) предназначен для описания скриптов, может содержать ссылку на программу или её текст на определённом языке.

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

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

Синтаксис ...

Закрывающий тег обязателен.

WAI ARIA

Нет значения role по-умолчанию.

Атрибуты
  • async - Загружает скрипт асинхронно.
  • defer - Откладывает выполнение скрипта до тех пор, пока вся страница не будет загружена полностью.
  • src - Адрес скрипта из внешнего файла для импорта в текущий документ.
  • type - Определяет тип содержимого .
async

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

Если задано сразу два атрибута - async и defer , то атрибут async игнорируется.

Синтаксис

...

Значения

Значение по умолчанию

defer

Атрибут defer откладывает выполнение скрипта до тех пор, пока вся страница не будет загружена полностью. Работает только при наличии атрибута src .

Синтаксис

...

Значения

Значение по умолчанию

По умолчанию этот атрибут выключен.

src

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

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

Синтаксис

...

Значения

В качестве значения принимается полный или относительный путь к файлу. Файл должен иметь расширение.js.

Значение по умолчанию

type

Указывает MIME-тип для определённого языка.

Синтаксис

...

Значения

Атрибут type не чувствителен к регистру и обычно принимает следующие значения:

  • text/javascript - Для языка программирования JavaScript.
  • text/vbscript - Для языка VBScript.

Значение по умолчанию