Internet Windows Android
Kengaytirish

JavaScript-da statik turdagi tahlil. Facebook Flow Analyzer sinab ko'rilmoqda

Bu JavaScript ilovasi uchun barcha modullar bilan bog'liqlik grafigini yaratuvchi modulli o'ram. Webpack modullarni brauzerni yuklash uchun bir yoki bir nechta kichik paketlarga joylashtiradi. Bundan tashqari, Webpack vazifalarni ishga tushirish vositasi sifatida ishlatilishi mumkin, chunki u modullar orasidagi bog'liqlikni tahlil qiladi va resurslarni (aktivlarni) yaratadi. Loyihangizda Webpack-dan foydalanish haqida ko'proq ma'lumotni bizning sahifamizdan olishingiz mumkin.

  • Grunt - bu ko'p vaqt talab qiladigan takrorlanadigan va vaqt talab qiladigan vazifalarni avtomatlashtirish uchun mo'ljallangan. Uning dasturiy ekotizimida juda ko'p plaginlar mavjud (6000 dan ortiq).
  • Gulp - bu shunchaki vazifa menejeri emas, balki qiziqarli yondashuvga ega vosita: u JavaScript-dagi vazifalarni funktsiyalar sifatida belgilaydi, shuningdek, GUl keng dasturiy ekotizimni (2700 dan ortiq plaginlarni) taklif qilib, og'riqli vazifalarni avtomatlashtiradi, shuningdek, shaffoflik va nazoratni yaxshilaydi. jarayon ustidan.
  • Browserify dastur ishlab chiquvchilarga brauzerlarda NodeJS uslubi modullaridan foydalanish imkonini beradi. Siz bog'liqliklarni aniqlaysiz va Browserify hammasini toza JS fayliga to'playdi.
  • Brunch.io - bu tezlik va soddalikka qaratilgan vositadir. U oddiy konfiguratsiya va batafsil hujjatlar bilan birga keladi tez ishga tushirish... Brunch avtomatik ravishda CSS uslublar jadvallari bilan birga JS fayllari xaritasini yaratadi, bu esa mijoz tomonidan disk raskadrovka qilishni osonlashtiradi.
  • Yeoman deyarli har qanday dasturlash tillari (JavaScript, Python, C #, Java va boshqalar) bilan ishlatilishi mumkin bo'lgan ko'p qirrali vositadir. Bu tayanch tizimi veb-ilovalarni ishlab chiqish uchun boy dasturiy ta'minot ekotizimiga ega (6200 dan ortiq plaginlar) kod ishlab chiqarishdan foydalaniladi. Yeoman yordamida siz mavjudlarini saqlab qolish va yaxshilashni unutmasdan tezda yangi loyihalar yaratishingiz mumkin.
  • IDE va ​​kod muharrirlari

    • Swagger - bu API-larni tavsiflash uchun qoidalar va vositalar to'plami. Asbob tildan mustaqil yordamchi dastur hisoblanadi. Bu shuni anglatadiki, Swagger ham odamlar, ham mashinalar tomonidan o'qilishi mumkin bo'lgan aniq hujjatlarni yaratadi, bu sizga APIga bog'liq jarayonlarni avtomatlashtirishga imkon beradi.
    • JSDoc - bu ko'p sahifali matnli hujjatlarni (HTML, JSON, XML va boshqalar) avtomatik ravishda yaratadigan asboblar to'plami. manba kodi JavaScript-da. Ushbu dastur keng ko'lamli loyihalarni boshqarish uchun foydali bo'lishi mumkin.
    • jGrouseDoc (jGD) - bu ishlab chiquvchilarga JavaScript manba kodidagi izohlardan API yaratish imkonini beruvchi moslashuvchan ochiq manbali vosita. jGD hujjatlari nafaqat o'zgaruvchilar va funktsiyalarni, balki nom maydonlarini, interfeyslarni, paketlarni va boshqa ba'zi elementlarni ham o'z ichiga oladi.
    • YUIDoc - bu NodeJS da yozilgan dastur. Javadoc va Doxygen kabi sintaksisdan foydalanadi. Bundan tashqari, vosita qo'llab-quvvatlashga ega oldindan ko'rish real vaqtda, ilg'or tilni qo'llab-quvvatlash va rivojlangan belgilash.
    • Docco - bu "adabiy" CoffeeScript-da yozilgan bepul hujjatlash vositasi. U kod bilan kesishgan sharhlaringizni ko'rsatish uchun HTML hujjatini yaratadi. Shuni ta'kidlash kerakki, ushbu vosita nafaqat JavaScript-ni, balki boshqa tillarni ham qo'llab-quvvatlaydi. Masalan, Python, Ruby, Clojure va boshqalar.

    Sinov vositalari

    JavaScript-ni sinovdan o'tkazish vositalari kelajakda foydalanuvchi xatolarining oldini olish uchun ishlab chiqish jarayonida xatolarni aniqlash uchun mo'ljallangan. Maxsus ilovalarning murakkabligi oshgani sayin, avtomatlashtirilgan testlar nafaqat ilovalar ish faoliyatini yaxshilaydi, balki kompaniyalarga byudjetni saqlashga yordam beradi.

    • Jasmine - bu JS kodini sinab ko'rish uchun xulq-atvorga asoslangan rivojlanish (BDD) asosidir. Uning tashqi bog'liqligi yo'q va DOM ishlashini talab qilmaydi. Yasemin testni tezroq va osonlashtiradigan toza va sodda sintaksisga ega. Ramka Python va Ruby kodlarini sinab ko'rish uchun ham ishlatilishi mumkin.
    • Mocha - bu brauzerda Node.js da ishlaydigan funktsional test tizimi. U moslashuvchan va aniq hisobotlarni taqdim etish uchun doimiy ravishda testlarni o'tkazadi va asinxron testlarni qiziqarli va oson qiladi. Mocha ko'pincha Chai bilan birgalikda test natijalarini tekshirish uchun ishlatiladi.
    • PhantomJS ko'pincha front-end testlari va birlik testlari uchun ishlatiladi. Bu "boshsiz" WebKitga o'xshash narsa ekanligini hisobga olsak, skriptlar tezroq bajariladi. Shuningdek, u turli veb-standartlar uchun o'rnatilgan yordamni o'z ichiga oladi. Masalan, JSON, Canvas, DOM ishlov berish, SVG va CSS selektorlari.
    • Protractor - bu AngularJS va Angular ilovalarini sinab ko'rish uchun Node.js-da yozilgan uchdan-end sinov tizimi. U WebDriverJS ustiga qurilgan va oxirgi foydalanuvchi kabi ilovalarni maxsus drayverlar va inline hodisalardan foydalangan holda tasdiqlaydi.

    Nosozliklarni tuzatish vositalari

    Kodni disk raskadrovka qilish JavaScript ishlab chiquvchilari uchun mashaqqatli va vaqt talab qiluvchi jarayondir. Nosozliklarni tuzatish vositalari minglab kod satrlari bilan ishlashda ayniqsa foydalidir. Nosozliklarni tuzatish vositalarining aksariyati juda aniq natijalarni beradi.

    • JavaScript Debugger - bu Mozilla Developer Community (MDN) vositasi bo'lib, undan kodni disk raskadrovka qilish uchun mustaqil veb-ilova sifatida foydalanish mumkin. turli xil brauzerlar... Firefox mahalliy va masofaviy xizmatlarni taklif qiladi funksionallik va Android uchun Firefox yordamida Android qurilmasida kodni disk raskadrovka qilish imkoniyati.
    • Chrome Dev Tools - bu JavaScript kodini tuzatish, CSS-ni tahrirlash va ilovalar ish faoliyatini tekshirish uchun bir nechta yordamchi dasturlarni o'z ichiga olgan vositalar to'plami.
    • ng-inspektor - bu ishlab chiquvchilarga AngularJS ilovalarini yozish, tushunish va disk raskadrovka qilishda yordam berish uchun mo'ljallangan o'zaro brauzer kengaytmasi. Yordamchi dastur real vaqt rejimida yangilanishlar, DOMni ta'kidlash, hududlarga, modellarga va ilovaning boshqa elementlariga to'g'ridan-to'g'ri kirish imkonini beradi.
    • Augury - bu kengaytma google brauzeri Chrome va Angular 2 ilovalarini disk raskadrovka qilish. Bu Angular 2 ilovasini ishlab chiquvchilarga ilova tuzilishi va unumdorligini bevosita tahlil qilish hamda o‘zgarishlarni aniqlash imkonini beradi.

    Xavfsizlik vositalari

    • Snyk JavaScript, Java va Ruby ilovalaridagi ma'lum zaifliklarni aniqlash, tuzatish va oldini olish uchun tijorat vositasidir. Xizmat o'zining zaiflik ma'lumotlar bazasiga ega va ma'lumotlarni NSP va NIST NVD dan oladi. Kompaniya tomonidan taqdim etilgan yamalar va yangilanishlar ishlab chiquvchilarga xavfsizlik xavflarini oldindan bilish imkonini beradi.
    • Node Security loyihasi qaramlikni skanerlash va zaifliklarni aniqlash uchun foydali vositalarni taklif etadi. NSP o'zining npm modulini skanerlash asosida qurilgan o'z ma'lumotlar bazasidan, shuningdek, NIST NVD (Milliy zaiflik ma'lumotlar bazasi) kabi umumiy ma'lumotlar bazalari ma'lumotlaridan foydalanadi. Bundan tashqari, NSP GitHub Pull Request va CI dasturlari bilan integratsiyani ta'minlaydi. Shuningdek, Node.js ilovalaridagi zaifliklarni bartaraf etish uchun real vaqt rejimida skanerlash, ogohlantirishlar va tavsiyalar mavjud.
    • RetireJS - bu ochiq manbaga bog'liqlik tekshiruvi. Skaner kabi turli komponentlarni o'z ichiga oladi buyruq qatori, Grunt plagini, Firefox va Chrome kengaytmalari, Burp plaginlari va OWASP ZAP. Retirejs NIST NVD va xato kuzatuvchilari, bloglar va pochta ro'yxatlari kabi boshqa manbalardan zaiflik haqida ma'lumot to'playdi.
    • Gemnasium - bu bepul bo'lgan tijorat vositasi sinov versiyasi... U Ruby, PHP, Bower (JavaScript), Python va npm (JavaScript) kabi turli texnologiyalar va paketlarni qoʻllab-quvvatlaydi. Gemnasium xavfsizlik vositasi bilan birga keladi foydali xususiyatlar, kabi avtomatik yangilash, real vaqtda ogohlantirishlar, xavfsizlik ogohlantirishlari va Slack integratsiyasi.
    • OSSIndex turli xil ekotizimlarni (Java, JavaScript va .NET / C #) va NuGet, npm, Bower, Chocolatey, Maven, Composer, Drupal va MSI kabi ko'plab platformalarni qo'llab-quvvatlaydi. U zaiflik haqida ma'lumotni Milliy zaifliklar ma'lumotlar bazasidan (NVD) va sharhlardan to'playdi. Shuningdek, u hamjamiyat a'zolaridan olingan ma'lumotlarni qayta ishlaydi.

    Analitik va kodni optimallashtirish vositalari

    Kod sifatini tekshirish uchun odatda funktsional test va birlik testiga murojaat qilinadi. Biroq, ishlab chiquvchilarga kod sifatini va uning kodlash standartlariga muvofiqligini tekshirishga imkon beradigan yana bir yondashuv mavjud, ya'ni statik kod tahlili.

    Hozirgi vaqtda zamonaviy dasturiy ta'minot ishlab chiqarish jarayonida past sifatli kodlarni ishlab chiqarishga yo'l qo'ymaslik uchun statik kodni tahlil qilish vositalarini birlashtiradi.

    • JSLint JavaScript kodining sifatini tekshirish uchun veb-tahlil vositasidir. Manbada muammoni aniqlagandan so'ng, u muammoning tavsifi va koddagi taxminiy joylashuvi bilan xabarni qaytaradi. JSLint ba'zi uslub me'yorlarini tahlil qilish va sintaktik xatolar va tizimli muammolarni aniqlashga qodir.
    • JSHint - bu JS kodingizdagi xatolar va potentsial muammolarni aniqlash uchun hamjamiyat tomonidan boshqariladigan moslashuvchan vosita, JSHint esa JSLint vilkasidir. Ushbu statik kodni tahlil qilish vositasining asosiy maqsadi murakkab dasturlarda ishlaydigan JavaScript dasturchilariga yordam berishdir. U sintaksis xatolarini, ma'lumotlar turini yashirin konvertatsiya qilish yoki etishmayotgan o'zgaruvchini aniqlashga qodir. Biroq, u ilovangiz tezligi va to'g'riligini aniqlay olmaydi, shuningdek ilovangizdagi xotira muammolarini aniqlay olmaydi. JSHint - bu JSLint-dan vilka.
    • ESLint JSX va JavaScript veb-ilovalari uchun ochiq manbali linterdir. Bu shubhali naqshlarni aniqlashga yoki muayyan uslublarga mos kelmaydigan kodni topishga yordam beradi. Bu ishlab chiquvchilarga JS kodidagi xatolarni uni bajarmasdan aniqlash imkonini beradi va shu bilan vaqtni tejaydi. Node.js-da yozilgan ushbu vosita npm orqali sezgir ish vaqti va silliq o'rnatishni taklif qiladi.
    • Flow tomonidan ishlab chiqilgan JavaScript uchun statik kod boshqaruvchisi Facebook tomonidan... U kodingizni xatolar uchun tekshirish uchun statik turdagi izohlardan foydalanadi. Turlar ishlab chiquvchilar tomonidan o'rnatiladigan parametrlardir va Flow sizni tekshiradi dasturiy ta'minot talablariga muvofiqligi uchun.

    Versiyani boshqarish vositalari

    • So'nggi yillarda Git kichik va yirik loyihalar uchun keng qo'llaniladigan versiyalarni boshqarish tizimiga aylandi. Ushbu bepul yordamchi dastur ajoyib tezlik va samaradorlikni ta'minlaydi. Uning mashhurligi uning taqsimlangan tizimi va turli xil boshqaruv turlari, shuningdek, versiyalarni oldindan ko'rish va majburiyat tugashidan oldin formatlash mumkin bo'lgan sahna maydoni bilan bog'liq.
    • Subversion vositasi yoki SVN juda mashhur bo'ldi va hali ham Python Apache yoki Ruby kabi ochiq kodli loyihalar va platformalarda keng qo'llaniladi. Ushbu CVS turli xil operatsiyalarni (nomini o'zgartirish, nusxalash, o'chirish va h.k.), birlashtirish, fayllarni blokirovka qilish va boshqalarni boshqarish uchun ko'plab funktsiyalarga ega.

    Paket va qaramlikni boshqarish vositalari

    Roʻyxat eng yaxshi vositalar JavaScript uchun ishlab chiqish cheksiz davom etishi mumkin. Ushbu maqolada siz faqat sifatli mahsulotlar uchun asos bo'lib xizmat qiladigan mashhur va ishonchli vositalarni ko'rdingiz.

    Jamoaning har biri] [kirish testi uchun dasturiy ta'minot va yordamchi dasturlar bo'yicha o'z afzalliklariga ega. Biroz muhokamadan so'ng, biz bilib oldik: tanlov shunchalik farq qiladiki, siz haqiqiy janoblar uchun tasdiqlangan dasturlarni yaratishingiz mumkin. Bu haqda va qaror qildi. Jamoa hodgepodge qilmaslik uchun butun ro'yxat mavzularga bo'lingan. Bugun biz tahlil qilamiz statik kod analizatorlari ilovalar manbalari qo'lingizda bo'lganda zaifliklarni qidirish uchun.

    Dasturning manba kodlarining mavjudligi zaifliklarni qidirishni sezilarli darajada osonlashtiradi. Ilovaga uzatiladigan turli xil parametrlarni ko'r-ko'rona manipulyatsiya qilish o'rniga, ularni qanday qayta ishlashni ko'rish osonroq. Misol uchun, agar foydalanuvchi ma'lumotlari tekshiruvlar va o'zgarishlarsiz uzatilsa, u SQL so'roviga etib boradi, bizda SQL in'ektsiyasi zaifligi mavjud. Agar ular HTML kodida chiqsa, biz klassik XSS ni olamiz. Bunday vaziyatlarni aniq aniqlash uchun statik skaner talab qilinadi, ammo, afsuski, bu har doim ham ko'rinadigan darajada oson emas.

    Zamonaviy kompilyatorlar

    Bu kulgili tuyulishi mumkin, ammo eng samaralilaridan biri kod analizatorlari kompilyatorlarning o'zlari. Albatta, ular butunlay boshqacha narsa uchun mo'ljallangan, lekin bonus sifatida ularning har biri aniqlay oladigan yaxshi manba tekshiruvini taklif qiladi. katta miqdorda xatolar. Nega u qutqarmaydi? Dastlab, kodni bunday tekshirish sozlamalari etarlicha sodiqlik bilan o'rnatiladi: natijada, dasturchini chalkashtirib yubormaslik uchun, kompilyator faqat eng jiddiy muammolar yuzaga kelgan taqdirda qasam ichishni boshlaydi. Ammo behuda - agar siz ogohlantirishlar darajasini yuqoriroq qilib qo'ysangiz, kodda juda ko'p shubhali joylarni qazib olish mumkin. Bu shunga o'xshash narsaga o'xshaydi. Aytaylik, kodda satrni buferga nusxalashdan oldin uning uzunligini tekshirishning etishmasligi mavjud. Skaner satrni (yoki uning fragmentini) uzunligini tekshirmasdan, belgilangan o'lchamdagi buferga ko'chiradigan funksiyani topadi. U argumentlarni o'tkazish traektoriyasini kuzatadi: kiritilgan ma'lumotlardan zaif funktsiyagacha va ko'rinadi: zaif funksiyada to'lib ketishga olib keladigan va undan oldingi tekshiruvlar bilan qisqartirilmaydigan qator uzunligini tanlash mumkinmi? Agar bunday tekshiruv bo'lmasa, biz deyarli 100% bufer toshib ketishini topamiz. Tekshirish uchun kompilyatordan foydalanishdagi asosiy qiyinchilik uni boshqa birovning kodini “yutib yuborishi”dir. Agar siz biror dasturni manbadan kompilyatsiya qilishga urinib ko'rgan bo'lsangiz, unda barcha bog'liqliklarni qondirish qanchalik qiyinligini bilasiz, ayniqsa yirik loyihalarda. Ammo natija bunga arziydi! Bundan tashqari, kompilyatorga qo'shimcha ravishda, kuchli IDE-larda o'rnatilgan boshqa vositalar mavjud kod tahlili... Masalan, keyingi kod qismi Vizual studiya Loopda _alloca funksiyasidan foydalanish haqida ogohlantirish beriladi, bu stekni tezda to'ldirishi mumkin:

    char * b;
    qilmoq (
    b = (char *) _ alloca (9)
    ) esa (1)

    Bu PREfast statik analizatoriga bog'liq. Boshqariladigan kodni tahlil qilish uchun mo'ljallangan FxCop singari, PREfast dastlab mustaqil vosita sifatida tarqatilgan va keyinchalik Visual Studio tarkibiga kirdi.

    RATS - Xavfsizlik uchun qo'pol audit vositasi

    Veb-sayt: www.securesoftware.com
    Litsenziya: GNU GPL
    Platforma: Unix, Windows
    Tillar: C ++, PHP, Python, Ruby

    Xato xato - janjal. Dasturchilarning ba'zi kamchiliklari muhim emas va faqat dasturning beqarorligiga tahdid soladi. Boshqalar esa, o'z navbatida, uzoq serverda qobiq kodini kiritish va o'zboshimchalik bilan buyruqlarni bajarishga ruxsat beradi. Buferni to'ldirishga va boshqa shunga o'xshash hujumlarga ruxsat beruvchi buyruqlar kodingizda ayniqsa xavflidir. Bunday buyruqlar juda ko'p, C / C ++ da bular satrlar bilan ishlash funktsiyalari (xstrcpy (), strcat (), gets (), sprintf (), printf (), snprintf (), syslog ()), tizim buyruqlari ( access (), chown (), chgrp (), chmod (), tmpfile (), tmpnam (), tempnam (), mktemp ()), shuningdek tizim chaqiruv buyruqlari (exec () , tizim (), popen () ). Butun kodni qo'lda o'rganish (ayniqsa, u bir necha ming qatordan iborat bo'lsa) juda zerikarli. Bu siz tekshirilmagan parametrlarni ba'zi funksiyalarga o'tkazishni osongina e'tiborsiz qoldirishingiz mumkinligini anglatadi. Audit uchun maxsus vositalar vazifani sezilarli darajada osonlashtirishi mumkin, shu jumladan taniqli yordamchi dastur kalamush (Xavfsizlik uchun qo'pol audit vositasi) taniqli Fortify kompaniyasidan. U nafaqat C / C ++ da yozilgan kodni qayta ishlashni muvaffaqiyatli bajara oladi, balki Perl, PHP va Python-da skriptlarni qayta ishlay oladi. Foydali ma'lumotlar bazasi ta'sirchan to'plamni o'z ichiga oladi batafsil tavsif koddagi muammoli joylar. Analizator yordamida u o'ziga oziqlangan qoldiqlarni qayta ishlaydi va xatolarni aniqlashga harakat qiladi, shundan so'ng u topilgan kamchiliklar haqida ma'lumot beradi. kalamush Windows va * nix-tizimlarida buyruq satri orqali ishlaydi.

    Yasca

    Veb-sayt: www.yasca.org
    Litsenziya: Ochiq manba
    Platforma: Unix, Windows
    Tillar: C ++, Java, .NET, ASP, Perl, PHP, Python va boshqalar.

    Yasca xuddi RATS-ni o'rnatishning hojati yo'qligi kabi, u nafaqat konsol interfeysiga, balki oddiy grafik interfeysga ham ega. Ishlab chiquvchilar yordamchi dasturni konsol orqali ishga tushirishni tavsiya qiladilar - ular aytadilar, ko'proq imkoniyatlar mavjud. Qizig'i shundaki, Yasca dvigateli PHP 5.2.5 da yozilgan va tarjimon (eng qisqartirilgan versiyada) dastur bilan arxivning pastki papkalaridan birida joylashgan. Butun dastur mantiqiy ravishda old qismdan, skanerlash plaginlari to'plamidan, hisobot generatoridan va dvigatelning o'zidan iborat bo'lib, barcha viteslarni birga aylantiradi. Plaginlar plaginlar katalogiga tashlanadi - u erda ham qo'shimcha plaginlarni o'rnatishingiz kerak. Muhim nuqta! U bilan birga kelgan uchta standart plaginlar Yasca yoqimsiz odatlarga ega. Java .class fayllarini skanerlaydigan JLint resurs/utilita katalogida jlint.exe faylini talab qiladi.Java va C/C++ turlarini tahlil qilish uchun ishlatiladigan ikkinchi plagin antiC, xuddi shu katalogda antic.exe faylini talab qiladi.PMD, Java kodini qayta ishlaydigan Java JRE 1.4 yoki undan yuqori versiyalari oʻrnatilgan boʻlishi kerak. “yasca ./resources/test/” deb yozib, oʻrnatishning toʻgʻriligini tekshirishingiz mumkin. Skanerlash qanday koʻrinishga ega? Yasca natijasini maxsus hisobot shaklida beradi. Masalan, standart GREP plaginlaridan biri zaif konstruktsiyalarni ko'rsatish va bir qator zaifliklarni osongina aniqlash uchun .grep fayllarida tasvirlangan naqshlardan foydalanish imkonini beradi. Bunday naqshlar to'plami allaqachon dasturga kiritilgan: zaif shifrlashni qidirish, "loginga teng parol" bo'yicha avtorizatsiya, mumkin bo'lgan SQL in'ektsiyalari va boshqalar. Hisobotda ko'proq ko'rishni xohlaysiz batafsil ma'lumot, qo'shimcha plaginlarni o'rnatish uchun dangasa bo'lmang. Bitta narsa shundaki, ularning yordami bilan siz qo'shimcha ravishda .NET (VB.NET, C #, ASP.NET), PHP, ColdFusion, COBOL, HTML, JavaScript, CSS, Visual Basic, ASP, Python, Perl da kodlarni skanerlashingiz mumkin.

    Cppcheck

    Sayt:
    Litsenziya: Ochiq manba
    Platforma: Unix, Windows
    Tillar: C ++

    Dasturchilar Cppcheck arzimas narsalarga tarqalmaslikka qaror qildilar va shuning uchun ular faqat qat'iy belgilangan xatolar toifalarini va faqat C ++ kodida ushlaydilar. Dastur kompilyator ogohlantirishlarini takrorlashini kutmang - bu promptersiz ishlaydi. Shuning uchun kompilyator uchun maksimal ogohlantirish darajasini o'rnatish uchun juda dangasa bo'lmang va Cppcheck-dan xotira oqishini, ajratish-ajratish operatsiyalarining buzilishini, turli bufer to'lib ketishini, eskirgan funktsiyalardan foydalanishni va boshqalarni tekshirish uchun foydalaning. Muhim tafsilot: Cppcheck ishlab chiquvchilari noto'g'ri pozitivlar sonini minimal darajada ushlab turishga harakat qilishdi. Shuning uchun, agar dastur xatoni tuzatsa, siz katta ehtimol bilan: "Bu haqiqatan ham shunday!" Siz tahlilni konsol ostidan yoki Qt-da yozilgan va istalgan platformada ishlaydigan yaxshi GUI interfeysidan foydalanib bajarishingiz mumkin.

    gradus

    Veb-sayt: www.justanotherhacker.com/projects/graudit.html
    Litsenziya: Ochiq manba
    Platforma: Unix, Windows
    Tillar: C ++, PHP, Python, Perl

    Ushbu oddiy skript imzolar to'plami bilan birgalikda koddagi bir qator muhim zaifliklarni topishga imkon beradi va qidiruv taniqli grep yordam dasturi yordamida amalga oshiriladi. Bu erda hatto GUI interfeysini eslatib o'tish ham o'rinsiz: hamma narsa konsol orqali amalga oshiriladi. Boshlash uchun bir nechta kalitlar mavjud, ammo eng oddiy holatda parametr sifatida manbalarga yo'lni ko'rsatish kifoya:

    Graudit / yo'l / to / skanerlash

    Mehnatsevarlik uchun mukofot koddagi potentsial foydalanish mumkin bo'lgan joylar haqida rangli hisobot bo'ladi. Aytishim kerakki, skriptning o'ziga qo'shimcha ravishda (bu Bash kodining atigi 100 qatoridan iborat), regexps va potentsial zaif funksiyalarning nomlarini o'z ichiga olgan imzo bazalari. turli tillar... Odatiy bo'lib, Python, Perl, PHP, C ++ uchun asoslar kiritilgan - siz imzolar papkasidan fayllarni olishingiz va o'zingizning ishlanmalaringizdan foydalanishingiz mumkin.

    SWAAT

    Veb-sayt: www.owasp.org
    Litsenziya: Ochiq manba
    Platforma: Unix, Windows
    Tillar: Java, JSP, ASP .Net, PHP

    Agar graudit zaiflik imzosini o'rnatish uchun matnli fayllardan foydalansa, u holda SWAAT- XML ​​fayllaridan foydalangan holda yanada progressiv yondashuv. Oddiy imzo shunday ko'rinadi:

    vuln match - muntazam ifoda qidirish uchun;
    turi - zaiflik turini ko'rsatadi:
    jiddiylik - xavf darajasini ko'rsatadi (yuqori, o'rta yoki past)
    alt - muammoni hal qilish uchun kodning muqobil versiyasi

    SWAAT imzo bazasini o'qiydi va uning yordamida Java, JSP, ASP .Net va PHP manbalarida kodning muammoli joylarini topishga harakat qiladi. Ma'lumotlar bazasi doimiy ravishda yangilanadi va "xavfli" funktsiyalar ro'yxatiga qo'shimcha ravishda, qatorlarni formatlash va SQL so'rovlarini yozishda odatiy xatolarni o'z ichiga oladi. Shunisi e'tiborga loyiqki, dastur C # tilida yozilgan, ammo u .Net platformasining ochiq amalga oshirilishi bo'lgan Mono loyihasi tufayli nixlar ostida ajoyib ishlaydi.

    PHP xatolar skaneri

    Veb-sayt: raz0r.name/releases/php-bug-scanner
    Litsenziya: bepul dastur
    Platforma: Windows
    Tillar: PHP

    Agar siz PHP ilovasining statik tahlilini o'tkazishingiz kerak bo'lsa, sinab ko'rishni tavsiya qilaman PHP xatolar skaneri muallifimiz tomonidan yozilgan - raz0r. Dasturning ishi PHP skriptlarida veb-hujumlar paytida foydalanish mumkin bo'lgan turli funktsiyalar va o'zgaruvchilarni skanerlashga asoslangan. Bunday vaziyatlarning tavsifi oldindan o'rnatish deb ataladigan shaklda tuzilgan va dastur allaqachon toifalar bo'yicha guruhlangan 7 ta maxsus oldindan sozlashni o'z ichiga oladi:

    • kodning bajarilishi;
    • buyruqni bajarish;
    • kataloglarni o'tkazish;
    • globallar ustidan yozish;
    • o'z ichiga oladi;
    • SQL-in'ektsiyasi;
    • har xil.

    Qizig'i shundaki, dastur PHP/WinBinder da yozilgan va bamcompile tomonidan tuzilgan, shuning uchun u oddiy Windows ilovasi bilan bir xil ko'rinadi. Qulay interfeys orqali pentester ma'lum zaifliklar mavjudligi uchun kod tahlilini yoqishi yoki o'chirishi mumkin.

    Pixy

    Veb-sayt: pixybox.seclab.tuwien.ac.at
    Litsenziya: bepul dastur
    Platforma: Unix, Windows
    Tillar: PHP

    Asbob manba kodini skanerlash va ma'lumotlar oqimlarining grafiklarini yaratishga asoslangan. Ushbu grafik dasturdan tashqaridan - foydalanuvchidan, ma'lumotlar bazasidan, ba'zi tashqi plaginlardan va hokazolardan keladigan ma'lumotlar yo'lini kuzatadi. Shunday qilib, ilovalardagi zaifliklar (yoki kirishlar) ro'yxati tuziladi. Zaiflikni tavsiflovchi naqshlardan foydalanib, Pixy bunday nuqtalarni tekshiradi va XSS va SQL zaifliklarini aniqlash imkonini beradi. Bundan tashqari, tahlil paytida yaratilgan grafiklarning o'zlarini grafiklar papkasida ko'rish mumkin (masalan, xss_file.php_1_dep.dot) - bu nima uchun ma'lum bir kod qismi Pixy-ga zaif deb hisoblanishini tushunish uchun juda foydali. . Umuman olganda, ishlanmaning o'zi juda informatsion bo'lib, statik kodni tahlil qilish uchun ilg'or yordamchi dasturlar qanday ishlashini ko'rsatadi. Hujjatlar sahifasida ishlab chiquvchi dasturning turli bosqichlari haqida aniq gapiradi, ma'lum bir kod qismini dastur tomonidan qanday tahlil qilinishi kerakligining mantiqiy va algoritmini tushuntiradi. Dasturning o'zi Java-da yozilgan va ochiq manbada tarqatiladi va bosh sahifada XSS zaifliklari uchun kodni tekshirish uchun oddiy onlayn xizmat ham mavjud.

    Untsiya 6

    Veb-sayt: www.uncelabs.com/products
    Litsenziya: Shareware
    Platforma: Windows

    Afsuski, mavjud bepul echimlar hali ham tijorat hamkasblaridan pastroq. Hisobotning sifati va tafsilotlarini o'rganish kifoya, ya'ni Untsiya 6- va nima uchun tushuning. Dastur Ounce Core maxsus tahlil mexanizmiga asoslangan bo'lib, u taniqli xavfsizlik kompaniyalari, xakerlar hamjamiyatining tajribasini to'plagan professional pentesters jamoasi tomonidan tuzilgan qoidalar va siyosatlarga muvofiqligini tekshiradi. xavfsizlik standartlari. Dastur koddagi turli zaifliklarni aniqlaydi: bufer to'lib ketishidan tortib SQL in'ektsiyasigacha. Agar so'ralsa, Ounce amalga oshirish uchun mashhur IDElar bilan osongina integratsiyalanadi avtomatik tekshirish ishlab chiqilgan ilovaning har bir yangi tuzilishini yaratish jarayonida kod. Aytgancha, ishlab chiquvchi kompaniya - Ounce Labs - shu yozda IBMning o'zi tomonidan sotib olingan. Demak, mahsulot IBM tijoriy ilovalaridan biri sifatida rivojlanishda davom etishi mumkin.

    Klocwork tushunchasi

    Veb-sayt: www.klocwork.com
    Litsenziya: Shareware
    Platforma: Windows
    Tillar: C ++, Java, C #

    Uzoq vaqt davomida bu tijorat mahsuloti faqat C, C+ va Java uchun statik kodni skanerlashni amalga oshirdi. Ammo Visual Studio 2008 va .NET Framework 3.5 chiqishi bilanoq, ishlab chiquvchilar C # ni qo'llab-quvvatlashlarini e'lon qilishdi. Men dasturni ikkita yordamchi loyiham bo'yicha ishga tushirdim, ularni tezda "Sharp" da yozdim va dastur 7 ta muhim zaiflikni aniqladi. Ular faqat ichki foydalanish uchun yozilgani yaxshi :). Klocwork tushunchasi dastlab, birinchi navbatda, integratsiyalashgan rivojlanish muhitlari bilan birgalikda ishlash uchun tuzilgan. Xuddi shu Visual Studio yoki Eclipse bilan integratsiya juda muvaffaqiyatli - siz bunday funksiyalar sukut bo'yicha ularda amalga oshirilishi kerak deb jiddiy o'ylay boshlaysiz :). Agar siz dastur mantig'i bilan bog'liq muammolarni va ishlash bilan bog'liq muammolarni hisobga olmasangiz, unda Klocwork tushunchasi bufer to'lib ketishi, maxsus kod filtrlashning yo'qligi, SQL / Path / saytlararo in'ektsiya qobiliyatlari, zaif shifrlash va boshqalarni topish bo'yicha ajoyib ishni bajaradi. Yana bir qiziqarli variant - bu tezda tushunishga imkon beruvchi dasturni bajarish daraxtini qurish umumiy tamoyil ilovaning ishlashi va alohida kuzatib borish, masalan, har qanday foydalanuvchi kiritishini qayta ishlash. Va hatto kodni tekshirish qoidalarini tezda qurish uchun maxsus vosita taklif etiladi - Klocwork Checker Studio.

    Statik tahlilning oldini olish

    Veb-sayt: www.coverity.com/products
    Litsenziya: Shareware
    Platforma: Windows
    Tillar: C ++, Java, C #

    C / C ++, Java va C # kodlari uchun eng mashhur statik analizatorlardan biri. Uning yaratuvchilariga ko'ra, yechim butun dunyo bo'ylab 100 000 dan ortiq dasturchilar tomonidan qo'llaniladi. Murakkab mexanizmlar xotira oqishini, qo'lga kiritilmagan istisnolarni, ishlash muammolarini va, albatta, xavfsizlik zaifliklarini qidirishni avtomatlashtirishga imkon beradi. Mahsulot turli platformalarni, kompilyatorlarni (gcc, Microsoft Visual C++ va boshqalar) qo'llab-quvvatlaydi, shuningdek, turli ishlab chiqish muhitlari, birinchi navbatda Eclipse va Visual Studio bilan integratsiyalashgan. Kodlarni o'tkazishning markazida boshidan oxirigacha bo'lgan ahmoqona harakat algoritmlari emas, balki dasturning filialga duch kelganidan keyin turli vaziyatlarda qanday harakat qilishini tahlil qiluvchi tuzatuvchiga o'xshash narsa. Shunday qilib, 100% kod qamroviga erishiladi. Bunday murakkab yondashuv, boshqa narsalar qatori, ko'p yadroli protsessorlarda ishlash uchun maxsus optimallashtirilgan ko'p bosqichli ilovalarni to'liq tahlil qilish uchun talab qilindi. Coverity Integrity Center poyga sharoitlari (ko'p vazifali tizimdagi dizayn xatosi, tizimning ishlashi kodning qismlari bajarilish tartibiga bog'liq), o'liklarni blokirovka qilish va boshqalar kabi xatolarni topishga imkon beradi. Nega reversatorlar bunga muhtoj? Firefox va IE uchun 0day ishlab chiquvchilaridan so'rang :).

    OWASP kod tekshiruvi

    Veb-sayt: www.owasp.org
    Litsenziya: GNU GPL
    Platforma: Windows
    Tillar: Java, C#, VB

    Ushbu vositani yaratuvchisi Alessio Marziali ikkita ASP.NET kitobining muallifi, moliya sektori uchun yuqori yuklangan ilovalar uchun nufuzli koder va pentester hisoblanadi. 2007-yilda u 27 ta Italiya hukumati veb-saytlarida muhim zaifliklar haqidagi ma’lumotlarni e’lon qildi. Uning miyasi - OWASP kod tekshiruvi- .NET va J2EE / JAVA kodlarini statik tahlil qilish uchun mo'ljallangan, Internetda ochiq va yil oxirida muallif chiqarishni va'da qiladi. yangi versiya ko'proq funktsional imkoniyatlarga ega dasturlar. Lekin eng muhimi allaqachon amalga oshirilgan - C#, Visual Basic va Java-dagi manbalarni tahlil qilish. Skanerlanadigan fayllar GUI orqali tanlanadi va skanerlash avtomatik ravishda boshlanadi. Kodning har bir muammoli boʻlimi uchun “Tahdid tavsifi” boʻlimida zaiflik tavsifi koʻrsatiladi. To'g'ri, maydon OWASP ko'rsatmalari, ehtimol muammoni hal qilish yo'llarini ko'rsatuvchi, afsuski, hali mavjud emas. Buning o'rniga siz masofaviy skanerlash ilovasida mavjud bo'lgan masofaviy mashinada kodni skanerlashning eksperimental xususiyatidan foydalanishingiz mumkin. Muallif ushbu xususiyatni jiddiy ravishda yaxshilashni va xususan, dasturning manba kodini to'g'ridan-to'g'ri versiyani boshqarish tizimidan tahlil qilish uchun jamlashni va'da qiladi.

    OGOHLANTIRISH

    Ma'lumotlar faqat ma'lumot olish uchun taqdim etiladi va birinchi navbatda, ishlab chiquvchilar qanday qilib oldini olish mumkinligini ko'rsatadi tanqidiy xatolar dasturni ishlab chiqish jarayonida. Muallif ham, tahririyat ham olingan bilimlardan noqonuniy maqsadlarda foydalanish uchun javobgar emas.

    ALEKSANDR MAYOROV, dasturchi, dasturlash bo'yicha 11 yillik tajribaga ega, shundan etti yilini u mobil qurilmalarni ishlab chiqishga bag'ishlagan

    JavaScript-da statik tip tahlili
    Facebook Flow Analyzer sinab ko'rilmoqda

    Facebook yangi ochiq kodli Flow loyihasini taqdim etdi - JavaScript uchun statik kod analizatori. Analizatorni ishlab chiqishning asosiy maqsadi xatolarni qidirishni soddalashtirishdir.

    Bundan tashqari, Flow shakldagi vositalarni taqdim etadi sintaktik kengayish Turlarni aniq belgilash uchun TypeScript uslubidagi JavaScript. ECMAScript 6 spetsifikatsiyasida kiritilgan ko'plab yangi xususiyatlar qo'llab-quvvatlanadi.

    Dasturlash tillarida matn terish mavzusi ko'pincha ko'rib chiqiladi. Bu holivarlarning mavzusi va ma'lum bir tilning ijobiy yoki salbiy xususiyatlarini aniqlash. So'nggi paytlarda JavaScript-da yozish haqida ko'p gapirilmoqda. Kimgadir bu xuddi shunday yoqadi. Boshqa dasturlash tillari bilan tanish bo'lgan odamlar, ayniqsa kuchli aniq terishga ega bo'lganlar, bu yondashuvni "maymun qo'lidagi granata" deb hisoblashadi. Biz hammamiz bilamizki, JavaScript erkin dinamik tarzda yozilgan tildir. Front-end ishlab chiqish guruslari bundan o'z foydalari uchun qanday foydalanishni o'rgandilar, ammo kod ba'zan tushunish uchun juda og'ir. JavaScript dasturlash dunyosiga endigina kelganlar tarjimon qiladigan sehrdan hayratda qolishadi va ko'pincha xatolarni ko'zdan kechirishadi. Biroq, avvalo, umuman yozish haqida bir oz ko'rib chiqaylik. Bu qanday?

    Dasturlash tillarida yozish

    Yozish orqali dasturlash tillari ikkita katta lagerga bo'linadi - terilgan va yozilmagan. Masalan, terilgan tillarga C, Python, PHP, Lua, JavaScript kabi tillar kiradi. Tiplanmagan tillarga misollar: assembler, Forth, Brainfuck. Ha Ha aniq. JavaScript, boshqa ko'plab talqin qilinadigan tillar kabi, teriladi. Shuning uchun, hech qanday holatda uni yozilmagan deb aytmang. Ayniqsa, ish intervyularida.

    O'z navbatida, yozilgan tillar bir-biriga o'xshash bir nechta toifalarga bo'linadi:

    • Statik yoki dinamik tarzda yoziladi.
    • Kuchli yoki erkin yozilgan.
    • Aniq yoki bilvosita yozilgan.

    Statik tarzda yozilgan tillar

    Statik yozish bilan o'zgaruvchilar va funktsiyalarning yakuniy turlari kompilyatsiya vaqtida o'rnatiladi. Kompilyator sizning turdagi nomuvofiqlik xatolaringizni dastur boshlanishidan oldin tuzatadi. Tillarga misollar: C, Java, C #.

    Dinamik terilgan tillar

    Dinamik yozishda barcha turlar ish vaqtida aniqlanadi. Va agar siz xato qilsangiz, bu haqda faqat dasturni ishga tushirganingizda bilib olasiz. Shuning uchun, dinamik ravishda yozishda xatolarni tekshirish va ushlashga alohida e'tibor berish juda muhimdir. Tillarga misollar: JavaScript, PHP, Python, Ruby.

    Kuchli yozish (kuchli)

    Kuchli yozilgan tillar iboralarda har xil turlarni aralashtirishga yo'l qo'ymaydi va avtomatik yashirin konvertatsiyalarni amalga oshirmaydi. Masalan, satrdan raqamni yoki boshqa turni ayirib bo'lmaydi. Tillarga misollar: Java, Python, Haskell, Lisp.

    Laks yozish (zaif)

    Bo'shashgan tillar avtomatik ravishda ko'plab yashirin konvertatsiyalarni amalga oshiradi. Ular buni aniqlik yoki konvertatsiya yo'qolishi mumkin bo'lsa ham, noaniq tarzda bajaradilar. Tillarga misollar: PHP, JavaScript, Visual Basic.

    Aniq yozish

    Aniq terilgan tillarda yangi o'zgaruvchilar / funksiyalar va argumentlar turi aniq ko'rsatilishi kerak. Tillarga misollar: C ++, D, C #.

    Yashirin yozish

    Yashirin terishga ega bo'lgan tillarda turlarni ko'rsatish vazifasi kompilyator/tarjimonga o'tkaziladi. Tillarga misollar: JavaScript, PHP, Lua. Bunday tillarda, qoida tariqasida, ob'ektlar turiga aylantirilganda chaqiriladigan maxsus usullarga ega. Masalan, PHP da _toString () usuli, JavaScriptda esa xuddi shu nomdagi, lekin pastki chiziqsiz - toString () usuli mavjud. Ushbu usullar ob'ekt satr turiga o'tkazilganda chaqiriladi. Ba'zan bunday usullar sehr deb ataladi (har qanday yashirin jarayonlar har doim sehrdir).

    Shuni ta'kidlash kerakki, ushbu toifalarning barchasi bir-biriga mos keladi. Ushbu toifalarga asoslanib, biz JavaScript-ni dinamik ravishda aniq terilganligini ko'ramiz. Va agar biz bo'rttirib gapiradigan bo'lsak, unda tilning tabiatini quyidagicha ta'riflash mumkin: har qanday tushunarsiz vaziyatda hamma narsani ibtidoiylarga, asosan, chiziqqa keltiring. Garchi aslida hamma narsa biroz murakkabroq bo'lsa-da, biz hozir tafsilotlarga kirmaymiz.

    "Nega bizga yozish kerak?" - deb so'rashingiz mumkin. JavaScript 20 yil davomida usiz yaxshi yashadi. Javob oddiy: JavaScript hech qachon korporativ darajadagi murakkab muammolarni hal qilish uchun ishlatilmagan. Endi bu til brauzerdan tashqariga chiqdi va backend hududiga kirdi. Katta hajmdagi dasturni yozishda ko'pincha kasting bilan bog'liq bo'lgan xatolarni aniqlash qiyin bo'ladi.

    JavaScript plaginlari

    JavaScript mijoz tomonida (brauzerlarda) bajarilganligi sababli, muammoni hal qilish variantlaridan biri JS ga kompilyatsiya qilinadigan til - dialektni yaratishdir. U assembler vazifasini bajaradi.

    TypeScript, Dart, AtScript kabi tillar paydo bo'ldi, ular statik kuchli yozishni va hatto ish vaqti turini tekshirishni qo'shadi (garchi bu qo'shimcha yuk bo'lsa ham). Bu tillarning barchasi nafaqat turlarni, balki sintaktik shakarni yoki hatto JS-da yozilgan o'zlarining VM-ni qo'shishlarini ham qo'shadilar.

    To'liq maqolani "Tizim administratori" jurnalining 2015 yil uchun 1-2-sonli 86-88-betlarida o'qing.

    Ushbu nashrning PDF-versiyasini do'konimizdan xarid qilish mumkin.

    1. Flow veb-sayti - http://flowtype.org.

    Bilan aloqada

    Xavfsiz JavaScript ilovalarini ishlab chiqish juda qiyin ishdir. Lekin juda mumkin. Bugungi maqolada biz JavaScript-ning xavfsizlik muammolarini keltirib chiqaradigan xususiyatlarini ko'rib chiqamiz va ularni oldini olishga qanday yordam berish haqida gaplashamiz.

    Nima uchun xavfsiz JS kodini yozish qiyin

    Shunday qilib, JS-da xavfsiz kod yozish qiyin bo'lgan 5 ta sabab

    Kompilyator yordam bermaydi

    JavaScript talqin qilinadigan tildir. Bu shuni anglatadiki, kompilyator har doim biror narsadan shikoyat qilmaydi, ishlashdan bosh tortadi va sizni xatolarni tuzatishga va kodingizni optimallashtirishga undaydi.

    Dinamik JavaScript

    JavaScript dinamik, zaif terilgan va asinxrondir. Va bularning barchasi muammoga duch kelish osonroq ekanligini ko'rsatadi.

    1. Eval kabi til vositalari va skript src orqali uchinchi tomon kodini o'z ichiga olgan holda, satrlarni ish vaqtida bajarishga imkon beradi. Natijada, kodning ma'lum bir tarzda harakat qilishiga "statik kafolatlar" berish qiyin. Bu dinamik tahlilni ham qiyinlashtiradi (ilmiy ishlarga qarang).

    Eval dan foydalanish

    2. Zaif matn terish statik tahlilning o'rnatilgan usullarini qo'llash oson emasligiga olib keladi - hech bo'lmaganda statik tarzda yozilgan tillar (masalan, Java) bilan solishtirganda.

    3. Asinxron qayta qo'ng'iroqlar, qaysi JavaScript setTimeout va XMLHttpRequest (juda mashhur AJAX) kabi mexanizmlar orqali qo'ng'iroqlarga ruxsat beradi, statistik jihatdan eng hiyla-nayrang xatolarni yashiradi.

    Murakkab JS xususiyatlari

    Yillar davomida juda ko'p narsalar JavaScript-ga tortilmagan! Xususan, uning prototiplari, birinchi darajali funktsiyalari va yopilishi mavjud. Ular tilni yanada dinamik qiladi va xavfsiz kod yozishni qiyinlashtiradi.

    1. Prototiplar. Ularning ma'nosi shundaki, dasturlar ob'ektga yo'naltirilgan yondashuv ruhida, lekin sinflardan foydalanmasdan yoziladi. Ushbu yondashuv bilan ob'ektlar o'zlariga kerak bo'lgan xususiyatlarni bevosita boshqa ob'ektlardan (prototiplar) meros qilib oladilar. Bunday holda, JSdagi prototiplar ish vaqtida qayta belgilanishi mumkin. Va agar bu bekor qilinsa, effekt darhol bekor qilingan prototipning xususiyatlarini meros qilib olgan barcha ob'ektlarga tarqaladi.

    Prototiplar qanday qayta ishlanadi

    Adolat uchun shuni aytish kerakki, yangi ECMAScript spetsifikatsiyalarida sinflar ham mavjud.

    2. Birinchi sinf funksiyalari. JS juda moslashuvchan ob'ekt va funktsiya modeliga ega. Ob'ekt xususiyatlari va ularning qiymatlari ish vaqtida yaratilishi, o'zgartirilishi yoki o'chirilishi mumkin va ularning barchasiga birinchi darajali funktsiyalar orqali kirish mumkin.

    3. Yopishlar. Agar siz boshqa funktsiya ichida funktsiyani e'lon qilsangiz, birinchisi oxirgisining o'zgaruvchilari va argumentlariga kirish huquqiga ega bo'ladi. Bundan tashqari, bu o'zgaruvchilar mavjud bo'lishda davom etadi va ichki funktsiya uchun mavjud bo'lib qoladi - hatto bu o'zgaruvchilar aniqlangan tashqi funktsiya tugagandan keyin ham.

    JavaScript-ning bunday moslashuvchanligi va dinamikligi tufayli (1 va 3-bandlarga qarang), statik tahlilda mavjud bo'lgan barcha ob'ekt xususiyatlari to'plamini aniqlash hal qilib bo'lmaydigan vazifadir. Biroq, veb-ishlab chiquvchilar tilning dinamik xususiyatlaridan keng foydalanadilar va shunga mos ravishda kodni tahlil qilishda ularni e'tiborsiz qoldirib bo'lmaydi. Aks holda, xavfsizlik kafolati nima?

    JavaScript va DOM o'rtasidagi yaqin aloqa

    Bu ish vaqtida uzluksiz veb-sahifani yangilashni ta'minlash uchun qilingan. DOM standart ekanligi ma'lum ob'ekt modeli, ko'rsatish uchun mo'ljallangan platforma-neytral va til-neytral HTML hujjatlari va XML. DOM ko'rsatilgan hujjat bilan ishlash uchun o'z API-ga ega: ko'rsatilgan hujjatga dinamik kirish, ko'chirish va yangilash (uning mazmuni, tuzilishi va uslubi). DOMga o'zgartirishlar JavaScript orqali dinamik ravishda amalga oshirilishi mumkin. Va bu o'zgarishlar darhol brauzerda ko'rsatiladi.

    DOM tufayli brauzerga yuklangan veb-sahifalar serverdan ma'lumotlar yuklanganda bosqichma-bosqich yangilanishi mumkin. Biroq, bu qulaylikning salbiy tomoni bor: JS va DOM o'rtasidagi dinamik aloqa uchun mas'ul bo'lgan kod parchalari, ayniqsa, xatolarga moyil.

    Veb-ilovalardagi eng keng tarqalgan xatolar

    Murakkab hodisalarning o'zaro ta'siri

    JavaScript - bu voqealarga asoslangan til. Bu ishlab chiquvchilarga ro'yxatdan o'tish imkonini beradi DOM tugunlari"voqea tinglovchilari" deb atalmish - voqea tinglovchilari. Aksariyat hodisalar foydalanuvchi harakatlari bilan qo'zg'atilgan bo'lsa-da, ularsiz ishga tushirilishi mumkin bo'lgan ba'zilari bor, masalan, vaqtli hodisalar va asinxron qo'ng'iroqlar. Bunday holda, har bir hodisa DOM daraxti bo'ylab aks-sado berishi va bir vaqtning o'zida bir nechta "tinglovchilarni" faollashtirishi mumkin. Ba'zan bularning barchasini kuzatib borish arzimas ish emas.

    Voqealar qanday ko'rib chiqiladi

    Shu sabablarga ko'ra JS kodini tushunish, tahlil qilish va sinab ko'rish qiyin bo'lishi mumkin. Maxsus yordamchi dasturlar veb-ishlab chiquvchining hayotini osonlashtiradi va xavfsiz kod yozishga yordam beradi.

    JS sinov yordamchi dasturlari

    Tahlil qilish (masalan, Esprima, Rhino), optimallashtirish (masalan, Google Closure Compiler) va umumiy foydalanish uchun statik kod tahlili uchun yordamchi dasturlar mavjud. sintaktik xatolar(JSHint kabi).

    Bundan tashqari, veb-ishlab chiquvchilarga JS kodini testlar bilan qoplashga yordam beradigan bir nechta tasdiqlangan ramkalar mavjud. Ular orasida:

    • QUnit - mashhur birliklarni sinovdan o'tkazish tizimi;
    • Yasemin - kod sinovi uchun xulq-atvorga asoslangan rivojlanish (BDD) ramkasi;
    • Mocha - bu Node.js va brauzerda ishlaydigan kod sinovi tizimi.
    • jsTestDriver - bu boshqa narsalar qatori bir vaqtning o'zida bir nechta brauzerlarda testlar to'plamini o'tkazishi mumkin bo'lgan ramka.

    Bundan tashqari, brauzer xatti-harakatlariga taqlid qiluvchi va sinov holatlarini avtomatik ravishda ishga tushirishga imkon beruvchi sinov ramkalari mavjud. Ular, ayniqsa, JS va DOM o'rtasidagi o'zaro aloqa uchun mas'ul bo'lgan kod bo'limlarini disk raskadrovka qilishda foydalidir va DOMni manipulyatsiya qilish uchun qulay infratuzilmani ta'minlaydi.

    Masalan, Selenium, PhantomJS va SlimerJS API-ni taqdim etadi, bu orqali siz brauzer misollarini ishga tushirishingiz va ular bilan ishlashingiz mumkin. API orqali siz voqealar va kirishni faollashtirishingiz mumkin DOM elementlari to'g'ridan-to'g'ri ish vaqtida - ya'ni kodni real sharoitlarga imkon qadar yaqin sharoitlarda sinab ko'rish. Albatta, ko'p ishlarni qo'lda bajarish kerak bo'ladi, lekin bu ham sinovda yaxshi yordam beradi.

    Statik tahlil uchun yordamchi dasturlar

    Ilgari kodning muammoli bo'limlarini aniqlash uchun yordamchi dasturlar statik analizatorlar edi. Ya'ni, JS ning barcha dinamik xususiyatlarini hisobga olgan holda, faqat cheklangan yordam berishi mumkin edi. Biroq, ular tahlil qilishda ham foydali bo'lishi mumkin. Mana bir nechta asosiy misollar.

    WARI - bu JS funktsiyalari o'rtasidagi bog'liqlikni tekshiradigan statik analizator, CSS uslublari, HTML teglari va tasvirlar. Ushbu yordamchi dasturning maqsadi statik tahlil paytida foydalanilmagan resurslarni topishdir. Biroq, WARI dinamikasi, albatta, bardosh bera olmaydi.

    JSLint - bu JavaScript-ning o'zida yozilgan statik kod tahlili yordam dasturi. U kodni yaxshi amaliyotga qarshi tekshiradi.

    Google Closure Compiler - bu JS optimallashtiruvchisi bo'lib, kodni tezroq va ixchamroq qilish uchun avtomatik ravishda qayta yozadi. Shu bilan birga, barcha sharhlar va kodning foydalanilmagan bo'limlari quvurga uchib ketadi.

    WebScent (ilmiy ishlarga qarang) - ilg'or statik analizator. O'z ishida u mijozning JS kodi (brauzerga yuklangan) umuman server tomonida saqlanmasligi, balki butun server kodiga bo'laklarga bo'linganligidan kelib chiqadi. Ushbu bo'laklardagi "hid" ni ulardan to'liq mijoz kodi yaratilmaguncha osongina aniqlash mumkin emas. WebScent server kodidagi muammoli joylarni topish uchun mijoz kodini tahlil qiladi. Shu bilan birga, WebScent statik analizatorining ishi, asosan, HTML, CSS va JS aralashmalarini ochishdan iborat - takroriy kod va HTML sintaksisidagi xatolarni aniqlash uchun.

    Dinamik tahlil uchun yordamchi dasturlar

    JSNose - bu statik va dinamik tahlilni birlashtirgan yordamchi dastur. U o'n uchta anti-naqsh uchun kodni tahlil qiladi. Ulardan yettitasi (jumladan, dangasa obyekt va uzun funksiya) barcha dasturlash tillari uchun umumiy, qolgan oltitasi (yopilish hidlari, haddan tashqari global oʻzgaruvchilar, ichki qoʻngʻiroqlar va boshqalar) JavaScript-ga xosdir.

    DOMPletion - bu veb-ishlab chiquvchiga ko'rilganda kodni tushunishga yordam beradigan avtomatlashtirilgan yordamchi dastur: DOM tuzilmalari nima uchun mavjudligini tushuntiradi, dinamik tahlil qiladi, shuningdek, DOM bilan o'zaro aloqada bo'lgan kod uchun aqlli avtomatik to'ldirishni ta'minlaydi.

    Clematis - bu murakkab hodisalarning o'zaro ta'sirini ochishga yordam beradigan ramka. Klematis ijro paytida yuzaga keladigan barcha hodisalarni batafsil qamrab oladi va ularni tarkibiy qismlar va hodisalar o'rtasidagi vaqtinchalik va nedensel munosabatlarni aks ettiruvchi mavhum xatti-harakatlar modeli shaklida tasvirlaydi.

    xulosalar

    Shunday qilib, JS-da skriptlarni bajarishda nima sodir bo'layotganini kuzatish qiyin bo'lishi mumkin, ammo to'g'ri vositalar bilan qurollangan holda, hatto eng chalkash kodda ham muammoli joylarni topishingiz va qayta yozishingiz mumkin. Biroq, JavaScript to'xtamaydi: unda yangi va yangi imkoniyatlar paydo bo'ladi, endi u ko'pincha ilovalarni (ham mobil, ham ish stoli) yozish uchun ishlatiladi va Node.js tufayli serverlarda (va nafaqat) tobora ko'proq topilmoqda. Bu shuni anglatadiki, xatolarni ushlash san'ati yangi bosqichga ko'tarilishi kerak.

    Mening kodimning har bir satri birinchi marta mukammal emas. Xo'sh, ba'zi hollarda ... Ba'zan ... Yaxshi - deyarli hech qachon. Haqiqat shundaki, men o'zimning ahmoqona xatolarimni tuzatishga xohlaganimdan ko'ra ko'proq vaqt sarflayman. Shuning uchun men yozgan deyarli har bir JavaScript faylida statik analizatorlardan foydalanaman.

    Statik analizatorlar kodingizni ko'rib chiqadi va uni ishga tushirishdan oldin undagi xatolarni topadi. Ular sintaksisni tekshirish (masalan, bo'shliqlar o'rniga yorliqlar) va funktsiyalarning haddan tashqari murakkab emasligini tekshirish kabi oddiy tekshiruvlarni amalga oshiradilar. Statik analizatorlar sinov paytida topilmaydigan xatolarni ham qidiradi, masalan, === o'rniga ==.


    Katta loyihalarda va katta jamoalarda ishlashda siz bunday "oddiy" xatolarni topishda ozgina yordamdan foydalanishingiz mumkin, ular aslida ular ko'rinadigan darajada oddiy emas.


    JSLint, JSHint va Closure Compiler


    JavaScript uchun statik analizatorlar uchun uchta asosiy variant mavjud: JSLint, JSHint va Closure Compiler.



    JSLint JavaScript uchun birinchi statik analizator edi. U rasmiy saytda ishga tushirilishi yoki mahalliy fayllarda ishlashi mumkin bo'lgan qo'shimchalardan birini ishlatishi mumkin. JSLint ko'plab muhim xatolarni topadi, lekin bu juda qiyin. Mana asosiy misol:



    var s = "mystring";
    uchun (var i = 0; i< s.length; i++) {
    console.log (s.charAt (i));
    }

    JSLint ushbu kodda ikkita xatoni ko'rsatadi:



    Kutilmagan "++".
    "Var" deklaratsiyalarini funksiyaning yuqori qismiga o'tkazing.

    Birinchi muammo - sikl sharoitida i o'zgaruvchining ta'rifi. JSLint, shuningdek, tsikl ta'rifining oxirida ++ operatorini ham qabul qilmaydi. U kodning shunday ko'rinishini xohlaydi:



    var s = "mystring";
    var i;
    uchun (i = 0; i< s.length; i = i + 1) {
    console.log (s.charAt (i));
    }

    Men JSLint yaratuvchilarini qadrlayman, lekin men uchun bu ortiqcha. Anton Kovalyov uchun ham qiyin bo'ldi, shuning uchun u JSHint-ni yaratdi.



    JSHint JSLint bilan bir xil ishlaydi, lekin u Node.js ga qo'shimcha ravishda yozilgan va shuning uchun yanada moslashuvchan. JSHint ko'p sonli variantlarni o'z ichiga oladi, bu sizga shaxsiy hisobot generatoringizni yozish orqali maxsus tekshiruvlarni amalga oshirish imkonini beradi.

    JSHint-ni veb-saytdan ishga tushirishingiz mumkin, lekin ko'p hollarda JSHint-ni Node.js-dan foydalanib mahalliy buyruq qatori vositasi sifatida o'rnatish yaxshiroqdir. JSHint o'rnatilgandan so'ng uni quyidagi buyruq bilan fayllaringizda ishga tushirishingiz mumkin:



    jshint test.js

    JSHint mashhur plaginlarni ham o'z ichiga oladi matn muharrirlari shuning uchun kodingizni yozayotganingizda uni ishga tushirishingiz mumkin.


    YAPISH TUZISH


    Google-ning Closure Compiler dasturi butunlay boshqa turdagi dasturdir. Nomidan ko'rinib turibdiki, u nafaqat test dasturi, balki kompilyator hamdir. U Java-da yozilgan va Mozilla-ning Rhino parseriga asoslangan. Yopish kompilyatori asosiy kodni tekshirish uchun oddiy rejimni va qo'shimcha tekshirishni amalga oshirish va maxsus ko'rinish ta'riflarini amalga oshirish uchun murakkabroq rejimlarni o'z ichiga oladi.


    Closure Compiler JavaScript kodidagi xatolar haqida xabar beradi, lekin JavaScript-ning kichiklashtirilgan versiyalarini ham yaratadi. Kompilyator bo'shliqlarni, izohlarni va foydalanilmagan o'zgaruvchilarni olib tashlaydi va skriptni iloji boricha ixcham saqlash uchun uzun ifodalarni soddalashtiradi.


    Google kompilyatorning juda oddiy versiyasini tarmoqda mavjud qildi, lekin siz Closure Compiler-ni yuklab olib, uni mahalliy sifatida ishga tushirishni xohlaysiz.


    Yopish kompilyatori kodni tekshirgandan so'ng, fayllar ro'yxatini bitta kichiklashtirilgan faylga chiqaradi. Shunday qilib, compiler.jar faylini yuklab olib, uni ishga tushirishingiz mumkin.



    java -jar compiler.jar --js_output_file compress.js --js test1.js --js test2.js

    To'g'ri tekshirish dasturini tanlash


    Loyihalarimda men Closure Compiler va JSHintni birlashtiraman. Closure Compiler minimallashtirish va asosiy tekshirishni amalga oshiradi, JSHint esa murakkabroq kod tahlilini amalga oshiradi. Bu ikki dastur birgalikda ajoyib ishlaydi va ularning har biri ikkinchisi qila olmaydigan sohalarni qamrab oladi. Bundan tashqari, men JSHint kengaytmasidan maxsus validatorlarni yozish uchun foydalanishim mumkin. Men yozgan umumiy dastur menga kerak bo'lmagan ba'zi funktsiyalarni sinab ko'radi, masalan, mening loyihamda bo'lmasligi kerak bo'lgan chaqiruv funktsiyalari.


    Endi biz tekshirish uchun bir nechta dasturlarni ko'rib chiqdik, keling, ba'zi yomon kodlarni ajratamiz. Ushbu oltita misolning har biri kodni yozishga arzimaydi va kod tekshiruvchilari sizni qutqarishi mumkin bo'lgan holatlardir.


    Ushbu maqola ko'pgina misollar uchun JSHint-dan foydalanadi, ammo Yopish kompilyatori odatda shunga o'xshash ogohlantirishlarni yaratadi.


    == yoki ===?


    JavaScript dinamik ravishda terilgan tildir. Kodni yozayotganda turlarni belgilashingiz shart emas va ular ishga tushirish vaqtida mavjud.


    JavaScript bunday dinamik turlarni boshqarish uchun ikkita taqqoslash operatorini taklif qiladi: == va ===. Keling, buni bir misol bilan ko'rib chiqaylik.



    var n = 123;
    var s = "123";

    agar (n == s) (
    ogohlantirish ("O'zgaruvchilar teng");
    }

    agar (n === s) (
    ogohlantirish ("O'zgaruvchilar bir xil");
    }

    Taqqoslash operatori == JavaScript-ning ildizlari bo'lgan C tilining qoldiqlari. Uni ishlatish deyarli har doim xatodir: qiymatlarni turlardan alohida solishtirish kamdan-kam hollarda ishlab chiquvchining aslida qilishni xohlaydi. Aslida “bir yuz yigirma uch” soni “bir ikki uch” qatoridan farq qiladi. Ushbu operatorlarni noto'g'ri yozish oson va hatto noto'g'ri o'qish ham oson. Ushbu kodni JSHint bilan tekshiring va siz buni olasiz:

    test.js: 9-satr, 12-qator, Kutilayotgan "===" va o'rniga "==" ko'rgan.

    Aniqlanmagan o'zgaruvchilar va kech ta'riflar


    Keling, oddiy kod bilan boshlaylik:



    funktsiya testi () (
    var myVar = "Salom, dunyo";
    console.log (myvar);
    }

    Xatoni ko'ryapsizmi? Men bu xatoni har safar qilaman. Ushbu kodni ishga tushiring va siz xatoni olasiz:



    ReferenceError: myvar aniqlanmagan

    Keling, muammoni biroz murakkablashtiramiz:



    funktsiya testi () (
    myVar = "Salom, dunyo";
    console.log (myVar);
    }

    Ushbu kodni ishga tushiring va siz buni olasiz:



    Salom Dunyo

    Bu ikkinchi misol ishlaydi, lekin juda kutilmagan yon ta'sirga ega. JavaScript o'zgaruvchilari va qamrovini aniqlash qoidalari eng yaxshi holatda chalkash. Birinchi holda, JSHint quyidagilarni xabar qiladi:

    test.js: 3-qator, 17-qator, "myvar" aniqlanmagan.

    Ikkinchi holda, u bu haqda xabar beradi:



    test.js: 2-qator, 5-qator, "myVar" aniqlanmagan.
    test.js: 3-qator, 17-qator, "myVar" aniqlanmagan.

    Birinchi misol ish vaqti xatosidan qochishga yordam beradi. Ilovangizni sinab ko'rishingiz shart emas - JSHint siz uchun xatoni topadi. Ikkinchi misol yomonroq, chunki siz sinov natijasida xato topa olmaysiz.


    Ikkinchi misoldagi muammo juda nozik va murakkab. myVar o'zgaruvchisi endi o'z qamrovidan g'oyib bo'ldi va global miqyosga o'tdi. Bu shuni anglatadiki, test funksiyasi ishga tushgandan keyin ham u mavjud bo'ladi va Hello, World qiymatiga ega bo'ladi. Bu global ifloslanish deb ataladi.


    myVar o'zgaruvchisi test funksiyasidan so'ng ishga tushiriladigan har bir boshqa funksiya uchun mavjud bo'ladi. Sinov funksiyasini ishga tushirgandan so'ng quyidagi kodni ishga tushiring:



    console.log ("myVar:" + myVar);

    Siz hali ham Salom, Dunyo olasiz. myVar o'zgaruvchisi sizning kodingiz bo'ylab shablon kabi osilib turadi, bu esa siz chiqarilishdan oldin tun bo'yi qidiradigan murakkab xatolarga olib keladi, chunki siz var yozishni unutgansiz.


    Ushbu yozuv toʻliq matnli RSS xizmati orqali oʻtgan - agar bu sizning kontentingiz boʻlsa va siz uni “boshqa birovning saytida qayta oʻqiyotgan boʻlsangiz”, http://ift.tt/jcXqJW sahifasida tez-tez soʻraladigan savollarni oʻqing.