Розуміння атрибута 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