Cross-Site Scripting [XSS]

1. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅:

На этой страницС ΠΌΡ‹ рассмотрим основныС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ XSS, нСзависимо ΠΎΡ‚ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° Π°Ρ‚Π°ΠΊΠΈ. Однако ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ послСдствия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ XSS-Π°Ρ‚Π°ΠΊΠΈ; для получСния Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ дальнСйшСй эксплуатации этой Π°Ρ‚Π°ΠΊΠΈ, поТалуйста, ΠΏΡ€ΠΎΡ‡Ρ‚ΠΈΡ‚Π΅ эту ΡΡ‚Π°Ρ‚ΡŒΡŽ.

Π”Π°ΠΆΠ΅ Ссли ваш сСрвСр Π·Π°Ρ‰ΠΈΡ‰Π΅Π½, Π»ΡƒΡ‡ΡˆΠ΅ΠΉ мишСнью для Ρ…Π°ΠΊΠ΅Ρ€ΠΎΠ² являСтся Π²Π΅Π±-Π±Ρ€Π°ΡƒΠ·Π΅Ρ€. ΠžΡ‚ΠΊΡ€ΠΎΠ²Π΅Π½Π½ΠΎ говоря, Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ любой JavaScript-ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ появляСтся Π½Π° любой Π²Π΅Π±-страницС. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ мСТсайтовыС скриптовыС Π°Ρ‚Π°ΠΊΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ распространСны, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΡ… Π½Π° Ρ‚Ρ€ΠΈ Ρ‚ΠΈΠΏΠ°:

  • Stored XSS.

  • Reflected XSS.

  • DOM-Based XSS.

2.1. Stored Cross-Site Scripting:

Π₯Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ Π°Ρ‚Π°ΠΊΠΈ - это Π°Ρ‚Π°ΠΊΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Π½Π΅Π΄Ρ€Π΅Π½Π½Ρ‹ΠΉ скрипт постоянно хранится Π½Π° Ρ†Π΅Π»Π΅Π²Ρ‹Ρ… сСрвСрах, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…, Π² Ρ„ΠΎΡ€ΡƒΠΌΠ΅ сообщСний, ΠΆΡƒΡ€Π½Π°Π»Π΅ посСтитСлСй, ΠΏΠΎΠ»Π΅ для ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΠΈ Ρ‚. Π΄. Π—Π°Ρ‚Π΅ΠΌ ΠΆΠ΅Ρ€Ρ‚Π²Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ врСдоносный скрипт с сСрвСра, ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½Π΅Π½Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. Π₯Ρ€Π°Π½ΠΈΠΌΡ‹ΠΉ XSS Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Persistent ΠΈΠ»ΠΈ Type-I XSS.

2.1.1. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ символов HTML:

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ шаг ΠΊ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΡŽ мСТсайтового скриптинга Π² ΠΈΠ΄Π΅Π°Π»Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ экранированиС всСго динамичСского содСрТимого, ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰Π΅Π³ΠΎ ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π» содСрТимоС HTML-Ρ‚Π΅Π³ΠΎΠ², Π° Π½Π΅ вСсь ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ ΠΊΠ°ΠΊ Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ HTML.

Π‘ΠΈΠΌΠ²ΠΎΠ»
ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сущности

&

&

'

'

<

&lt;

>

&gt;

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ экранированиС ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ:

<div class="message">
    <h1> Hello, this is the message:
        &lt;script&gt;alert(&quot;Hey&quot;)&lt;/script&gt;
    </h1>
</div>

Π­Ρ‚ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ экранированных символов происходит, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ построил DOM для страницы, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ‚Π΅Π³. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ мСТсайтовый скриптинг являСтся Ρ‚Π°ΠΊΠΎΠΉ распространСнной ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ, соврСмСнныС Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ, скорСС всСго, ΡƒΠΆΠ΅ ΡΠΊΡ€Π°Π½ΠΈΡ€ΡƒΡŽΡ‚ динамичСский ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ строковыС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² прСдставлСниях ΡΠΊΡ€Π°Π½ΠΈΡ€ΡƒΡŽΡ‚ΡΡ автоматичСски.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ReactJS справляСтся с экранированиСм ΠΎΡ‚Π²Π΅Ρ‚Π°:

const message = "<script>alert('Hey')</script>"

class UserProfilePage extends React.Component {
  render() {
    return (
        <div class="message">
          <h1> Hello, this is the message: {message}!</h1>
        </div>
    );
  }
}

2.1.2. РСализация ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ бСзопасности содСрТимого [CSP]:

ΠœΡ‹ посвятим Ρ†Π΅Π»ΡƒΡŽ страницу всСму, Ρ‡Ρ‚ΠΎ связано с CSP, ΠΎΠ΄Π½Π°ΠΊΠΎ стоит ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ‰ΠΈΠ΅ аспСкты Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ CSP Π·Π°Ρ‰ΠΈΡ‰Π°ΡŽΡ‚ ΠΎΡ‚ мСТсайтового скриптинга.

Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Π΅Π±-сайтам ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ бСзопасности ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ выполнСния JavaScript Π½Π° вашСм сайтС.

Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ простая ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°, которая ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ сцСнарии страницы ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ Π΄ΠΎΠΌΠ΅Π½ΠΎΠΌ (я) ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρƒ, Ρ‡Ρ‚ΠΎ встроСнный JavaScript НЕ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ.

Content-Security-Policy: script-src 'self' https://scripts.github.com

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ бСзопасности содСрТимого вашСго сайта Π² Ρ‚Π΅Π³Π΅ <head> Π² HTML Π²Π΅Π±-страниц.

2.2. ΠžΡ‚Ρ€Π°ΠΆΠ΅Π½Π½Ρ‹ΠΉ мСТсайтовый скриптинг:

ΠžΡ‚Ρ€Π°ΠΆΠ΅Π½Π½Ρ‹Π΅ Π°Ρ‚Π°ΠΊΠΈ - это Π°Ρ‚Π°ΠΊΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Π½Π΅Π΄Ρ€Π΅Π½Π½Ρ‹ΠΉ скрипт отраТаСтся ΠΎΡ‚ Π²Π΅Π±-сСрвСра, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² сообщСнии ΠΎΠ± ошибкС, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ… поиска ΠΈΠ»ΠΈ любом Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΎΡ‚Π²Π΅Ρ‚Π΅, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΌ Ρ‡Π°ΡΡ‚ΡŒ ΠΈΠ»ΠΈ вСсь Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ тСкст запроса.

Когда ΠΆΠ΅Ρ€Ρ‚Π²Π° ΠΎΠ±ΠΌΠ°Π½ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ врСдоносной ссылкС, отправляСт ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ просто просматриваСт врСдоносный сайт, Π²Π½Π΅Π΄Ρ€Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ "ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΡƒΠ΅Ρ‚" Π½Π° уязвимый Π²Π΅Π±-сайт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π°Ρ‚Π°ΠΊΡƒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. ПослС этого Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ выполняСт ΠΊΠΎΠ΄, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ ΠΏΡ€ΠΈΡˆΠ΅Π» с "Π΄ΠΎΠ²Π΅Ρ€Π΅Π½Π½ΠΎΠ³ΠΎ" сСрвСра. ΠžΡ‚Ρ€Π°ΠΆΠ΅Π½Π½Ρ‹ΠΉ XSS Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ нСпостоянным ΠΈΠ»ΠΈ XSS Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

2.2.1. ИзбавлСниС ΠΎΡ‚ динамичСского содСрТимого Π² HTTP-запросах:

2.3. ΠœΠ΅ΠΆΡΠ°ΠΉΡ‚ΠΎΠ²Ρ‹ΠΉ скриптинг Π½Π° основС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° [DOM]:

XSS-уязвимости Π½Π° основС DOM ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚, ΠΊΠΎΠ³Π΄Π° JavaScript ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠΎΠΌ источника, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ URL, ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΈΡ… Π² ΠΏΠΎΠ³Π»ΠΎΡ‚ΠΈΡ‚Π΅Π»ΡŒ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ динамичСскоС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ eval() ΠΈΠ»ΠΈ innerHTML. Π­Ρ‚ΠΎ позволяСт Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ°ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ врСдоносный JavaScript, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, позволяСт ΠΈΠΌ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Π΅ записи Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

Reflected ΠΈ Stored XSS - это ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΈ Π½Π° сторонС сСрвСра, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ DOM-based XSS - это ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΈ Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° (Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°). Π’ случаС Reflected/Stored Π°Ρ‚Π°ΠΊΠ° внСдряСтся Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΎ врСмя ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ запросов Π½Π° сторонС сСрвСра, ΠΊΠΎΠ³Π΄Π° Π½Π΅Π΄ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΉ Π²Π²ΠΎΠ΄ динамичСски добавляСтся Π² HTML. Для DOM XSS Π°Ρ‚Π°ΠΊΠ° внСдряСтся Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΎ врСмя выполнСния нСпосрСдствСнно Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅.

2.3.1. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ уязвимого ΠΊΠΎΠ΄Π°:

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ уязвимая страница с использованиСм HTML5 ΠΈ JavaScript:

function refreshItems() {
    
    const type = (new URL(location.href))
        .searchParams.get('filter')
        .replace('+', ' ');

    const activeItemLink = document.querySelector(`.itemlink[data-type=${type}]`);

    if(activeItemLink) {
        activeTab.classList.add('active');
    }

    // Search items
    const items = type ? data.filter(item => {
        return item.type === type;
    }) : data;

    // Show current type name
    document.getElementById('currentItemName').innerHTML = type; 
    // !!!! no input validation before appending the value to DOM
    // here we basically append the type value to the ODM by passing it 
    // to the innerHTML of the current item.
    
    // Display items
    let itemsHTML = '';

    // To render and update each active item,
    // it is extracted from the URL query parameter filter
    items.forEach(item => {
        itemsHTML == 
        `
            <div>
                <img src="${item.icon}">
                <p>${item.name}</p>
                <p>${item.description}</p>
                <p>${item.owner}</p>
            </div>
        `;
    });

    document.getElementById('list').innerHTML = itemsHTML;
}

document.addEventListener('DOMContentLoaded', () => {
    const itemLinks = document.getElementsByClassName('itemlink');

    itemLinks.foreach(link => {
        link.addEventListener('click', (event) => {
            location.search = `?filter=${event.target.innerText}`;
        });
    });

    refreshItems();
})

Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡƒΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ этой строчкС:

document.getElementById('currentItemName').innerHTML = type; 

ΠœΡ‹ добавляСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ элСмСнта Π² DOM Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π²Π²ΠΎΠ΄Π°, ΠΈ это уязвимо для DOM XSS-ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ссли Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ Π²Π²Π΅Π΄Π΅Ρ‚ Π²Ρ€Π΅Π΄ΠΎΠ½ΠΎΡΠ½ΡƒΡŽ ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΡŽ, листинг нашСго элСмСнта Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ Π΅Π΅.

2.3.2. БмягчСниС:

ΠœΡ‹ послСдуСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Π·Π°Ρ‰ΠΈΡ‚Π½Ρ‹Ρ… Ρ‚Π΅Ρ…Π½ΠΈΠΊ Stored XSS ΠΈ Reflected XSS Π² Ρ‚ΠΎΠΌ смыслС, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ всСх Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ наш ΠΊΠΎΠ΄ - это ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ JavaScript, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ это Π·Π° нас:

function escapeHTML(html) {
    return html
        .replace(/&/g, '&amp;')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt')
        .replace(/</g, '&quot;')
        .replace(/'/g, '&#39;');
}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ, Π° это наш запрос, Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ. Π’ качСствС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ уровня бСзопасности ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ textContext вмСсто innerHTML, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ сам HTML-ΡƒΠ·Π΅Π». ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, textContext Ρ‚Π°ΠΊΠΆΠ΅ экранируСт символы HTML-Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΈ, поэтому ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΈΡ… Π² Π²ΠΈΠ΄Π΅ escaped, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ врСдоносного HTML.

document.getElementById('currentItemName').textContext = escapeHTML(type); 

Last updated