[{"data":1,"prerenderedAt":1046},["ShallowReactive",2],{"$fkYSFET1nJisaA5sQyRLeZhR8rNS3cNj9GRPyVSMyAmM":3,"$fMMUdSFktwQFqMVGPrTtt3EC5yheBp7PzwIqznamFcMo":82,"$fc0LoAJgqXDLbKKd2JS_NpM4SuzBK8EycUXINSg09CKU":85,"$fM3ea55k6lKMPOTM84llDB26VSQDVVbxiQuSBFQw9P_c":90,"$f1Prj1xEczHja_-L7FyIGgRHd5_cSWHo7r6AE5aheAik":435,"$fI5fDmvm-5tr9wcH0eHaKZa1j3y_FQIQaHHPqbZxAHJE":657,"mdc--4nemz8-key":677,"mdc--tu8pq-key":689,"mdc--86uh82-key":698,"mdc-be2vrr-key":706,"mdc-v81vw0-key":724,"mdc-idpf0v-key":732,"mdc-4pylve-key":740,"mdc-5l6h3p-key":755,"mdc-z0ldwm-key":814,"mdc-a01ide-key":822,"mdc--ec0kac-key":830,"mdc--747mlv-key":968,"mdc--titctt-key":990,"mdc-4jgyzu-key":1005,"mdc--bgauke-key":1019,"mdc-5r7hxp-key":1038},{"content":4,"quizQuestionContent":53,"type":72,"pageMeta":73},[5,9,13,16,20,24,27,31,34,38,41,44,47,50],{"id":6,"value":7,"isTypeH1":8},"1866","DNS-подмена и HTTPS: может ли утечь логин/пароль",true,{"id":10,"value":11,"anchor":12,"isTypeH2":8},"4244","Теория: DNS, HTTPS и модель доверия","theory-dns-https-and-trust-model",{"id":14,"value":15,"isTypeParagraph":8},"9779","DNS отвечает на вопрос «какой IP у доменного имени», но классический DNS без DNSSEC не даёт криптографической гарантии, что ответ не подменён в сети или на резолвере.\n\nTLS в HTTPS решает другую задачу: создаёт шифрованный канал и проверяет подлинность сервера через сертификат (цепочку доверия к доверенным центрам сертификации и соответствие имени домена в сертификате запрошенному имени).\n\nКлючевая идея: при DNS-подмене клиент действительно может уйти на неправильный IP, но затем TLS-проверка должна остановить атаку, если «не тот» сервер не может предъявить валидный сертификат именно для исходного домена.\n\nУпрощённая последовательность:\n1) Клиент получает IP для `bank.example` (DNS).\n2) Клиент устанавливает TLS с IP и проверяет, что сертификат выпущен на `bank.example` и доверен.\n3) Только после успешной проверки отправляются HTTP-данные (включая логин/пароль) внутри защищённого канала.",{"id":17,"description":18,"titleAlert":19,"isTypeAlertWarning":8},"655","Переход «всё равно продолжить» на странице с ошибкой сертификата фактически отключает проверку подлинности сервера и превращает ситуацию в обычный фишинг/перехват.",null,{"id":21,"value":22,"anchor":23,"isTypeH2":8},"4245","Сценарии: когда утечка возможна","scenarios-when-leak-is-possible",{"id":25,"value":26,"isTypeParagraph":8},"9780","Кража логина/пароля происходит не из-за самого факта «IP подменён», а из-за того, что ввод учётных данных уходит злоумышленнику: либо через фишинговую страницу, либо через успешный MITM, либо через принуждение к незащищённому HTTP.",{"id":28,"value":29,"anchor":30,"isTypeH3":8},"4272","Таблица исходов при DNS-подмене","table-of-outcomes-under-dns-spoofing",{"id":32,"value":33,"isTypeParagraph":8},"9781","| Сценарий | Что наблюдается в браузере | Может ли утечь логин/пароль | Почему так |\n|---|---|---:|---|\n| DNS подменён, у злоумышленника нет валидного сертификата для домена | Ошибка/предупреждение о сертификате, возможна блокировка | Обычно нет (если не продолжать) | Сертификат не соответствует домену или не доверен, TLS-проверка останавливает соединение |\n| DNS подменён + пользователь подтверждает исключение | Страница открывается несмотря на предупреждение | Да | Проверка подлинности сервера обойдена, форма отправляется на сервер злоумышленника |\n| DNS подменён + downgrade до HTTP (SSL stripping) и нет HSTS | Открывается HTTP без «замка» | Да | Данные идут без TLS, возможны чтение/подмена и сбор паролей |\n| DNS подменён + у злоумышленника есть валидный ключ/сертификат для домена | «Замок» есть, всё выглядит обычно | Да | TLS защищает канал до владельца соответствующего ключа; при компрометации ключа/доверия атакующий становится «легитимным» для клиента |\n\nОтдельно важно: «замок» (HTTPS) не означает «сайт настоящий», он означает «соединение шифруется и аутентифицируется для конкретного имени домена». Поэтому фишинговый домен (похожее имя) может иметь валидный сертификат на своё имя и выглядеть правдоподобно.",{"id":35,"value":36,"anchor":37,"isTypeH2":8},"4246","Практика: что снижает риск","practice-what-reduces-risk",{"id":39,"value":40,"isTypeParagraph":8},"9782","На стороне клиента критично запрещать «тихое» принятие невалидных сертификатов в приложениях и не игнорировать предупреждения в браузере, поскольку это превращает DNS-подмену в кражу данных.\n\nДля защиты от downgrade/SSL stripping применяется HSTS: сайт отправляет заголовок `Strict-Transport-Security`, браузер запоминает политику и в дальнейшем принудительно использует HTTPS для домена (и, при настройке, для поддоменов).",{"id":42,"description":43,"titleAlert":19,"isTypeAlertInfo":8},"598","Пример HSTS-заголовка: `Strict-Transport-Security: max-age=31536000; includeSubDomains; preload`",{"id":45,"value":46,"isTypeParagraph":8},"9783","На стороне DNS полезен DNSSEC: он позволяет валидатору обнаружить подмену/искажение записей по криптографическим подписям (при корректно настроенной цепочке доверия). Шифрование транспорта DNS (DoH/DoT) защищает приватность запросов и усложняет атаки «на пути», но не является криптографическим доказательством подлинности содержимого DNS-ответа само по себе.\n\nАктуальные протокольные ориентиры для веба: наиболее распространённый безопасный минимум — TLS 1.2 и TLS 1.3, а устаревшие версии (например, TLS 1.0/1.1) считаются нежелательными. Для реальных рисков также важно управление ключами: компрометация приватного ключа сайта или утечки ключей через подрядчиков/инфраструктуру могут позволить атакующему пройти TLS-проверку даже при правильном HTTPS.",{"id":48,"value":49,"isTypeParagraph":8},"9784","**Короткий ответ**: при корректной проверке TLS-сертификата в браузере простая DNS-подмена сама по себе обычно не позволяет получить логин/пароль, потому что злоумышленник не сможет корректно «притвориться» нужным доменом на уровне сертификата, и соединение будет прервано или помечено как небезопасное.\n\nЛогин/пароль становятся доступны злоумышленнику, если удаётся обойти проверку подлинности (например, пользователь игнорирует предупреждение, установлен поддельный/корпоративный корневой сертификат, скомпрометирован приватный ключ сайта, получен валидный сертификат для домена атакуемого ресурса или выполнен downgrade до HTTP при отсутствии HSTS).",{"id":51,"description":52,"titleAlert":19,"isTypeAlertInfo":8},"599","HTTPS (TLS) защищает не «ответ DNS», а канал до сервера, чья подлинность подтверждена сертификатом на конкретное имя домена.",{"id":54,"options":55,"hint":69,"solution":70,"description":71},"1112",[56,59,63,66],{"id":57,"label":58,"isCorrect":8},"4576","DNS-подмена сама по себе обычно не даёт логин/пароль при HTTPS, если TLS-сертификат проверяется и предупреждения не игнорируются: фишинговый IP не сможет предъявить валидный сертификат на исходный домен, и браузер остановит соединение. Утечка становится возможной, если проверка подлинности обходится (подтверждение исключения, поддельный/корпоративный корневой сертификат, компрометация ключа/валидный сертификат у атакующего) или выполнен downgrade до HTTP без HSTS.\n",{"id":60,"label":61,"isCorrect":62},"4577","DNS-подмена всегда приводит к утечке логина/пароля, потому что HTTPS шифрует только от наблюдателей и не проверяет, кому именно отправляются данные. Поэтому достаточно подменить IP, и браузер неизбежно отправит форму авторизации атакующему даже при корректном сертификате и без предупреждений.",false,{"id":64,"label":65,"isCorrect":62},"4578","DNS-подмена никогда не приводит к утечке логина/пароля, потому что HTTPS автоматически защищает и DNS-разрешение имени: при наличии `https://` клиент гарантированно получает правильный IP-адрес. Следовательно, DNSSEC, HSTS и любые дополнительные меры не нужны, так как атака невозможна в принципе.\n",{"id":67,"label":68,"isCorrect":62},"4579","DNS-подмена приводит к утечке только при TLS 1.3, потому что в TLS 1.3 сначала отправляются данные приложения, а потом проверяется сертификат, и злоумышленник успевает принять пароль. В TLS 1.2 сначала проверяется сертификат, поэтому при TLS 1.2 утечка невозможна даже если пользователь игнорирует предупреждения.","Полезно разделить задачу на две независимые части: 1) может ли атакующий заставить клиента подключиться к другому IP (это про DNS), 2) может ли атакующий пройти проверку подлинности сервера или принудить HTTP (это про сертификаты, доверие и HSTS).","**Правильный ответ: 1** - DNS-подмена сама по себе обычно не даёт логин/пароль при HTTPS, если TLS-сертификат проверяется и предупреждения не игнорируются: фишинговый IP не сможет предъявить валидный сертификат на исходный домен, и браузер остановит соединение. Утечка становится возможной, если проверка подлинности обходится (подтверждение исключения, поддельный/корпоративный корневой сертификат, компрометация ключа/валидный сертификат у атакующего) или выполнен downgrade до HTTP без HSTS.\n","Все данные зашифрованы, используется https. Хакер взламывает dns и делает подмену одного ip на другой, на фишинговый сайт. В этом случае, злоумышленник может получить данные (логин \\ пароль)?","quizQuestion",{"title":7,"description":74,"ogTitle":7,"ogDescription":74,"ogImageUrl":75,"canonical":19,"ogLocale":76,"ogSiteName":77,"ogImageType":78,"ogImageWidth":79,"ogImageHeight":80,"ogType":81,"ogUrl":19},"Разбор DNS-spoofing при HTTPS: когда TLS защищает, а когда возможны фишинг, MITM и кража логина/пароля.","/og-image.png","ru_RU","goodwebjob.ru","image_jpeg","1200","630","article",{"siteName":83,"siteUrl":84},"GOOD WEB JOB!","https://goodwebjob.ru",[86],{"label":87,"slug":88,"to":89},"Подготовка к тех.интервью","technical-interview","/technical-interview/where-to-begin",{"navigationList":91,"navigationSublist":99},[92,95],{"path":89,"isActive":62,"name":93,"icon":94,"isNavbarMobileDisabled":8},"С чего начать?","material-symbols:visibility-outline-rounded",{"path":96,"isActive":8,"name":97,"icon":98,"isNavbarMobileDisabled":62},"/technical-interview/tasks","Сборник задач","material-symbols:task-outline",[100,109,136,148,154,295,319,328,334,396,417,423],{"title":101,"list":102,"isOpened":62},"Bash",[103,106],{"name":104,"path":105,"isActive":62},"Дан фрагмент bash-скрипта: cd ~; mkdir foo... Что в нем происходит?","/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":107,"path":108,"isActive":62},"Дан фрагмент bash-скрипта: target=$(ps -Af | grep $1 | head -n 1)...","/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"title":110,"list":111,"isOpened":62},"CSS",[112,115,118,121,124,127,130,133],{"name":113,"path":114,"isActive":62},"Дан HTML-код. Какой будет цвет у текста «Some dummy text»?","/technical-interview/tasks/the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":116,"path":117,"isActive":62},"Есть шаблон HTML и CSS кода. Какой будет цвет у текста «Таким образом, постоянное»?","/technical-interview/tasks/there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":119,"path":120,"isActive":62},"Есть шаблон вложенного HTML кода. Какой будет цвет у текста «One more dummy text»?","/technical-interview/tasks/there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":122,"path":123,"isActive":62},"Есть шаблон вложенного HTML кода. Будет ли display:block у body влиять на span?","/technical-interview/tasks/there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":125,"path":126,"isActive":62},"Есть HTML код. Будет ли font-weight на span влиять?","/technical-interview/tasks/there-is-an-html-code-will-font-weight-affect-span",{"name":128,"path":129,"isActive":62},"Flexbox и Grid, чем отличаются друг от друга?","/technical-interview/tasks/what-are-the-differences-between-flexbox-and-grid",{"name":131,"path":132,"isActive":62},"Заменяют ли Flexbox и Grid друг друга?","/technical-interview/tasks/do-flexbox-and-grid-replace-each-other",{"name":134,"path":135,"isActive":62},"Есть CSS и JS анимация. Какая между ними разница, что быстрее, что более удобно?","/technical-interview/tasks/there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"title":137,"list":138,"isOpened":62},"Git",[139,142,145],{"name":140,"path":141,"isActive":62},"Разрабатывал, взял закоммитил, запушил. Оказалось, что запушил не в ту ветку, точнее, коммит не в ту ветку. Какие действия?","/technical-interview/tasks/developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":143,"path":144,"isActive":62},"В git есть несколько вариантов слияния веток, какие? Чем отличаются?","/technical-interview/tasks/git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":146,"path":147,"isActive":62},"Какие существуют стратегии ветвления для работы команды? Что это такое?","/technical-interview/tasks/what-are-the-branching-strategies-for-the-team-what-is-it",{"title":149,"list":150,"isOpened":62},"HTML",[151],{"name":152,"path":153,"isActive":62},"Что такое HTML?","/technical-interview/tasks/what-is-html",{"title":155,"list":156,"isOpened":62},"JavaScript",[157,160,163,166,169,172,175,178,181,184,187,190,193,196,199,202,205,208,211,214,217,220,223,226,229,232,235,238,241,244,247,250,253,256,259,262,265,268,271,274,277,280,283,286,289,292],{"name":158,"path":159,"isActive":62},"Какие логические значения в console.log будут получены?","/technical-interview/tasks/prototype-what-logical-values-will-be-received-in-console-log",{"name":161,"path":162,"isActive":62},"Почему опасно писать прямо в прототипы базовых типов?","/technical-interview/tasks/why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":164,"path":165,"isActive":62},"Что вернёт следующий код? Object.create(null).hasOwnProperty('toString')","/technical-interview/tasks/what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":167,"path":168,"isActive":62},"Какое значение выведет консоль с object.property?","/technical-interview/tasks/what-value-will-the-console-output-with-object-property",{"name":170,"path":171,"isActive":62},"Что выведется в console.log([arr[0](), arr[0]()])?","/technical-interview/tasks/what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":173,"path":174,"isActive":62},"Что выведет console.log в результате выполнения цикла while?","/technical-interview/tasks/what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":176,"path":177,"isActive":62},"Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение x из объекта, используя функцию","/technical-interview/tasks/there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":179,"path":180,"isActive":62},"Что вернёт метод book.getUpperName()?","/technical-interview/tasks/what-will-the-book-get-upper-name-method-return",{"name":182,"path":183,"isActive":62},"Переменные объявлены следующим образом: a=3; b=«hello»;. Укажите правильное утверждение","/technical-interview/tasks/variables-are-declared-as-follows-specify-the-correct-statement",{"name":185,"path":186,"isActive":62},"Что выведет консоль в случае присвоения свойства массиву по строковому положительному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":188,"path":189,"isActive":62},"Что выведет консоль в случае присвоения свойства массиву по строковому отрицательному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":191,"path":192,"isActive":62},"Что выведет консоль в случае удаления элемента массива с помощью оператора delete?","/technical-interview/tasks/what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":194,"path":195,"isActive":62},"Что вернёт этот код: typeof (function(){})()","/technical-interview/tasks/what-this-code-will-return-typeof-function",{"name":197,"path":198,"isActive":62},"Что получится в результате передачи объекта как аргумента в функцию и выполнения кода?","/technical-interview/tasks/what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":200,"path":201,"isActive":62},"Какие способы объявления функции есть в JavaScript?","/technical-interview/tasks/what-are-the-ways-to-declare-a-function-in-javascript",{"name":203,"path":204,"isActive":62},"Что такое this в JavaScript?","/technical-interview/tasks/what-is-this-in-javascript",{"name":206,"path":207,"isActive":62},"Что такое Event Loop, как работает?","/technical-interview/tasks/what-is-an-event-loop-and-how-does-it-work",{"name":209,"path":210,"isActive":62},"Что будет, если вызвать typeof на необъявленной переменной?","/technical-interview/tasks/what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":212,"path":213,"isActive":62},"Что показывает оператор typeof в JavaScript?","/technical-interview/tasks/what-does-the-typeof-operator-show-in-javascript",{"name":215,"path":216,"isActive":62},"Какие типы данных существует в JavaScript?","/technical-interview/tasks/what-types-of-data-exist-in-javascript",{"name":218,"path":219,"isActive":62},"Какую структуру использовать для хранения упорядоченного списка строк в JavaScript?","/technical-interview/tasks/what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":221,"path":222,"isActive":62},"Что вернет typeof для массива?","/technical-interview/tasks/what-will-typeof-return-for-an-array",{"name":224,"path":225,"isActive":62},"Почему оператор typeof, применённый к массиву, возвращает объект?","/technical-interview/tasks/why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":227,"path":228,"isActive":62},"Если нужно хранить список уникальных строк, какую структуру данных выбрать?","/technical-interview/tasks/if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":230,"path":231,"isActive":62},"Что возвращает typeof для new Set в JavaScript?","/technical-interview/tasks/what-does-typeof-return-for-new-set-in-javascript",{"name":233,"path":234,"isActive":62},"Почему в JavaScript два объекта с одинаковым содержимым при сравнении возвращают false?","/technical-interview/tasks/why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":236,"path":237,"isActive":62},"В чем разница между микро- и макро-тасками в JavaScript?","/technical-interview/tasks/what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":239,"path":240,"isActive":62},"arr.push(0) повлияет на массив так же, как если бы мы выполнили...","/technical-interview/tasks/arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":242,"path":243,"isActive":62},"Вернуть массив от 1 до n, где числа, кратные 3, заменены на 'fizz', кратные 5 - на 'buzz', а кратные и 3, и 5 одновременно - на 'fizzbuzz'","/technical-interview/tasks/returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":245,"path":246,"isActive":62},"Дана строка: 'one.two.three.four.five'. Необходимо из строки сделать вложенный объект","/technical-interview/tasks/the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":248,"path":249,"isActive":62},"Дано дерево (вложенный объект), надо найти сумму всех вершин","/technical-interview/tasks/given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":251,"path":252,"isActive":62},"Для каждого вложенного объекта нужно добавить свойство level, которое равняется числу - номер вложенности","/technical-interview/tasks/for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":254,"path":255,"isActive":62},"Для каждой ветви дерева записать номер вложенности данной ветви","/technical-interview/tasks/for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":257,"path":258,"isActive":62},"Есть массив, в котором лежат объекты с датами, необходимо отсортировать даты по возрастанию","/technical-interview/tasks/there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":260,"path":261,"isActive":62},"Есть слова в массиве, необходимо определить, состоят ли они из одних и тех же букв","/technical-interview/tasks/there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":263,"path":264,"isActive":62},"Есть строка, состоящая из разных скобок, необходимо проверить, закрыты ли все","/technical-interview/tasks/there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":266,"path":267,"isActive":62}," Найти в массиве неповторяющиеся числа","/technical-interview/tasks/find-non-repeating-numbers-in-an-array",{"name":269,"path":270,"isActive":62},"Напишите функцию, который сделает из массива объект","/technical-interview/tasks/write-a-function-that-will-make-an-object-out-of-an-array",{"name":272,"path":273,"isActive":62},"Необходимо проверить, являются ли две строки анаграммами друг друга","/technical-interview/tasks/checks-whether-two-strings-are-anagrams-of-each-other",{"name":275,"path":276,"isActive":62},"Нечётные числа должны отсортироваться по возрастанию, а чётные должны остаться на своих местах","/technical-interview/tasks/odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":278,"path":279,"isActive":62},"Определить, является ли слово палиндромом","/technical-interview/tasks/determines-whether-a-word-is-a-palindrome",{"name":281,"path":282,"isActive":62},"«Расплющивание» массива","/technical-interview/tasks/flattening-the-array",{"name":284,"path":285,"isActive":62},"Реализовать функцию, принимающую аргументы \"*\", \"1\", \"b\", \"1c\" и возвращающую строку \"1*b*1c\"","/technical-interview/tasks/implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":287,"path":288,"isActive":62},"Сжатие строк","/technical-interview/tasks/string-compression",{"name":290,"path":291,"isActive":62},"Уникализация значений в массиве","/technical-interview/tasks/unifying-values-in-an-array",{"name":293,"path":294,"isActive":62},"Числа от 1 до 100 находятся в массиве, они хаотично перемешанные, но в нём не хватает одного числа из этой последовательности. Необходимо найти его","/technical-interview/tasks/the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"title":296,"list":297,"isOpened":62},"React",[298,301,304,307,310,313,316],{"name":299,"path":300,"isActive":62},"Для чего нужен React, какие он решает проблемы?","/technical-interview/tasks/what-is-react-used-for-and-what-problems-does-it-solve",{"name":302,"path":303,"isActive":62},"Какой механизм лежит в основе оптимизации обновлений DOM в React?","/technical-interview/tasks/what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":305,"path":306,"isActive":62},"Если убрать в React VDOM/Fiber, и вручную изменять DOM, разве это не оптимально?","/technical-interview/tasks/if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":308,"path":309,"isActive":62},"Есть блок кода. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":311,"path":312,"isActive":62},"Есть код, в котором список и кнопка. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":314,"path":315,"isActive":62},"Зачем нужен Redux (Mobx/Effector)? Зачем нужен менеджер состояния? Какие проблемы решает?","/technical-interview/tasks/why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":317,"path":318,"isActive":62},"Что мешает организовать централизованное состояние без менеджера состояния? Если организовать состояние механизмами реакта: контекстом, стейтом, в чем проблема? Что менеджеры состояния привносят?","/technical-interview/tasks/what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",{"title":320,"list":321,"isOpened":62},"Алгоритмы",[322,325],{"name":323,"path":324,"isActive":62},"Что такое алгоритмическая сложность?","/technical-interview/tasks/what-is-algorithmic-complexity",{"name":326,"path":327,"isActive":62},"Какая алгоритмическая сложность у \"быстрой сортировки\"?","/technical-interview/tasks/what-is-the-algorithmic-complexity-of-quick-sort",{"title":329,"list":330,"isOpened":62},"Дебаггинг",[331],{"name":332,"path":333,"isActive":62},"Как диагностировать и исправить нежелательное изменение цвета фона по клику на кнопку, если исходный код сайта запутан и недоступен для прямого чтения?","/technical-interview/tasks/how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"title":335,"list":336,"isOpened":62},"Компьютерные сети",[337,340,343,346,349,352,355,358,361,364,367,370,373,376,379,382,385,388,390,393],{"name":338,"path":339,"isActive":62},"Как браузер после ввода домена понимает, откуда брать сайт?","/technical-interview/tasks/how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":341,"path":342,"isActive":62},"Что такое DNS, как DNS находит нужный IP-адрес?","/technical-interview/tasks/what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":344,"path":345,"isActive":62},"Как домен попадает в DNS в таблицу соответствия: домен – ip","/technical-interview/tasks/how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":347,"path":348,"isActive":62},"Как браузер решает, какое соединение ему открывать, TCP или UDP?","/technical-interview/tasks/how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":350,"path":351,"isActive":62},"Ключевые отличия TCP и UDP","/technical-interview/tasks/key-differences-between-tcp-and-udp",{"name":353,"path":354,"isActive":62},"\"TCP/IP\" - кем является TCP, а кем IP в данном случае?","/technical-interview/tasks/tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":356,"path":357,"isActive":62},"Что такое HTTP и из чего состоит?","/technical-interview/tasks/what-is-http-and-what-does-it-consist-of",{"name":359,"path":360,"isActive":62},"Что такое заголовки в HTTP и зачем они нужны?","/technical-interview/tasks/what-are-http-headers-and-why-do-we-need-them",{"name":362,"path":363,"isActive":62},"Что такое параметры в HTTP?","/technical-interview/tasks/what-are-http-parameters",{"name":365,"path":366,"isActive":62},"Где находится HTML-код в структуре HTTP-ответа?","/technical-interview/tasks/where-is-the-html-code-located-in-the-http-response-structure",{"name":368,"path":369,"isActive":62},"Чем отличаются 1.0, 1.1, 2.0, 3.0 версии HTTP?","/technical-interview/tasks/what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":371,"path":372,"isActive":62},"Пользователь авторизован на сайте. Как сервер узнает об этом с последующими другими заходами, что «я – авторизованный пользователь»?","/technical-interview/tasks/the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":374,"path":375,"isActive":62},"Что такое cookie?","/technical-interview/tasks/what-is-a-cookie",{"name":377,"path":378,"isActive":62},"Кто является инициатором записи cookie в браузере?","/technical-interview/tasks/who-initiates-the-cookie-recording-in-the-browser",{"name":380,"path":381,"isActive":62},"Есть ли возможность с клиента (с браузера) управлять cookie?","/technical-interview/tasks/is-it-possible-to-manage-cookies-from-the-client-browser",{"name":383,"path":384,"isActive":62},"Верно ли утверждение, что злоумышленник, контролирующий роутер и прослушивающий трафик, может получить логины и пароли от сайтов, на которые заходит клиент?","/technical-interview/tasks/is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":386,"path":387,"isActive":62},"Всё, что идет по HTTPS – оно защищено?","/technical-interview/tasks/is-everything-that-goes-through-https-secure",{"name":71,"path":389,"isActive":62},"/technical-interview/tasks/all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":391,"path":392,"isActive":62},"Есть веб-приложение. Помимо HTTP, какие протоколы того же уровня (Application Layer) можно дополнительно использовать в веб-приложении в браузере?","/technical-interview/tasks/there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":394,"path":395,"isActive":62},"Каким способом может выполняться авторизация пользователя на сайте?","/technical-interview/tasks/how-can-a-user-be-authorized-on-a-website",{"title":397,"list":398,"isOpened":62},"Отрисовка в браузере",[399,402,405,408,411,414],{"name":400,"path":401,"isActive":62},"Что происходит, когда HTTP прислал HTML? Что браузер дальше делает c HTML с учетом того, что она валидная?","/technical-interview/tasks/what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":403,"path":404,"isActive":62},"Как браузер парсит JavaScript и изображения при рендеринге?","/technical-interview/tasks/how-the-browser-parses-javascript-and-images-when-rendering",{"name":406,"path":407,"isActive":62},"Что в браузере блокирует рендеринг страницы?","/technical-interview/tasks/what-is-blocking-the-page-rendering-in-the-browser",{"name":409,"path":410,"isActive":62},"Что такое DOM в браузере? Что такое CSSOM?","/technical-interview/tasks/what-is-dom-in-a-browser-what-is-cssom",{"name":412,"path":413,"isActive":62},"Что является узлами в DOM?","/technical-interview/tasks/what-are-nodes-in-the-dom",{"name":415,"path":416,"isActive":62},"Из чего состоит CSSOM?","/technical-interview/tasks/what-does-cssom-consist-of",{"title":418,"list":419,"isOpened":62},"Ревью кода",[420],{"name":421,"path":422,"isActive":62},"По каким характеристикам, ревьюер понимает, что данный код - хороший, а этот код - плохой?","/technical-interview/tasks/how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"title":424,"list":425,"isOpened":62},"Теория вероятности",[426,429,432],{"name":427,"path":428,"isActive":62},"В комнате три человека. Какова вероятность того, что хотя бы двое из них одного пола? То есть два и более.","/technical-interview/tasks/there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":430,"path":431,"isActive":62},"Есть монета. Ее подбрасывают пять раз подряд. Каждый раз записывается, что выпало - орел или решка. Сколько разных последовательностей орлов и решек может при этом получиться?","/technical-interview/tasks/there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":433,"path":434,"isActive":62},"Как гарантированно найти лёгкую фальшивую монету среди 8 за минимальное число взвешиваний на чашечных весах?","/technical-interview/tasks/how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"slugs":436},[437,440,442,444,446,449,452,454,456,458,460,462,465,467,469,471,473,475,477,479,481,483,485,487,489,491,493,495,497,499,501,503,505,507,509,511,513,515,517,519,521,523,525,527,529,531,533,535,537,539,541,543,546,548,550,552,554,556,558,560,562,564,566,568,570,572,574,576,578,580,582,584,586,588,590,592,594,596,598,600,602,604,606,608,610,612,614,616,618,620,622,624,626,628,630,632,634,636,638,640,642,644,646,647,649,651,653,655],{"name":438,"value":439},"Теоретические задания","theoretical-tasks",{"name":194,"value":441},"what-this-code-will-return-typeof-function",{"name":93,"value":443},"where-to-begin",{"name":161,"value":445},"why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":447,"value":448},"Backend","backend",{"name":450,"value":451},"Frontend","frontend",{"name":158,"value":453},"prototype-what-logical-values-will-be-received-in-console-log",{"name":275,"value":455},"odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":266,"value":457},"find-non-repeating-numbers-in-an-array",{"name":239,"value":459},"arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":245,"value":461},"the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":463,"value":464},"Реализовать функцию, похоже как в Jquery","implement-a-function-similar-to-jquery",{"name":251,"value":466},"for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":167,"value":468},"what-value-will-the-console-output-with-object-property",{"name":170,"value":470},"what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":242,"value":472},"returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":272,"value":474},"checks-whether-two-strings-are-anagrams-of-each-other",{"name":278,"value":476},"determines-whether-a-word-is-a-palindrome",{"name":257,"value":478},"there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":284,"value":480},"implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":248,"value":482},"given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":254,"value":484},"for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":260,"value":486},"there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":293,"value":488},"the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"name":263,"value":490},"there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":269,"value":492},"write-a-function-that-will-make-an-object-out-of-an-array",{"name":173,"value":494},"what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":176,"value":496},"there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":188,"value":498},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":191,"value":500},"what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":290,"value":502},"unifying-values-in-an-array",{"name":281,"value":504},"flattening-the-array",{"name":179,"value":506},"what-will-the-book-get-upper-name-method-return",{"name":287,"value":508},"string-compression",{"name":185,"value":510},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":197,"value":512},"what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":338,"value":514},"how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":344,"value":516},"how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":347,"value":518},"how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":350,"value":520},"key-differences-between-tcp-and-udp",{"name":353,"value":522},"tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":356,"value":524},"what-is-http-and-what-does-it-consist-of",{"name":359,"value":526},"what-are-http-headers-and-why-do-we-need-them",{"name":362,"value":528},"what-are-http-parameters",{"name":365,"value":530},"where-is-the-html-code-located-in-the-http-response-structure",{"name":152,"value":532},"what-is-html",{"name":368,"value":534},"what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":371,"value":536},"the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":374,"value":538},"what-is-a-cookie",{"name":377,"value":540},"who-initiates-the-cookie-recording-in-the-browser",{"name":380,"value":542},"is-it-possible-to-manage-cookies-from-the-client-browser",{"name":544,"value":545},"Лайвкодинг","livecoding",{"name":164,"value":547},"what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":386,"value":549},"is-everything-that-goes-through-https-secure",{"name":71,"value":551},"all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":391,"value":553},"there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":403,"value":555},"how-the-browser-parses-javascript-and-images-when-rendering",{"name":400,"value":557},"what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":406,"value":559},"what-is-blocking-the-page-rendering-in-the-browser",{"name":409,"value":561},"what-is-dom-in-a-browser-what-is-cssom",{"name":412,"value":563},"what-are-nodes-in-the-dom",{"name":415,"value":565},"what-does-cssom-consist-of",{"name":113,"value":567},"the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":116,"value":569},"there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":119,"value":571},"there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":122,"value":573},"there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":125,"value":575},"there-is-an-html-code-will-font-weight-affect-span",{"name":128,"value":577},"what-are-the-differences-between-flexbox-and-grid",{"name":131,"value":579},"do-flexbox-and-grid-replace-each-other",{"name":134,"value":581},"there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"name":97,"value":583},"tasks",{"name":200,"value":585},"what-are-the-ways-to-declare-a-function-in-javascript",{"name":203,"value":587},"what-is-this-in-javascript",{"name":206,"value":589},"what-is-an-event-loop-and-how-does-it-work",{"name":209,"value":591},"what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":212,"value":593},"what-does-the-typeof-operator-show-in-javascript",{"name":215,"value":595},"what-types-of-data-exist-in-javascript",{"name":218,"value":597},"what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":221,"value":599},"what-will-typeof-return-for-an-array",{"name":224,"value":601},"why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":227,"value":603},"if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":230,"value":605},"what-does-typeof-return-for-new-set-in-javascript",{"name":299,"value":607},"what-is-react-used-for-and-what-problems-does-it-solve",{"name":305,"value":609},"if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":308,"value":611},"there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":311,"value":613},"there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":314,"value":615},"why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":332,"value":617},"how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"name":140,"value":619},"developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":143,"value":621},"git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":146,"value":623},"what-are-the-branching-strategies-for-the-team-what-is-it",{"name":421,"value":625},"how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"name":104,"value":627},"here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":107,"value":629},"here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"name":323,"value":631},"what-is-algorithmic-complexity",{"name":326,"value":633},"what-is-the-algorithmic-complexity-of-quick-sort",{"name":233,"value":635},"why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":394,"value":637},"how-can-a-user-be-authorized-on-a-website",{"name":236,"value":639},"what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":427,"value":641},"there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":430,"value":643},"there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":433,"value":645},"how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"name":87,"value":88},{"name":383,"value":648},"is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":341,"value":650},"what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":182,"value":652},"variables-are-declared-as-follows-specify-the-correct-statement",{"name":302,"value":654},"what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":317,"value":656},"what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",{"cooperation":658,"copyright":661,"reportError":662,"socialNetwork":664},{"link":659,"title":660},"https://t.me/baurinanton","Сотрудничество","© “GOOD WEB JOB!”",{"label":663,"link":659},"Сообщить об ошибке",{"label":665,"socialNetworkList":666},"Мы в соцсетях:",[667,670,673],{"icon":19,"link":668,"title":669},"https://max.ru/u/f9LHodD0cOKMaukdnnahTeL5pwvjrPfUaZ4S8_1rsNy9I9qsmc9Ar3kP_y8","Max",{"icon":671,"link":659,"title":672},"ic:baseline-telegram","Telegram",{"icon":674,"link":675,"title":676},"ri:vk-fill","https://vk.com/baurinanton","VK",{"data":678,"body":679},{},{"type":680,"children":681},"root",[682],{"type":683,"tag":684,"props":685,"children":686},"element","p",{},[687],{"type":688,"value":71},"text",{"data":690,"body":691},{},{"type":680,"children":692},[693],{"type":683,"tag":684,"props":694,"children":695},{},[696],{"type":688,"value":697},"DNS-подмена сама по себе обычно не даёт логин/пароль при HTTPS, если TLS-сертификат проверяется и предупреждения не игнорируются: фишинговый IP не сможет предъявить валидный сертификат на исходный домен, и браузер остановит соединение. Утечка становится возможной, если проверка подлинности обходится (подтверждение исключения, поддельный/корпоративный корневой сертификат, компрометация ключа/валидный сертификат у атакующего) или выполнен downgrade до HTTP без HSTS.",{"data":699,"body":700},{},{"type":680,"children":701},[702],{"type":683,"tag":684,"props":703,"children":704},{},[705],{"type":688,"value":61},{"data":707,"body":708},{},{"type":680,"children":709},[710],{"type":683,"tag":684,"props":711,"children":712},{},[713,715,722],{"type":688,"value":714},"DNS-подмена никогда не приводит к утечке логина/пароля, потому что HTTPS автоматически защищает и DNS-разрешение имени: при наличии ",{"type":683,"tag":716,"props":717,"children":719},"code",{"className":718},[],[720],{"type":688,"value":721},"https://",{"type":688,"value":723}," клиент гарантированно получает правильный IP-адрес. Следовательно, DNSSEC, HSTS и любые дополнительные меры не нужны, так как атака невозможна в принципе.",{"data":725,"body":726},{},{"type":680,"children":727},[728],{"type":683,"tag":684,"props":729,"children":730},{},[731],{"type":688,"value":68},{"data":733,"body":734},{},{"type":680,"children":735},[736],{"type":683,"tag":684,"props":737,"children":738},{},[739],{"type":688,"value":69},{"data":741,"body":742},{},{"type":680,"children":743},[744],{"type":683,"tag":684,"props":745,"children":746},{},[747,753],{"type":683,"tag":748,"props":749,"children":750},"strong",{},[751],{"type":688,"value":752},"Правильный ответ: 1",{"type":688,"value":754}," - DNS-подмена сама по себе обычно не даёт логин/пароль при HTTPS, если TLS-сертификат проверяется и предупреждения не игнорируются: фишинговый IP не сможет предъявить валидный сертификат на исходный домен, и браузер остановит соединение. Утечка становится возможной, если проверка подлинности обходится (подтверждение исключения, поддельный/корпоративный корневой сертификат, компрометация ключа/валидный сертификат у атакующего) или выполнен downgrade до HTTP без HSTS.",{"data":756,"body":757},{},{"type":680,"children":758},[759,764,769,774,779],{"type":683,"tag":684,"props":760,"children":761},{},[762],{"type":688,"value":763},"DNS отвечает на вопрос «какой IP у доменного имени», но классический DNS без DNSSEC не даёт криптографической гарантии, что ответ не подменён в сети или на резолвере.",{"type":683,"tag":684,"props":765,"children":766},{},[767],{"type":688,"value":768},"TLS в HTTPS решает другую задачу: создаёт шифрованный канал и проверяет подлинность сервера через сертификат (цепочку доверия к доверенным центрам сертификации и соответствие имени домена в сертификате запрошенному имени).",{"type":683,"tag":684,"props":770,"children":771},{},[772],{"type":688,"value":773},"Ключевая идея: при DNS-подмене клиент действительно может уйти на неправильный IP, но затем TLS-проверка должна остановить атаку, если «не тот» сервер не может предъявить валидный сертификат именно для исходного домена.",{"type":683,"tag":684,"props":775,"children":776},{},[777],{"type":688,"value":778},"Упрощённая последовательность:",{"type":683,"tag":780,"props":781,"children":782},"ol",{},[783,797,809],{"type":683,"tag":784,"props":785,"children":786},"li",{},[787,789,795],{"type":688,"value":788},"Клиент получает IP для ",{"type":683,"tag":716,"props":790,"children":792},{"className":791},[],[793],{"type":688,"value":794},"bank.example",{"type":688,"value":796}," (DNS).",{"type":683,"tag":784,"props":798,"children":799},{},[800,802,807],{"type":688,"value":801},"Клиент устанавливает TLS с IP и проверяет, что сертификат выпущен на ",{"type":683,"tag":716,"props":803,"children":805},{"className":804},[],[806],{"type":688,"value":794},{"type":688,"value":808}," и доверен.",{"type":683,"tag":784,"props":810,"children":811},{},[812],{"type":688,"value":813},"Только после успешной проверки отправляются HTTP-данные (включая логин/пароль) внутри защищённого канала.",{"data":815,"body":816},{},{"type":680,"children":817},[818],{"type":683,"tag":684,"props":819,"children":820},{},[821],{"type":688,"value":18},{"data":823,"body":824},{},{"type":680,"children":825},[826],{"type":683,"tag":684,"props":827,"children":828},{},[829],{"type":688,"value":26},{"data":831,"body":832},{},{"type":680,"children":833},[834,963],{"type":683,"tag":835,"props":836,"children":837},"table",{},[838,868],{"type":683,"tag":839,"props":840,"children":841},"thead",{},[842],{"type":683,"tag":843,"props":844,"children":845},"tr",{},[846,852,857,863],{"type":683,"tag":847,"props":848,"children":849},"th",{},[850],{"type":688,"value":851},"Сценарий",{"type":683,"tag":847,"props":853,"children":854},{},[855],{"type":688,"value":856},"Что наблюдается в браузере",{"type":683,"tag":847,"props":858,"children":860},{"align":859},"right",[861],{"type":688,"value":862},"Может ли утечь логин/пароль",{"type":683,"tag":847,"props":864,"children":865},{},[866],{"type":688,"value":867},"Почему так",{"type":683,"tag":869,"props":870,"children":871},"tbody",{},[872,896,919,941],{"type":683,"tag":843,"props":873,"children":874},{},[875,881,886,891],{"type":683,"tag":876,"props":877,"children":878},"td",{},[879],{"type":688,"value":880},"DNS подменён, у злоумышленника нет валидного сертификата для домена",{"type":683,"tag":876,"props":882,"children":883},{},[884],{"type":688,"value":885},"Ошибка/предупреждение о сертификате, возможна блокировка",{"type":683,"tag":876,"props":887,"children":888},{"align":859},[889],{"type":688,"value":890},"Обычно нет (если не продолжать)",{"type":683,"tag":876,"props":892,"children":893},{},[894],{"type":688,"value":895},"Сертификат не соответствует домену или не доверен, TLS-проверка останавливает соединение",{"type":683,"tag":843,"props":897,"children":898},{},[899,904,909,914],{"type":683,"tag":876,"props":900,"children":901},{},[902],{"type":688,"value":903},"DNS подменён + пользователь подтверждает исключение",{"type":683,"tag":876,"props":905,"children":906},{},[907],{"type":688,"value":908},"Страница открывается несмотря на предупреждение",{"type":683,"tag":876,"props":910,"children":911},{"align":859},[912],{"type":688,"value":913},"Да",{"type":683,"tag":876,"props":915,"children":916},{},[917],{"type":688,"value":918},"Проверка подлинности сервера обойдена, форма отправляется на сервер злоумышленника",{"type":683,"tag":843,"props":920,"children":921},{},[922,927,932,936],{"type":683,"tag":876,"props":923,"children":924},{},[925],{"type":688,"value":926},"DNS подменён + downgrade до HTTP (SSL stripping) и нет HSTS",{"type":683,"tag":876,"props":928,"children":929},{},[930],{"type":688,"value":931},"Открывается HTTP без «замка»",{"type":683,"tag":876,"props":933,"children":934},{"align":859},[935],{"type":688,"value":913},{"type":683,"tag":876,"props":937,"children":938},{},[939],{"type":688,"value":940},"Данные идут без TLS, возможны чтение/подмена и сбор паролей",{"type":683,"tag":843,"props":942,"children":943},{},[944,949,954,958],{"type":683,"tag":876,"props":945,"children":946},{},[947],{"type":688,"value":948},"DNS подменён + у злоумышленника есть валидный ключ/сертификат для домена",{"type":683,"tag":876,"props":950,"children":951},{},[952],{"type":688,"value":953},"«Замок» есть, всё выглядит обычно",{"type":683,"tag":876,"props":955,"children":956},{"align":859},[957],{"type":688,"value":913},{"type":683,"tag":876,"props":959,"children":960},{},[961],{"type":688,"value":962},"TLS защищает канал до владельца соответствующего ключа; при компрометации ключа/доверия атакующий становится «легитимным» для клиента",{"type":683,"tag":684,"props":964,"children":965},{},[966],{"type":688,"value":967},"Отдельно важно: «замок» (HTTPS) не означает «сайт настоящий», он означает «соединение шифруется и аутентифицируется для конкретного имени домена». Поэтому фишинговый домен (похожее имя) может иметь валидный сертификат на своё имя и выглядеть правдоподобно.",{"data":969,"body":970},{},{"type":680,"children":971},[972,977],{"type":683,"tag":684,"props":973,"children":974},{},[975],{"type":688,"value":976},"На стороне клиента критично запрещать «тихое» принятие невалидных сертификатов в приложениях и не игнорировать предупреждения в браузере, поскольку это превращает DNS-подмену в кражу данных.",{"type":683,"tag":684,"props":978,"children":979},{},[980,982,988],{"type":688,"value":981},"Для защиты от downgrade/SSL stripping применяется HSTS: сайт отправляет заголовок ",{"type":683,"tag":716,"props":983,"children":985},{"className":984},[],[986],{"type":688,"value":987},"Strict-Transport-Security",{"type":688,"value":989},", браузер запоминает политику и в дальнейшем принудительно использует HTTPS для домена (и, при настройке, для поддоменов).",{"data":991,"body":992},{},{"type":680,"children":993},[994],{"type":683,"tag":684,"props":995,"children":996},{},[997,999],{"type":688,"value":998},"Пример HSTS-заголовка: ",{"type":683,"tag":716,"props":1000,"children":1002},{"className":1001},[],[1003],{"type":688,"value":1004},"Strict-Transport-Security: max-age=31536000; includeSubDomains; preload",{"data":1006,"body":1007},{},{"type":680,"children":1008},[1009,1014],{"type":683,"tag":684,"props":1010,"children":1011},{},[1012],{"type":688,"value":1013},"На стороне DNS полезен DNSSEC: он позволяет валидатору обнаружить подмену/искажение записей по криптографическим подписям (при корректно настроенной цепочке доверия). Шифрование транспорта DNS (DoH/DoT) защищает приватность запросов и усложняет атаки «на пути», но не является криптографическим доказательством подлинности содержимого DNS-ответа само по себе.",{"type":683,"tag":684,"props":1015,"children":1016},{},[1017],{"type":688,"value":1018},"Актуальные протокольные ориентиры для веба: наиболее распространённый безопасный минимум — TLS 1.2 и TLS 1.3, а устаревшие версии (например, TLS 1.0/1.1) считаются нежелательными. Для реальных рисков также важно управление ключами: компрометация приватного ключа сайта или утечки ключей через подрядчиков/инфраструктуру могут позволить атакующему пройти TLS-проверку даже при правильном HTTPS.",{"data":1020,"body":1021},{},{"type":680,"children":1022},[1023,1033],{"type":683,"tag":684,"props":1024,"children":1025},{},[1026,1031],{"type":683,"tag":748,"props":1027,"children":1028},{},[1029],{"type":688,"value":1030},"Короткий ответ",{"type":688,"value":1032},": при корректной проверке TLS-сертификата в браузере простая DNS-подмена сама по себе обычно не позволяет получить логин/пароль, потому что злоумышленник не сможет корректно «притвориться» нужным доменом на уровне сертификата, и соединение будет прервано или помечено как небезопасное.",{"type":683,"tag":684,"props":1034,"children":1035},{},[1036],{"type":688,"value":1037},"Логин/пароль становятся доступны злоумышленнику, если удаётся обойти проверку подлинности (например, пользователь игнорирует предупреждение, установлен поддельный/корпоративный корневой сертификат, скомпрометирован приватный ключ сайта, получен валидный сертификат для домена атакуемого ресурса или выполнен downgrade до HTTP при отсутствии HSTS).",{"data":1039,"body":1040},{},{"type":680,"children":1041},[1042],{"type":683,"tag":684,"props":1043,"children":1044},{},[1045],{"type":688,"value":52},1775735659032]