ΠΠ΅ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ°Π½Π° ΠΊΡΠΈΡΠΈΡΠ½Π° ΡΡΠ·Π²ΠΈΠΌΠΎΡΡ Π² cdnjs ΠΌΡΠ΅ΠΆΠ°ΡΠ° Π·Π° Π΄ΠΎΡΡΠ°Π²ΠΊΠ° Π½Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ Π½Π° Cloudflare, ΠΊΠΎΡΡΠΎ Π΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π΄Π° ΡΡΠΊΠΎΡΠΈ Π΄ΠΎΡΡΠ°Π²ΠΊΠ°ΡΠ° Π½Π° JavaScript Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°ΠΉΠΊΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ΄ Π½Π° CDN ΡΡΡΠ²ΡΡΠΈ. ΠΠΏΠ°ΡΠ½ΠΎΡΡΡΠ° ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ΅ ΡΡΠ΅ΠΆΠ½ΡΠ²Π° ΠΎΡ ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΠΎΠΊΠΎΠ»ΠΎ 12.7% ΠΎΡ Π²ΡΠΈΡΠΊΠΈ ΡΠ°ΠΉΡΠΎΠ²Π΅ Π² ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΡΠ»ΡΠ³Π°ΡΠ° Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ Π½Π° JavaScript Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, Π° ΠΊΠΎΠΌΠΏΡΠΎΠΌΠ΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° ΠΏΡΠ°Π²ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΡΠ½Π°ΡΠ° Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈΡΠ΅, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π΅Π½ΠΈ ΠΎΡ Π½ΡΠΊΠΎΠΉ ΠΎΡ ΡΠ΅Π·ΠΈ ΡΠ°ΠΉΡΠΎΠ²Π΅.
Π£ΡΠ»ΡΠ³Π°ΡΠ° cdnjs ΠΈΠ·ΡΠ΅Π³Π»Ρ ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΎΡ Git ΠΈΠ»ΠΈ NPM Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π° Π²ΡΠ΅ΠΊΠΈ ΡΠ°ΠΉΡ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π±Π΅Π·ΠΏΠ»Π°ΡΠ½ΠΎ ΠΌΡΠ΅ΠΆΠ°ΡΠ° Π·Π° Π΄ΠΎΡΡΠ°Π²ΠΊΠ° Π½Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ Cloudflare, Π·Π° Π΄Π° ΡΡΠΊΠΎΡΠΈ Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° JavaScript Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ. ΠΡΠΈ ΠΈΠ·ΡΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ΄Π° Π½Π° cdnjs ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅, ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½ Π² GitHub, Π±Π΅ΡΠ΅ ΡΠ°Π·ΠΊΡΠΈΡΠΎ, ΡΠ΅ Π·Π° ΡΠ°Π·ΠΎΠΏΠ°ΠΊΠΎΠ²Π°Π½Π΅ Π½Π° NPM ΠΏΠ°ΠΊΠ΅ΡΠΈ Π² tgz Π°ΡΡ ΠΈΠ²ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡΡ ΠΌΠΎΠ΄ΡΠ» archive/tar Π½Π° Π΅Π·ΠΈΠΊΠ° Go, ΠΊΠΎΠΉΡΠΎ ΡΡΠ·Π΄Π°Π²Π° ΡΠΏΠΈΡΡΠΊ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΠΊΠ°ΠΊΡΠΎ Π΅, Π±Π΅Π· Π½ΠΎΡΠΌΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΡΠΈΡΠ°ΡΠ° . Π ΡΠ»ΡΡΠ°ΠΉ, ΡΠ΅ ΡΠΊΡΠΈΠΏΡΡΡ ΡΠ°Π·ΠΎΠΏΠ°ΠΊΠΎΠ²Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° Π΄Π°Π΄Π΅Π½ΠΈΡ ΡΠΏΠΈΡΡΠΊ, Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π² Π°ΡΡ ΠΈΠ²Π° Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΊΠ°ΡΠΎ β../../../../../../../tmp/testβ ΠΌΠΎΠΆΠ΅ Π²ΠΎΠ΄ΡΡ Π΄ΠΎ ΠΏΡΠ΅Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π² ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°, Π΄ΠΎΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ ΠΏΡΠ°Π²Π°ΡΠ° Π·Π° Π΄ΠΎΡΡΡΠΏ.
ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π° ΡΠ΅, ΡΠ΅ Π°ΡΠ°ΠΊΡΠ²Π°ΡΠΈΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΡΡΠ²Π° Π·Π° Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΡΠ²ΠΎΡΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΊΡΠΌ cdnjs ΠΈ Π΄Π° ΠΊΠ°ΡΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ°Π½ Π°ΡΡ ΠΈΠ², ΡΡΠ΄ΡΡΠΆΠ°Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΡΡ Π·Π½Π°ΡΠΈ β../β ΠΏΠΎ ΠΏΡΡΡ ΠΊΡΠΌ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π½Π° NPM. ΠΠ° cdnjs ΡΡΡΠ²ΡΡΠΈΡΠ΅ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ½ΠΎ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ "autoupdate", ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΊΠΎΡΡΠΎ ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΎΡΡΡ ΠΈΠ·ΡΠ΅Π³Π»Ρ Π½ΠΎΠ²ΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½Π°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΈ ΡΠ°Π·ΠΎΠΏΠ°ΠΊΠΎΠ²Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Ρ ΠΏΡΡΠΈΡΠ° β../β, Π½Π°ΠΏΠ°Π΄Π°ΡΠ΅Π»ΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠ΅Π·Π°ΠΏΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΡΡ ΡΠ΅ΡΠ²ΠΈΠ·Π½ΠΈ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ ΠΈ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈ ΡΠ΅Ρ Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° ΡΡΡΠ²ΡΡΠ°, Π½Π° ΠΊΠΎΠΉΡΠΎ Π΅ ΠΈΠ·Π²ΡΡΡΠ΅Π½ΠΎ ΡΠ°Π·ΠΎΠΏΠ°ΠΊΠΎΠ²Π°Π½Π΅ΡΠΎ.
Π ΡΠ»ΡΡΠ°ΠΉ Π½Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ Π½Π° Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΡ Git Π±Π΅ΡΠ΅ ΠΎΡΠΊΡΠΈΡΠΎ, ΡΠ΅ ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΎΡΡΡ, ΠΈΠ·ΡΠ΅Π³Π»ΡΡ Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈΡΠ΅, Π½Π΅ Π΅ Π²Π·Π΅Π» ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ ΡΠΈΠΌΠ²ΠΎΠ»Π½ΠΈΡΠ΅ Π²ΡΡΠ·ΠΊΠΈ ΠΏΡΠΈ ΠΊΠΎΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ Git. Π’Π°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΡ Π½Π°ΠΏΡΠ°Π²ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅ΡΠ΅Π½Π΅ΡΠΎ Π½Π° Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ ΡΡΡΠ²ΡΡΠ° ΡΡΠ΅Π· Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΡΠΈΠΌΠ²ΠΎΠ»Π½ΠΈ Π²ΡΡΠ·ΠΊΠΈ ΠΊΡΠΌ Git.
ΠΠ΅ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΎ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΡΠ½Π°Ρ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈ Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ Π½Π° Ρ Π°ΠΊΠ²Π°Π½Π΅ Π½Π° cdnjs, Π·Π° Π΄Π° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ Π½Π°Π³ΡΠ°Π΄Π° Π² HackerOne ΡΡΠ΅Π· ΡΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° Ρ ΠΈΠΏΠΎΡΠ΅Π·Π°ΡΠ° ΠΎΡΠ½ΠΎΡΠ½ΠΎ ΡΠ΅ΡΠ΅Π½Π΅ΡΠΎ Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. ΠΠΎΠ±Π°Π²Π΅Π½Π° Π΅ ΡΠΈΠΌΠ²ΠΎΠ»Π½Π° Π²ΡΡΠ·ΠΊΠ° test.js ΠΊΡΠΌ Git Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π½Π° JavaScript Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ°, ΠΎΠ±ΡΠ»ΡΠΆΠ²Π°Π½Π° ΡΡΠ΅Π· CDN, ΡΠΎΡΠ΅ΡΠ° ΠΊΡΠΌ ΡΠ°ΠΉΠ»Π° /proc/self/maps. Π‘Π»Π΅Π΄ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½Π΅ Π½Π° Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ°, ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΎΡΡΡ Π½Π° Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΈ ΡΠΎΠ²Π° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π° ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ» Π² cdnjs (test.js Π±Π΅ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½ ΠΊΠ°ΡΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π½Π° Π²ΡΡΠ·ΠΊΠ° ΠΈ ΠΊΠΎΠ³Π°ΡΠΎ ΡΠΎΠ·ΠΈ ΡΠ°ΠΉΠ» Π±Π΅ΡΠ΅ Π·Π°ΡΠ²Π΅Π½, ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° /proc/self/maps Π±Π΅ΡΠ΅ Π²ΡΡΠ½Π°ΡΠΎ ).
ΠΠ°ΠΌΠ΅Π½ΡΠΉΠΊΠΈ ΡΠΈΠΌΠ²ΠΎΠ»Π½Π° Π²ΡΡΠ·ΠΊΠ° ΠΊΡΠΌ ΡΠ°ΠΉΠ»Π° /proc/self/environ, Π°Π²ΡΠΎΡΡΡ Π½Π° ΠΈΠ·ΡΠ»Π΅Π΄Π²Π°Π½Π΅ΡΠΎ Π·Π°Π±Π΅Π»ΡΠ·Π°, ΡΠ΅ Π΄Π°Π΄Π΅Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ ΡΡΠ΄ΡΡΠΆΠ°Ρ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ° GITHUB_REPO_API_KEY ΠΈ WORKERS_KV_API_TOKEN. ΠΡΡΠ²Π°ΡΠ° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° ΡΡΡ
ΡΠ°Π½ΡΠ²Π° API ΠΊΠ»ΡΡΠ° Π·Π° Π΄ΠΎΡΡΡΠΏ Π·Π° Π·Π°ΠΏΠΈΡ Π² Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π½Π° robocdnjs Π² GitHub. ΠΡΠΎΡΠ°ΡΠ° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° ΡΡΡ
ΡΠ°Π½ΡΠ²Π° ΡΠΎΠΊΠ΅Π½Π° Π² KV Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π² cdnjs. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½Π°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, Π½Π°ΠΏΠ°Π΄Π°ΡΠ΅Π»ΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² cdnj ΠΈ Π½Π°ΠΏΡΠ»Π½ΠΎ Π΄Π° ΠΊΠΎΠΌΠΏΡΠΎΠΌΠ΅ΡΠΈΡΠ° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: opennet.ru