Что помогает предотвратить межсайтовый скриптинг?

A

Android

F513FA9D E73A 45D3 A78C 9DF85980F11B

Межсайтовый скриптинг (XSS) является наиболее распространенной уязвимостью, затрагивающей веб-приложения. Мы видим, что это отражено как в наших собственных данных, так и во всей отрасли. Практика показывает, что поддержка приложения без XSS по-прежнему является сложной задачей, особенно если приложение является сложным. Хотя решения для предотвращения XSS на стороне сервера хорошо известны, межсайтовый скриптинг на основе DOM (DOM XSS) является растущей проблемой. Например, в программе вознаграждений за уязвимости Google DOM XSS уже является наиболее распространенным вариантом.



Это почему? Мы думаем, что это вызвано двумя отдельными проблемами:



XSS легко ввести



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



const templateId = location.hash.match(/tplid=([^;&]*)/)[1];

// ...

document.head.innerHTML += `<link rel="stylesheet" href="./templates/${templateId}/style.css">`



Этот код вводит DOM XSS, связывая контролируемый злоумышленником источник (location.hash) с приемником внедрения (innerHTML). Злоумышленник может воспользоваться этой ошибкой, обманув свою жертву, посетив следующий URL:

https://example.com#tplid="><img src=x onerror=alert(1)>

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



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



XSS сложно обнаружить



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



Глядя только на исходный код, трудно понять, представляет ли он DOM XSS. Недостаточно выполнить поиск файлов .js для чувствительных шаблонов. С одной стороны, чувствительные функции часто используются в различных оболочках, и реальные уязвимости выглядят примерно так.



Иногда даже невозможно определить, уязвима ли кодовая база, только взглянув на нее.



obj [prop] = templateID



Если obj указывает на объект Location и значение prop равно "href", это, скорее всего, DOM XSS, но это можно узнать только при выполнении кода. Поскольку любая часть вашего приложения может потенциально попасть в приемник DOM, весь код должен пройти проверку безопасности вручную, и рецензент должен быть очень осторожен, чтобы обнаружить ошибку. Это вряд ли произойдет.

Trusted Types - это новый API-интерфейс браузера, который может помочь устранить вышеуказанные проблемы в качестве основной причины - и на практике помочь уничтожить DOM XSS.



Доверенные типы позволяют блокировать опасные инъекционные приемники - по умолчанию они перестают быть небезопасными и не могут быть вызваны со строками. Вы можете включить это применение, установив специальное значение в заголовке HTTP-ответа Content Security Policy:



Политика безопасности контента: доверенные типы *

Затем в документе вы больше не можете использовать строки с инъекционными приемниками:



const templateId = location.hash.match (/ tplid = ([^; &] *) /) [1];

// typeof templateId == "строка"

document.head.innerHTML + = templateId //



Выдает ошибку TypeError.

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



const templatePolicy = TrustedTypes.createPolicy ('template', {

createHTML: (templateId) => {

const tpl = templateId;

if (/^[0-9a-z-]$/.test(tpl)) {

return `<link rel =" stylesheet "href =" ./ templates / $ {tpl} /style.css ">`;

}

бросить новый TypeError ();

}

});



const html = templatePolicy.createHTML (location.hash.match (/ tplid = ([^; &] *) /) [1]);

// html instanceof TrustedHTML

document.head.innerHTML + = html;



Здесь мы создаем шаблонную политику, которая проверяет переданный параметр ID шаблона и создает результирующий HTML. Функция политики create * вызывает функцию в соответствующую пользовательскую функцию и оборачивает результат в объект Trusted Type. В этом случае templatePolicy.createHTML вызывает предоставленную функцию проверки templateId и возвращает TrustedHTML с фрагментом <link ...>. Браузер позволяет использовать TrustedHTML с приемником инъекций, который ожидает HTML-подобный innerHTML.



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



if (/^[0-9a-z-]$/.test(tpl)) {/ * разрешить tplId * /}

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



Ограничительные политики



Вы заметили значение *, которое мы использовали в заголовке Content-Security-Policy? Это указывает на то, что приложение может создавать произвольное количество политик, при условии, что каждая из них имеет уникальное имя. Если приложения могут свободно создавать большое количество политик, предотвращение DOM XSS на практике будет затруднено.



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



Политика безопасности контента: шаблон доверенных типов

Это гарантирует, что может быть создана только одна политика с шаблоном имени. Затем эту политику легко идентифицировать в исходном коде, и ее можно эффективно проанализировать. Благодаря этому мы можем быть уверены, что приложение свободно от DOM XSS. Хорошая работа!



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



Начать



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



Чтобы получить это новое поведение на своем сайте, вам необходимо зарегистрироваться в ознакомительной версии «Надежные типы» (в Chrome 73–76). Если вы просто хотите попробовать его локально, начиная с Chrome 73, эксперимент можно включить в командной строке:



chrome --enable-blink-features = TrustedDOMTypes

или же



chrome --enable-экспериментальный-веб-платформа-функции

Кроме того, посетите chrome: // flags / # enable-эксперимент-web-platform-features и включите эту функцию. Все эти параметры включают глобальную функцию в Chrome для текущего сеанса.

Надеемся эта информация была вам полезна!
 
Похожие темы
Admin Интересно Хакеры взломали SplitVPN и доказали, что сервис хранил данные, которые обещал не хранить. Новости в сети 0
Admin Интересно Дипломаты Южной Кореи не смогли защитить свои пароли, что привело к взлому системы МИД. Новости в сети 0
Admin Интересно Стример заявил, что Microsoft удалил взломанный аккаунт, уничтожив данные и игры за 25 лет. Новости в сети 0
Admin Интересно 200 лет назад этот эффект доказал, что свет — волна. Теперь он может лечь в основу компьютеров будущего. Новости в сети 0
Admin UFOLABSNEWS Невесомость медленно меняет мозг космонавтов, что может осложнить миссии на Марс. Новости в сети 0
Admin UFOLABSNEWS Linux в 366 байтах. Конкурс обфусцированного C показал, на что способна простота. Новости в сети 0
Admin UFOLABSNEWS Технический миллионер, мечтающий о бессмертии, обнаружил, что его желудок начал самоперевариваться. Новости в сети 0
Admin UFOLABSNEWS Луна медленно удаляется от Земли, а Солнце стареет — что ждёт нашу планету через миллиарды лет. Новости в сети 0
Admin UFOLABSNEWS Хакер утверждает, что ИИ Claude помог получить VIP-билеты на популярные фестивали бесплатно. Новости в сети 0
Admin UFOLABSNEWS Чёрные дыры — не то, чем кажутся. 7 фактов, после которых придётся пересмотреть всё, что вы думали. Новости в сети 0
Admin UFOLABSNEWS ИИ-компании предлагают заменить промпты автоматическими циклами, что увеличит расходы пользователей. Новости в сети 0
Admin UFOLABSNEWS Эксперимент с козами в Age of Empires II показал, что ChatGPT не обладает сознанием. Новости в сети 0
Admin UFOLABSNEWS Новые расчёты показывают, что Земля может избежать поглощения Солнцем. Новости в сети 0
Admin Интересно Думаете, что сейчас модули ОЗУ дорогие? Просто подождите конца 2026 года. Новости в сети 0
Admin Интересно Киберготовность малого и среднего бизнеса: что определяет успех. Новости в сети 0
Admin Интересно Математика больше не для гениев-одиночек — нобелевский лауреат доказал, что ИИ и толпа справляются с задачами быстрее. Новости в сети 0
Admin Интересно Получили SMS о «сгорающих бонусах»? Значит вас только что попытались ограбить. Новости в сети 0
Admin Интересно Шмели доказали, что маленький мозг может решать сложные задачи. Новости в сети 0
Admin Интересно Гигантская древняя чёрная дыра угрожает перевернуть всё, что мы знаем о рождении Вселенной. Новости в сети 0
Admin Интересно Что нужно учитывать перед использованием ИИ-чатботов для медицинских советов. Новости в сети 0
Admin Интересно Утечка данных OnlyFans: хакеры утверждают, что продают 340 миллионов записей. Новости в сети 0
Admin Интересно Обход ASLR, удалённое выполнение кода и 30 дней тишины. Что известно о новой уязвимости в nginx и почему детали пока засекречены. Новости в сети 0
Admin Интересно Удалил ключ — не значит заблокировал. Исследователи Aikido выяснили, что API-ключи Google продолжают работать до 23 минут после удаления. Новости в сети 0
Admin Интересно Хакеры, нейросети и Найк Борзов. Что покажут на «Дне технологий» в московском кластере «Ломоносов» 30 мая. Новости в сети 0
Admin Интересно Журналист утверждает, что Трамп знает правду о НЛО, но пользователи Reddit сомневаются. Новости в сети 0
Admin Интересно Глава Mistral предупреждает, что у Европы осталось два года, чтобы избежать зависимости от США в сфере ИИ. Новости в сети 0
Admin Интересно Что представляет собой «ловушка Фукидида», о которой предупреждал Си Цзиньпин Трампа. Новости в сети 0
Admin Интересно Уверены, что помните логотип Apple? Попробуйте его нарисовать. Новости в сети 0
Admin Интересно Время — самая надёжная вещь во Вселенной. Физики выяснили, что это, возможно, не так. Новости в сети 0
Admin Интересно Безопасность КИИ: что изменилось и как выстроить защиту. Новости в сети 0
Admin Интересно Цифровые секты питаются нашим страхом: ученые выяснили, что делает радикалов в сети абсолютно неуязвимыми. Новости в сети 0
Admin Интересно Каждая пропущенная угроза в неделю: что 25 миллионов предупреждений говорят о низкоуровневых рисках. Новости в сети 0
Admin Интересно Пять фотографий и мощный компьютер — всё, что нужно мошеннику для создания дипфейка. Новости в сети 0
Admin Интересно Ричард Докинз признал, что ИИ может обладать сознанием. Новости в сети 0
Admin Интересно Искусственный интеллект уже внутри вашей сети. Вы знаете, что он делает?. Новости в сети 0
Admin Интересно 100000 долларов за кроссовки. Рассказываем, что может пойти не так, если доверить покупки искусственному интеллекту. Новости в сети 0
Admin Интересно Власть, влияние, убеждение. Что общего у карьерных амбиций психопатов и нарциссов. Новости в сети 0
Admin Интересно Что скрыто за вымогательством: как работает индустрия ransomware. Новости в сети 0
Admin Интересно Нужен созвон в Zoom? Сканируй глаза и докажи, что ты не робот. Tinder тоже хочет внедрить эту технологию. Новости в сети 0
Admin Интересно Частица, которая спасла бы физику. Стерильное нейтрино искали 30 лет — как жаль, что оно оказалось миражом. Новости в сети 0
Admin Интересно Два криптографа поспорили на $5000: что сломается первым — старая защита интернета или новая. Новости в сети 0
Admin Интересно Ubuntu просит 6 ГБ, Windows 11 — 4 ГБ. Что это значит на самом деле — и кто из них честнее с пользователем. Новости в сети 0
Admin Интересно Что изменилось в списке самых популярных паролей мира. Новости в сети 0
Admin Интересно Чат-боты чаще соглашаются с пользователями, чем люди, что может усиливать конфликты. Новости в сети 0
Admin Интересно 43% сотрудников опасаются, что ИИ лишит их работы. Как страх увольнения убивает эффективность бизнеса. Новости в сети 0
Admin Интересно Что такое SaaSpocalypse и почему облачные гиганты боятся, что клиенты начнут писать код сами. Новости в сети 0
Admin Интересно В systemd добавили проверку возраста, что вызвало споры в Linux-сообществе. Новости в сети 0
Admin Интересно Физики доказали, что теория струн — единственный способ избежать краха законов Вселенной. Новости в сети 0
Admin Интересно Штраф до 1,5 млн и срок до пяти лет. Что ждет майнеров криптовалюты, которые не зарегистрируются в реестре. Новости в сети 0
Admin Интересно Ваш сервер заговорил по-турецки и шлет эмодзи – первые признаки того, что все данные уже украли. Новости в сети 0

Название темы