Розуміння атрибута javascript:
в Href та його ризиків
Псевдопротокол javascript:
— це механізм у веб-розробці, який дозволяє виконувати JavaScript-код безпосередньо з атрибута href
. Ця поведінка має цікаві нюанси, зокрема стосовно проблем безпеки. Давайте розглянемо, як це працює та чому це може становити ризик, якщо не враховувати важливі моменти.
Як працює javascript:
в Href?
Коли ви встановлюєте javascript:
як значення атрибута href
, браузер оцінює ідентифікатор у тому ж вікні, що й сама сторінка. Ось що відбувається:
- Браузер шукає `
у об'єкті
window`. - Якщо
знайдено в об'єкті `window`, браузер встановлює `body.innerHTML` на значення
. - Якщо
не знайдено, браузер трактує це як простий текст і встановлює `body.innerHTML` на текстове значення
.
Ось простий приклад:
Продовжити
Ризик безпеки: Внедрення шкідливого контенту
Тепер розглянемо потенційно шкідливий URL:
https://target.com?name=&redirect_url=javascript:name
Коли URL кодується, він виглядає так:
https://target.com?name=%3Cimg%20src%20onerror%3Dalert(1)%3E&redirect_url=javascript%3Aname
Якщо користувач натискає кнопку «Продовжити», значення параметра name
із URL встановлюється в body.innerHTML
сторінки. У цьому випадку параметр name
містить шкідливий HTML (``).
Як результат, HTML сторінки перетворюється на:
Ця зміна викликає подію onerror
у тегі img
, що запускає скрипт alert(1)
.
Важлива примітка щодо обробки рядків
Якщо URL javascript:
вказує на властивість window
, наприклад, javascript:prop
, і window.prop = 'alert(1)'
, браузер не виконує JavaScript-код. Натомість він трактує значення як HTML-рядок і оновлює body.innerHTML
відповідно. Така поведінка запобігає безпосередньому виконанню коду, але все ж відкриває сторінку для ризиків, таких як ін'єкція контенту.
Варіації javascript:
Цікаво, що протокол javascript:
не чутливий до регістру. Ви можете написати його різними способами:
javascript:
JaVaScRiPt:
javascript:
Ця гнучкість означає, що розробники повинні враховувати всі потенційні варіації при впровадженні заходів безпеки.
Зниження ризиків
Щоб захистити ваші додатки від цих вразливостей, скористайтеся наступними рекомендаціями:
- Уникайте використання
javascript:
в атрибутах Href: Замість цього використовуйте прослуховувачі подій (Event Listener), щоб обробляти дії програмно. - Очищення введених даних: Завжди очищайте та перевіряйте введені дані користувачем, щоб запобігти ін'єкції шкідливого контенту.
- Політика безпеки контенту (CSP): Впровадьте надійну CSP, щоб обмежити виконання внутрішніх скриптів та несанкціонованих ресурсів.
4.
Екранування даних користувача: Правильно екрануйте дані користувача перед вставкою їх у DOM.
Розуміючи, як працює javascript:
і впроваджуючи відповідні заходи безпеки, ви можете захистити ваші додатки від непередбачених наслідків та потенційних атак.
Перекладено з: javascript:name in href attribute