تجزیه و تحلیل نوع استاتیک در جاوا اسکریپت در حال امتحان کردن تحلیلگر جریان فیس بوک. امنیت جاوا اسکریپت یا نحوه نوشتن کد JS ایمن تجزیه و تحلیل و ابزارهای بهینه سازی کد

هر خط از کد من برای اولین بار کامل نیست. خب، در برخی موارد... گاهی... خب، تقریباً هرگز. حقیقت این است که من زمان زیادی را صرف تصحیح اشتباهات احمقانه‌ام می‌کنم. به همین دلیل است که تقریباً در هر فایل جاوا اسکریپتی که می نویسم از تحلیلگرهای استاتیک استفاده می کنم.

تحلیلگرهای استاتیک قبل از اجرای کد، به کد نگاه می کنند و خطاهای موجود در آن را پیدا می کنند. اجرا می کنند چک های ساده، مانند بررسی دستورات اجرایی (برای مثال، وجود برگه ها به جای فاصله) و بررسی های کلی تر، مانند اطمینان از اینکه عملکردها خیلی پیچیده نیستند. آنالایزرهای استاتیک همچنین به دنبال خطاهایی هستند که در حین آزمایش یافت نمی شوند، به عنوان مثال، به جای === ==.


در پروژه های بزرگ و هنگام کار در تیم های بزرگ می توانید استفاده کنید یک کمک کوچکدر جستجوی چنین اشکالات "ساده"، که در واقع به آن سادگی که به نظر می رسد نیست.


کامپایلر JSLint، JSHint و Closure


سه گزینه اصلی تجزیه و تحلیل استاتیک برای جاوا اسکریپت وجود دارد: JSLint، JSHint و Closure Compiler.



JSLint اولین تجزیه کننده استاتیک برای جاوا اسکریپت بود. می توانید آن را در وب سایت رسمی اجرا کنید یا از یکی از افزونه های قابل اجرا استفاده کنید فایل های محلی. JSLint بسیاری از اشکالات مهم را پیدا می کند، اما بسیار سخت است. در اینجا یک مثال اصلی است:



vars = "mystring";
برای (var i = 0; i< s.length; i++) {
console.log(s.charAt(i));
}

JSLint دو خطا را در این کد نشان می دهد:



"++" غیرمنتظره.
اعلان های "var" را به بالای تابع منتقل کنید.

اولین مشکل، تعریف متغیر i در شرایط حلقه است. JSLint همچنین عملگر ++ را در انتهای تعریف حلقه نمی پذیرد. او می خواهد که کد به شکل زیر باشد:



vars = "mystring";
var i;
برای (i = 0; i< s.length; i = i + 1) {
console.log(s.charAt(i));
}

من از سازندگان JSLint قدردانی می کنم، اما به نظر من این بیش از حد است. برای آنتون کووالف نیز سخت بود، بنابراین او JSHint را ایجاد کرد.



JSHint به همان روش JSLint کار می کند، اما علاوه بر Node.js نوشته شده است و بنابراین انعطاف پذیرتر است. JSHint شامل تعداد زیادی گزینه است که به شما امکان می دهد با نوشتن گزارش مولد خود، بررسی های سفارشی را انجام دهید.

می‌توانید JSHint را از راه‌اندازی کنید، اما در بیشتر موارد بهتر است JSHint را به عنوان یک ابزار خط فرمان محلی با استفاده از Node.js نصب کنید. هنگامی که JSHint را نصب کردید، می توانید با این دستور آن را در فایل های خود اجرا کنید:



jshint test.js

JSHint همچنین شامل پلاگین هایی برای محبوب است ویرایشگرهای متن، بنابراین می توان آن را هنگام کدنویسی اجرا کرد.


کامپایلر بسته شدن


Google's Closure Compiler یک برنامه کاملاً متفاوت است. همانطور که از نام آن پیداست، نه تنها یک چک کننده بلکه یک کامپایلر نیز هست. این به زبان جاوا و بر اساس تجزیه کننده Rhino موزیلا نوشته شده است. کامپایلر بسته شامل یک حالت ساده برای انجام بررسی کدهای اولیه و حالت های پیشرفته تر برای انجام است. بررسی اضافیو تعاریف گونه های منفرد را اجرا کنند.


Closure Compiler خطاها را گزارش می کند کد جاوا اسکریپت، بلکه نسخه های کوچک شده جاوا اسکریپت را نیز ایجاد می کند. کامپایلر فضای خالی، نظرات و متغیرهای استفاده نشده را حذف می کند و عبارات طولانی را ساده می کند و اسکریپت را تا حد امکان فشرده می کند.


گوگل نسخه بسیار ساده ای از کامپایلر را به صورت آنلاین در دسترس قرار داده است، اما به احتمال زیاد می خواهید کامپایلر بسته را دانلود کرده و آن را به صورت محلی اجرا کنید.


Closure Compiler لیست فایل ها را پس از بررسی کد در یک فایل کوچک شده خروجی می دهد. بنابراین می توانید با دانلود فایل compiler.jar آن را اجرا کنید.



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

انتخاب کنید برنامه درستچک ها


در پروژه هایم، Closure Compiler و JSHint را ترکیب می کنم. Closure Compiler کوچک سازی و اعتبارسنجی اولیه را انجام می دهد، در حالی که JSHint تجزیه و تحلیل کد پیچیده تری را انجام می دهد. این دو برنامه با هم عالی کار می کنند و هر کدام حوزه هایی را پوشش می دهند که دیگری نمی تواند. همچنین، می‌توانم از پسوند JSHint برای نوشتن اعتبارسنجی سفارشی استفاده کنم. یکی نوشته من برنامه عمومیتوابع خاصی را که به آنها نیازی ندارم، مانند فراخوانی توابعی که نباید در پروژه من باشند، بررسی می کند.


اکنون که به چند چک پرداخته ایم، بیایید کدهای بد را بشکنیم. هر یک از این شش مثال نشان دهنده کدهایی هستند که نباید نوشته شوند و موقعیت هایی که جستجوگرهای کد می توانند شما را نجات دهند.


این مقاله برای بیشتر نمونه ها از JSHint استفاده می کند، اما کامپایلر بسته شدن معمولاً هشدارهای مشابهی را صادر می کند.


== یا ===؟


جاوا اسکریپت یک زبان تایپ پویا است. در هنگام نوشتن کد نیازی به تعریف انواع آن نیست، اما در هنگام راه اندازی وجود دارند.


جاوا اسکریپت دو عملگر مقایسه ای را برای دستکاری این انواع پویا ارائه می دهد: == و ===. بیایید با یک مثال به این موضوع نگاه کنیم.



varn = 123;
vars = "123";

اگر (n == s) (
alert("متغیرها برابر هستند");
}

اگر (n === s) (
alert ("متغیرها یکسان هستند");
}

عملگر مقایسه == بقایای زبان C هستند که جاوا اسکریپت در آن ریشه دارد. استفاده از آن تقریباً همیشه یک اشتباه است: مقایسه مقادیر جدا از انواع به ندرت چیزی است که توسعه دهنده واقعاً می خواهد انجام دهد. در واقع عدد «صد و بیست و سه» با رشته «یک دو سه» متفاوت است. غلط املایی این عملگرها آسان است و حتی اشتباه خواندن آنها نیز آسانتر است. این کد را با JSHint تست کنید و این را دریافت خواهید کرد:

test.js: line 9, col 12, "===" مورد انتظار بود و در عوض "==" را دید.

متغیرهای تعریف نشده و تعاریف دیرهنگام


بیایید با چند کد ساده شروع کنیم:



تست عملکرد() (
var myVar = "سلام دنیا";
ورود به سیستم کنسول (myvar);
}

اشکال را می بینید؟ من هر بار این اشتباه را می کنم. این کد را اجرا کنید و با خطا روبرو می شوید:



ReferenceError: myvar تعریف نشده است

بیایید مشکل را کمی پیچیده تر کنیم:



تست عملکرد() (
myVar = "سلام دنیا";
ورود به سیستم کنسول (myVar)؛
}

این کد را اجرا کنید و این را دریافت خواهید کرد:



سلام دنیا

این مثال دوم کار می کند، اما عوارض جانبی بسیار غیرمنتظره ای دارد. قوانین برای تعریف متغیرهای جاوا اسکریپت و محدوده در بهترین حالت گیج کننده هستند. در مورد اول، JSHint موارد زیر را گزارش خواهد کرد:

test.js: خط 3، ستون 17، "myvar" تعریف نشده است.

در مورد دوم، این را گزارش خواهد کرد:



test.js: خط 2، ستون 5، "myVar" تعریف نشده است.
test.js: خط 3، ستون 17، "myVar" تعریف نشده است.

مثال اول به شما کمک می کند از خطای زمان اجرا جلوگیری کنید. شما نیازی به آزمایش برنامه خود ندارید - JSHint خطا را برای شما پیدا می کند. مثال دوم بدتر است، زیرا شما باگی در نتیجه آزمایش پیدا نخواهید کرد.


مشکل در مثال دوم به طرز موذیانه ای ظریف و پیچیده است. متغیر myVar اکنون از محدوده خود ناپدید شده و به دامنه جهانی ارتقا یافته است. این بدان معناست که حتی پس از اجرای تابع تست نیز وجود خواهد داشت و مقدار Hello, World را خواهد داشت. به این «آلودگی گستره جهانی» می گویند.


متغیر myVar برای هر تابع دیگری که بعد از تابع تست اجرا می شود وجود خواهد داشت. پس از اجرای تابع تست کد زیر را اجرا کنید:



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

شما هنوز هم سلام، جهان را دریافت خواهید کرد. متغیر myVar مانند یک الگو در اطراف کد شما آویزان می‌شود، که منجر به باگ‌های پیچیده‌ای می‌شود که تمام شب قبل از انتشار به دنبال آن خواهید بود، زیرا فراموش کرده‌اید var را قرار دهید.


این ورودی از طریق سرویس RSS تمام متن ارسال شده است - اگر این محتوای شماست و در حال خواندن آن در سایت شخص دیگری هستید، لطفاً سؤالات متداول را در http://ift.tt/jcXqJW بخوانید.


توسعه برنامه های کاربردی جاوا اسکریپت کار بسیار دشواری است. اما کاملا قابل انجام در مقاله امروز به بررسی ویژگی های جاوا اسکریپت که باعث ایجاد مشکلات امنیتی می شود می پردازیم و در مورد نحوه جلوگیری از آنها صحبت خواهیم کرد.

چرا نوشتن کد JS ایمن سخت است

بنابراین، در اینجا 5 دلیل برای سخت بودن نوشتن آورده شده است. کد امندر JS

کامپایلر کمکی نمی کند.

جاوا اسکریپت یک زبان تفسیر شده است. و این بدان معنی است که کامپایلر همیشه از چیزی شکایت نمی کند، از کار کردن خودداری می کند و شما را مجبور به تصحیح خطاها و بهینه سازی کد می کند.

ماهیت پویا جاوا اسکریپت

جاوا اسکریپت پویا، ضعیف تایپ شده و ناهمزمان است. و همه اینها نشانه هایی است که نشان می دهد به دردسر افتادن آسان است.

1. ابزارهای زبانی مانند evalو گنجاندن کد شخص ثالث از طریق اسکریپت src به شما امکان می دهد خطوط را درست در زمان اجرا اجرا کنید. در نتیجه، ارائه «ضمانت‌های ثابت» مبنی بر اینکه کد به شیوه‌ای خاص عمل می‌کند، دشوار است. تجزیه و تحلیل پویا نیز این را پیچیده می کند (به کار علمی مراجعه کنید).

با استفاده از eval

2. تایپ ضعیفبه این واقعیت منجر می شود که استفاده از روش های تعیین شده برای تجزیه و تحلیل استاتیک - حداقل در مقایسه با زبان های تایپ ایستا (به عنوان مثال، جاوا) آسان نیست.

3. تماس های ناهمزمان،طبق آمار، فراخوانی هایی که جاوا اسکریپت از طریق مکانیسم هایی مانند setTimeout و XMLHttpRequest (AJAX بسیار معروف) اجازه می دهد، موذی ترین خطاها را پنهان می کند.

ویژگی های پیچیده JS

چیزی که در طول سال ها به جاوا اسکریپت کشیده نشده است! به ویژه، دارای نمونه های اولیه، عملکردهای درجه یک و بسته شدن است. آنها زبان را حتی پویاتر می کنند و نوشتن کد امن را سخت تر می کنند.

1. نمونه های اولیه.معنای آنها این است که برنامه ها با روح یک رویکرد شی گرا نوشته می شوند، اما بدون استفاده از کلاس ها. با این رویکرد، اشیا خصوصیات مورد نیاز خود را مستقیماً از سایر اشیاء (نمونه های اولیه) به ارث می برند. در عین حال، در JS، نمونه های اولیه می توانند درست در زمان اجرا دوباره تعریف شوند. و اگر این بازتعریف اتفاق افتاد، آنگاه اثر فوراً به همه اشیایی که ویژگی‌های نمونه اولیه لغو شده را به ارث می‌برند گسترش می‌یابد.

نحوه پردازش نمونه های اولیه

انصافاً باید گفت که در مشخصات جدید ECMAScript کلاس ها نیز وجود دارد.

2. توابع کلاس اول. JS دارای یک شیء و مدل تابع بسیار انعطاف پذیر است. ویژگی های شی و مقادیر آنها را می توان درست در زمان اجرا ایجاد، اصلاح یا حذف کرد و همه از طریق توابع درجه یک قابل دسترسی هستند.

3. بسته شدن.اگر تابعی را در داخل تابع دیگری اعلام کنید، تابع اول به متغیرها و آرگومان های دومی دسترسی پیدا می کند. علاوه بر این، این متغیرها به وجود خود ادامه می دهند و برای تابع درونی در دسترس باقی می مانند - حتی پس از تکمیل تابع بیرونی که این متغیرها در آن تعریف شده اند.

با توجه به چنین انعطاف پذیری و پویایی جاوا اسکریپت (نگاه کنید به نکات 1 و 3)، تعیین مجموعه ای از تمام ویژگی های موجود یک شی در طول تجزیه و تحلیل استاتیک یک کار غیر قابل حل است. با این حال، توسعه دهندگان وب در همه جا از ویژگی های پویا زبان استفاده می کنند، و بر این اساس، نمی توان در هنگام تجزیه و تحلیل کد از آنها غافل شد. در غیر این صورت ضمانت امنیت چیست؟

تعامل نزدیک بین جاوا اسکریپت و DOM

این برای ارائه یک به روز رسانی "یکپارچه" از صفحه وب، درست در زمان اجرا ضروری است. همانطور که می دانید DOM یک استاندارد است مدل شی، خنثی در رابطه با پلتفرم ها و زبان ها که برای رندر در نظر گرفته شده است اسناد HTMLو XML. DOM دارای API خاص خود برای کار با سند رندر شده است: برای دسترسی پویا، انتقال و به روز رسانی سند رندر شده (محتوا، ساختار و سبک آن). تغییرات در DOM را می توان به صورت پویا از طریق جاوا اسکریپت انجام داد. و این تغییرات بلافاصله در مرورگر نمایش داده می شود.

به لطف DOM، صفحات وب بارگذاری شده در مرورگر را می توان در مراحلی که داده ها از سرور بارگیری می شود، به روز کرد. با این حال، این راحتی یک جنبه منفی دارد: قطعه کدهایی که مسئول تعامل پویا بین JS و DOM هستند، به ویژه مستعد خطا هستند.

رایج ترین اشتباهات در برنامه های کاربردی وب

تعاملات رویداد پیچیده

جاوا اسکریپت یک زبان رویداد محور است. این به توسعه دهندگان اجازه می دهد تا به اصطلاح "شنوندگان رویداد" را در گره های DOM - شنوندگان رویداد ثبت کنند. و در حالی که بیشتر رویدادها توسط اقدامات کاربر راه اندازی می شوند، مواردی وجود دارند که می توانند بدون آن فعال شوند، مانند رویدادهای زمان بندی شده و تماس های ناهمزمان. علاوه بر این، هر رویداد می تواند در سراسر درخت DOM تکرار شود و چندین "شنونده" را همزمان فعال کند. گاهی اوقات پیگیری همه اینها یک کار نسبتاً بی اهمیت است.

نحوه رسیدگی به رویدادها

به این دلایل، درک، تجزیه و تحلیل و آزمایش کد JS ممکن است دشوار باشد. ابزارهای ویژه زندگی را برای یک توسعه دهنده وب آسان تر می کند و به نوشتن کد ایمن کمک می کند.

ابزارهای کاربردی برای آزمایش کد JS

ابزارهایی برای تجزیه (به عنوان مثال Esprima، Rhino)، بهینه سازی (به عنوان مثال Google Closure Compiler) و تجزیه و تحلیل کد استاتیک برای خطاهای نحوی رایج (مانند JSHint) وجود دارد.

علاوه بر این، چندین چارچوب اثبات شده وجود دارد که به توسعه دهندگان وب کمک می کند تا کد JS را با آزمایش پوشش دهند. از جمله:

  • QUnit یک چارچوب تست واحد محبوب است.
  • Jasmine - چارچوب BDD (توسعه مبتنی بر رفتار) برای تست کد.
  • Mocha یک چارچوب تست کد است که هم در Node.js و هم در مرورگر اجرا می شود.
  • jsTestDriver چارچوبی است که از جمله موارد دیگر، می‌تواند مجموعه‌ای از آزمایش‌ها را در چندین مرورگر به طور همزمان اجرا کند.

علاوه بر این، چارچوب‌های آزمایشی وجود دارد که رفتار مرورگر را شبیه‌سازی می‌کند و به شما امکان می‌دهد موارد آزمایشی را به‌طور خودکار اجرا کنید. آنها به ویژه هنگام اشکال زدایی بخش هایی از کد که مسئول تعامل بین JS و DOM هستند، مرتبط هستند و زیرساخت مناسبی برای دستکاری DOM فراهم می کنند.

به عنوان مثال، Selenium، PhantomJS و SlimerJS یک API ارائه می‌کنند که از طریق آن می‌توانید نمونه‌های مرورگر را راه‌اندازی کرده و با آن‌ها کار کنید. از طریق API، می توانید رویدادها را فعال کنید و به عناصر DOM درست در زمان اجرا دسترسی داشته باشید - یعنی کد را در شرایطی آزمایش کنید که تا حد امکان به واقعی نزدیک باشد. البته، بسیاری از کارها باید به صورت دستی انجام شوند، اما حتی این در حال حاضر کمک خوبی برای آزمایش است.

ابزارهای مفید برای تجزیه و تحلیل استاتیک

پیش از این، ابزارهایی برای شناسایی بخش های کد مشکل ساز، تحلیلگرهای ایستا بودند. یعنی با توجه به تمام ویژگی‌های پویا JS، تنها می‌توانست کمک محدودی ارائه دهد. با این حال، آنها همچنین در تجزیه و تحلیل مفید هستند. در اینجا چند نمونه اساسی آورده شده است.

WARI یک تحلیلگر استاتیک است که وابستگی های بین توابع JS را بررسی می کند. سبک های css, تگ های HTMLو تصاویر هدف از این ابزار یافتن منابع استفاده نشده در طول تجزیه و تحلیل استاتیک است. با این حال، WARI، البته، با پویایی مقابله نخواهد کرد.

JSLint یک ابزار تحلیل کد استاتیک است که خود با جاوا اسکریپت نوشته شده است. این کد را در برابر شیوه های خوب بررسی می کند.

Google Closure Compiler یک بهینه‌ساز JS است که به‌طور خودکار کد را بازنویسی می‌کند تا آن را سریع‌تر و فشرده‌تر کند. در همان زمان، تمام نظرات و هر بخش استفاده نشده از کد به لوله پرواز می کنند.

WebScent (به مقاله تحقیقاتی مراجعه کنید) یک تحلیلگر استاتیک پیشرفته است. در کار، او از این واقعیت نتیجه می گیرد که کد JS مشتری (کدی که در مرورگر بارگذاری می شود) به طور کامل در سمت سرور ذخیره نمی شود، بلکه در سراسر کد سرور به صورت تکه تکه پراکنده شده است. "مک" در این قطعات را نمی توان به راحتی کشف کرد تا زمانی که کد کلاینت جامد از آنها تولید شود. WebScent کد مشتری را تجزیه و تحلیل می کند تا مناطق مشکل را در کد سرور پیدا کند. در همان زمان، کار تحلیلگر استاتیک WebScent عمدتاً به باز کردن دسته های HTML، CSS و JS کاهش می یابد - به منظور شناسایی کدهای تکراری و خطاها در نحو HTML.

ابزارهای مفید برای تجزیه و تحلیل پویا

JSNose ابزاری است که تجزیه و تحلیل استاتیک و پویا را ترکیب می کند. این کد سیزده ضد الگو را تجزیه و تحلیل می کند. هفت مورد از آنها (شامل شی تنبل و تابع طولانی) برای همه زبان‌های برنامه‌نویسی مشترک هستند و شش مورد دیگر (بوی‌های بسته، متغیرهای جهانی بیش از حد، تماس‌های تودرتو و غیره) مختص جاوا اسکریپت هستند.

DOMPLETION یک ابزار خودکار است که به توسعه‌دهنده وب کمک می‌کند تا کد را هنگام مشاهده درک کند: دلیل وجود ساختارهای DOM را توضیح می‌دهد، تجزیه و تحلیل پویا را انجام می‌دهد و همچنین یک تکمیل خودکار هوشمند برای کدهایی که با DOM تعامل دارد ارائه می‌کند.

Clematis چارچوبی است که به کشف تعاملات پیچیده رویداد کمک می کند. کلماتیس با جزئیات تمام رویدادهایی را که در اجرا به وجود می آیند به تصویر می کشد و آنها را به عنوان یک مدل رفتاری انتزاعی تجسم می کند که روابط زمانی و علت و معلولی بین اجزا و رویدادها را منعکس می کند.

نتیجه گیری

بنابراین، پیگیری اتفاقاتی که هنگام اجرای اسکریپت‌های JS روی می‌دهد می‌تواند دشوار باشد، اما با استفاده از ابزارهای مناسب، می‌توانید مناطق مشکل را حتی در گیج‌کننده‌ترین کدها پیدا کرده و بازنویسی کنید. با این حال، جاوا اسکریپت ثابت نمی ماند: ویژگی های جدید و جدیدی در آن ظاهر می شود، اکنون اغلب برای نوشتن برنامه ها (هم موبایل و هم دسکتاپ) استفاده می شود و همچنین به لطف Node.js به طور فزاینده ای در سرورها (و نه تنها) یافت می شود. و این بدان معنی است که هنر شکار باگ ها باید به سطح جدیدی منتقل شود.

هر خط از کد من برای اولین بار کامل نیست. خب، در برخی موارد... گاهی... خب، تقریباً هرگز. حقیقت این است که من زمان زیادی را صرف تصحیح اشتباهات احمقانه‌ام می‌کنم. به همین دلیل است که تقریباً در هر فایل جاوا اسکریپتی که می نویسم از تحلیلگرهای استاتیک استفاده می کنم.

تحلیلگرهای استاتیک قبل از اجرای کد، به کد نگاه می کنند و خطاهای موجود در آن را پیدا می کنند. آن‌ها بررسی‌های ساده‌ای را انجام می‌دهند، مانند بررسی نحو اجرایی (به عنوان مثال، وجود برگه‌ها به جای فاصله) و بررسی‌های کلی‌تر، مانند بررسی اینکه عملکردها خیلی پیچیده نیستند. آنالایزرهای استاتیک همچنین به دنبال خطاهایی هستند که در حین آزمایش یافت نمی شوند، به عنوان مثال، به جای === ==.

در پروژه‌های بزرگ و هنگام کار در تیم‌های بزرگ، می‌توانید از کمک کوچکی برای یافتن چنین باگ‌های «ساده» استفاده کنید که در واقع آنقدرها هم که به نظر می‌رسد ساده نیستند.

کامپایلر JSLint، JSHint و Closure

سه گزینه اصلی تجزیه و تحلیل استاتیک برای جاوا اسکریپت وجود دارد: JSLint، JSHint و Closure Compiler.

JSLint اولین تجزیه کننده استاتیک برای جاوا اسکریپت بود. می‌توانید آن را در وب‌سایت رسمی اجرا کنید یا از یکی از افزونه‌های قابل اجرا بر روی فایل‌های محلی استفاده کنید. JSLint بسیاری از اشکالات مهم را پیدا می کند، اما بسیار سخت است. در اینجا یک مثال اصلی است:

vars = "mystring"; برای (var i = 0; i< s.length; i++) { console.log(s.charAt(i)); }

JSLint دو خطا را در این کد نشان می دهد:

"++" غیرمنتظره. اعلان های "var" را به بالای تابع منتقل کنید.

اولین مشکل، تعریف متغیر i در شرایط حلقه است. JSLint همچنین عملگر ++ را در انتهای تعریف حلقه نمی پذیرد. او می خواهد که کد به شکل زیر باشد:

vars = "mystring"; var i; برای (i = 0; i< s.length; i = i + 1) { console.log(s.charAt(i)); }

من از سازندگان JSLint قدردانی می کنم، اما به نظر من این بیش از حد است. برای آنتون کووالف نیز سخت بود، بنابراین او JSHint را ایجاد کرد.

JSHint به همان روش JSLint کار می کند، اما علاوه بر Node.js نوشته شده است و بنابراین انعطاف پذیرتر است. JSHint شامل تعداد زیادی گزینه است که به شما امکان می دهد با نوشتن گزارش مولد خود، بررسی های سفارشی را انجام دهید.
می‌توانید JSHint را از راه‌اندازی کنید، اما در بیشتر موارد بهتر است JSHint را به عنوان یک ابزار خط فرمان محلی با استفاده از Node.js نصب کنید. هنگامی که JSHint را نصب کردید، می توانید با این دستور آن را در فایل های خود اجرا کنید:

jshint test.js

JSHint همچنین دارای پلاگین هایی برای ویرایشگرهای متن محبوب است، بنابراین می توانید آن را هنگام نوشتن کد اجرا کنید.

کامپایلر بسته شدن

Google's Closure Compiler یک برنامه کاملاً متفاوت است. همانطور که از نام آن پیداست، نه تنها یک چک کننده بلکه یک کامپایلر نیز هست. این به زبان جاوا و بر اساس تجزیه کننده Rhino موزیلا نوشته شده است. کامپایلر بسته شامل یک حالت ساده برای انجام اعتبارسنجی کد پایه و حالت های پیشرفته تر برای انجام اعتبار سنجی اضافی و اعمال تعاریف نمای خاص است.

Closure Compiler خطاهایی را در کد جاوا اسکریپت گزارش می کند، اما نسخه های کوچک شده جاوا اسکریپت را نیز تولید می کند. کامپایلر فضای خالی، نظرات و متغیرهای استفاده نشده را حذف می کند و عبارات طولانی را ساده می کند و اسکریپت را تا حد امکان فشرده می کند.

گوگل نسخه بسیار ساده ای از کامپایلر را به صورت آنلاین در دسترس قرار داده است، اما به احتمال زیاد می خواهید کامپایلر بسته را دانلود کرده و آن را به صورت محلی اجرا کنید.

Closure Compiler لیست فایل ها را پس از بررسی کد در یک فایل کوچک شده خروجی می دهد. بنابراین می توانید با دانلود فایل compiler.jar آن را اجرا کنید.

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

انتخاب برنامه آزمون مناسب

در پروژه هایم، Closure Compiler و JSHint را ترکیب می کنم. Closure Compiler کوچک سازی و اعتبارسنجی اولیه را انجام می دهد، در حالی که JSHint تجزیه و تحلیل کد پیچیده تری را انجام می دهد. این دو برنامه با هم عالی کار می کنند و هر کدام حوزه هایی را پوشش می دهند که دیگری نمی تواند. همچنین، می‌توانم از پسوند JSHint برای نوشتن اعتبارسنجی سفارشی استفاده کنم. یکی از برنامه‌های عمومی که نوشتم، توابع خاصی را که به آن‌ها نیازی ندارم، مانند فراخوانی توابعی که نباید در پروژه من باشند، بررسی می‌کند.

اکنون که به چند چک پرداخته ایم، بیایید کدهای بد را بشکنیم. هر یک از این شش مثال نشان دهنده کدهایی هستند که نباید نوشته شوند و موقعیت هایی که جستجوگرهای کد می توانند شما را نجات دهند.

این مقاله برای بیشتر نمونه ها از JSHint استفاده می کند، اما کامپایلر بسته شدن معمولاً هشدارهای مشابهی را صادر می کند.

== یا ===؟

جاوا اسکریپت یک زبان تایپ پویا است. در هنگام نوشتن کد نیازی به تعریف انواع آن نیست، اما در هنگام راه اندازی وجود دارند.

جاوا اسکریپت دو عملگر مقایسه ای را برای دستکاری این انواع پویا ارائه می دهد: == و ===. بیایید با یک مثال به این موضوع نگاه کنیم.

وارن = 123; vars = "123"; if (n == s) ( alert ("متغیرها برابر هستند")؛ ) if (n === s) ( alert("متغیرها یکسان هستند")؛ )

عملگر مقایسه == بقایای زبان C هستند که جاوا اسکریپت در آن ریشه دارد. استفاده از آن تقریباً همیشه یک اشتباه است: مقایسه مقادیر جدا از انواع به ندرت چیزی است که توسعه دهنده واقعاً می خواهد انجام دهد. در واقع عدد «صد و بیست و سه» با رشته «یک دو سه» متفاوت است. غلط املایی این عملگرها آسان است و حتی اشتباه خواندن آنها نیز آسانتر است. این کد را با JSHint تست کنید و این را دریافت خواهید کرد:

Test.js: خط 9، ستون 12، "===" مورد انتظار بود و در عوض "==" را دید.

متغیرهای تعریف نشده و تعاریف دیرهنگام

بیایید با چند کد ساده شروع کنیم:

Function test() ( var myVar = "Hello, World"; console.log(myvar); )

اشکال را می بینید؟ من هر بار این اشتباه را می کنم. این کد را اجرا کنید و با خطا روبرو می شوید:

ReferenceError: myvar تعریف نشده است

بیایید مشکل را کمی پیچیده تر کنیم:

Function test() myVar = "Hello, World"; console.log(myVar)؛ )

این کد را اجرا کنید و این را دریافت خواهید کرد:

سلام دنیا

این مثال دوم کار می کند، اما عوارض جانبی بسیار غیرمنتظره ای دارد. قوانین برای تعریف متغیرهای جاوا اسکریپت و محدوده در بهترین حالت گیج کننده هستند. در مورد اول، JSHint موارد زیر را گزارش خواهد کرد:

Test.js: خط 3، ستون 17، "myvar" تعریف نشده است.

در مورد دوم، این را گزارش خواهد کرد:

Test.js: خط 2، ستون 5، "myVar" تعریف نشده است. test.js: خط 3، ستون 17، "myVar" تعریف نشده است.

مثال اول به شما کمک می کند از خطای زمان اجرا جلوگیری کنید. شما نیازی به آزمایش برنامه خود ندارید - JSHint خطا را برای شما پیدا می کند. مثال دوم بدتر است، زیرا شما باگی در نتیجه آزمایش پیدا نخواهید کرد.

مشکل در مثال دوم به طرز موذیانه ای ظریف و پیچیده است. متغیر myVar اکنون از محدوده خود ناپدید شده و به دامنه جهانی ارتقا یافته است. این بدان معناست که حتی پس از اجرای تابع تست نیز وجود خواهد داشت و مقدار Hello, World را خواهد داشت. به این «آلودگی گستره جهانی» می گویند.

متغیر myVar برای هر تابع دیگری که بعد از تابع تست اجرا می شود وجود خواهد داشت. پس از اجرای تابع تست کد زیر را اجرا کنید:

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

شما هنوز هم سلام، جهان را دریافت خواهید کرد. متغیر myVar مانند یک الگو در اطراف کد شما آویزان می‌شود، که منجر به باگ‌های پیچیده‌ای می‌شود که تمام شب قبل از انتشار به دنبال آن خواهید بود، زیرا فراموش کرده‌اید var را قرار دهید.

الکساندر مایوروف،برنامه نویس، 11 سال تجربه در برنامه نویسی، که هفت سال آن به توسعه برای دستگاه های تلفن همراه اختصاص دارد

تجزیه و تحلیل نوع استاتیک در جاوا اسکریپت
آنالیز جریان فیسبوک را امتحان کنید

فیس بوک یک پروژه منبع باز جدید Flow - یک تحلیلگر کد استاتیک برای زبان جاوا اسکریپت را معرفی کرده است. هدف اصلی از توسعه تحلیلگر، ساده کردن جستجوی خطاها است

علاوه بر این، Flow ابزاری را در قالب یک پسوند نحوی به سبک TypeScript از زبان جاوا اسکریپت برای مشخص کردن صریح انواع فراهم می کند. بسیاری از ویژگی های جدید معرفی شده در مشخصات ECMAScript 6 پشتیبانی می شوند.

موضوع تایپ در زبان های برنامه نویسی اغلب مورد توجه قرار می گیرد. این موضوع هولیوارها و تعیین ویژگی های مثبت یا منفی یک زبان خاص است. اخیراً صحبت های زیادی در مورد تایپ در جاوا اسکریپت شده است. برخی از مردم آن را به این شکل که هست دوست دارند. افرادی که با سایر زبان های برنامه نویسی آشنا هستند، به ویژه آنهایی که تایپ صریح قوی دارند، این رویکرد را "نارنجکی در دست میمون" می دانند. همه ما می دانیم که جاوا اسکریپت یک زبان تایپ شده به صورت پویا است. مربیان توسعه فرانت‌اند یاد گرفته‌اند که از این به خوبی استفاده کنند، اما درک کد گاهی اوقات دشوار است. کسانی که به تازگی وارد دنیای برنامه نویسی جاوا اسکریپت شده اند، از جادویی که مفسر انجام می دهد گیج شده اند و اغلب اشتباهات را به طور غیر منتظره ای دریافت می کنند. اما ابتدا اجازه دهید کمی در مورد تایپ کردن به طور کلی بفهمیم. چگونه است؟

تایپ در زبان های برنامه نویسی

زبان های برنامه نویسی تایپ شده به دو دسته کلی تقسیم می شوند - تایپ شده و تایپ نشده. به عنوان مثال، زبان های تایپ شده شامل زبان هایی مانند C، Python، PHP، Lua، JavaScript هستند. نمونه هایی از زبان های تایپ نشده: اسمبلر، فورث، برینفاک. بله بله دقیقا. جاوا اسکریپت مانند بسیاری از زبان های تفسیری دیگر تایپ می شود. بنابراین، به هیچ وجه نگویید که تایپ نشده است. به خصوص در مصاحبه ها.

به نوبه خود، زبان های تایپ شده به چندین دسته دیگر همپوشانی تقسیم می شوند:

  • با تایپ استاتیک یا پویا.
  • با تایپ قوی یا شل.
  • با تایپ صریح یا ضمنی.

زبان هایی با تایپ ثابت

در تایپ استاتیکانواع نهایی متغیرها و توابع در زمان کامپایل تنظیم می شوند. کامپایلر قبل از اجرای برنامه، خطاهای عدم تطابق نوع شما را تصحیح می کند. زبان های مثال: C، Java، C#.

زبان هایی با تایپ پویا

در تایپ پویا، همه انواع در زمان اجرا تعیین می شوند. و اگر اشتباهی مرتکب شوید، تنها زمانی که برنامه را اجرا می کنید متوجه آن خواهید شد. بنابراین توجه ویژه به بررسی و به دام انداختن خطا در تایپ پویا بسیار مهم است. زبان های مثال: جاوا اسکریپت، پی اچ پی، پایتون، روبی.

تایپ قوی (قوی)

زبان‌هایی که به شدت تایپ می‌شوند اجازه اختلاط در عبارات را نمی‌دهند انواع مختلفو تبدیل خودکار نوع ضمنی را انجام نخواهد داد. به عنوان مثال، شما نمی توانید یک عدد یا نوع دیگری غیر از رشته را از یک رشته کم کنید. زبان های مثال: جاوا، پایتون، هسکل، لیسپ.

تایپ آزاد (ضعیف)

زبان‌هایی که با تایپ آزاد تایپ می‌شوند، بسیاری از تبدیل‌های نوع ضمنی را به‌طور خودکار انجام می‌دهند. آنها این کار را انجام می دهند حتی اگر از دست دادن دقت یا تبدیل به طور مبهم رخ دهد. زبان های مثال: پی اچ پی، جاوا اسکریپت، ویژوال بیسیک.

تایپ صریح

در زبان هایی که به طور واضح تایپ می شوند، نوع متغیرها/توابع و آرگومان های جدید باید به صراحت تنظیم شوند. زبان های مثال: C++، D، C#.

تایپ ضمنی

در زبان هایی با تایپ ضمنی، وظیفه تعیین انواع به کامپایلر/مفسر منتقل می شود. زبان های مثال: جاوا اسکریپت، پی اچ پی، لوا. در چنین زبان هایی، به عنوان یک قاعده، اشیاء دارای روش های خاصی هستند که هنگام فرستادن به یک نوع فراخوانی می شوند. به عنوان مثال، PHP دارای متد _toString() و جاوا اسکریپت دارای متدی به همین نام است، اما بدون خط زیر، toString(). این متدها زمانی فراخوانی می شوند که یک شی به یک نوع رشته ای فرستاده می شود. گاهی اوقات چنین روش هایی جادو نامیده می شود (هر فرآیند ضمنی همیشه جادو است).

توجه به این نکته ضروری است که همه این دسته بندی ها همپوشانی دارند. بر اساس این دسته بندی ها، نتیجه می گیریم که جاوا اسکریپت دارای تایپ ضمنی پویا است. و با اغراق، ماهیت زبان را می توان اینگونه توصیف کرد: در هر موقعیت نامفهومی، همه چیز را به ابتدایی بیاورید، عمدتاً به یک رشته. اگرچه در واقعیت همه چیز کمی پیچیده تر است، اما اکنون به جزئیات نمی پردازیم.

چرا به تایپ نیاز داریم؟ ممکن است بپرسید بدون آن، جاوا اسکریپت به مدت 20 سال به خوبی زندگی می کرد. پاسخ ساده است: قبلاً وظایف پیچیده در سطح سازمانی در جاوا اسکریپت حل نمی شد. اکنون این زبان از مرورگر فراتر رفته و وارد قلمرو باطن شده است. هنگام نوشتن یک برنامه بزرگ، تشخیص خطاهایی که اغلب با نوع ریخته گری مرتبط هستند دشوار می شود.

افزونه های جاوا اسکریپت

از آنجایی که جاوا اسکریپت در اجرا می شود سمت مشتری(در مرورگرها)، یکی از گزینه های حل مشکل ایجاد یک زبان - گویش است که در JS کامپایل می شود. به عنوان مونتاژ کننده عمل می کند.

زبان‌هایی مانند TypeScript، Dart، AtScript پدید آمده‌اند که تایپ قوی ثابت و حتی بررسی نوع زمان اجرا را اضافه می‌کنند (اگرچه این کار سربار اضافه می‌کند). همه این زبان‌ها فقط انواع اضافه نمی‌کنند، بلکه قند نحوی یا حتی پیاده‌سازی VM خودشان را نیز اضافه می‌کنند که به زبان JS نوشته شده است.

مقاله کامل را در مجله بخوانید مدیر سیستم"، شماره 1-2 برای سال 2015 در صفحات 86-88.

نسخه PDF شماره داده شدهرا می توان در فروشگاه ما خریداری کرد.

  1. وب سایت Flow http://flowtype.org است.

در تماس با

هر یک از تیم ][ ترجیحات خود را در رابطه با نرم افزار و ابزارهای کاربردی برای pentest کردن دارند. پس از مشاوره متوجه شدیم: انتخاب به قدری متفاوت است که می توانید یک مجموعه برنامه های اثبات شده جنتلمن واقعی بسازید. در مورد آن تصمیم گرفتند. برای اینکه یک هودج ترکیبی ایجاد نشود، کل لیست به موضوعات تقسیم می شود. امروز تحلیل خواهیم کرد تحلیلگرهای کد استاتیکبرای جستجوی آسیب‌پذیری‌ها در برنامه‌ها زمانی که کد منبع آنها در دسترس است.

در دسترس بودن کدهای منبع برنامه، جستجوی آسیب پذیری ها را بسیار ساده می کند. به جای دستکاری کورکورانه پارامترهای مختلف که به برنامه ارسال می‌شوند، بسیار آسان‌تر می‌توان دید که چگونه آنها را پردازش می‌کند. فرض کنید، اگر داده های کاربر بدون بررسی و تبدیل منتقل شود، به پرس و جوی SQL برسد، ما یک آسیب پذیری تزریق SQL داریم. اگر آنها به خروجی کد HTML برسند، ما XSS کلاسیک را دریافت می کنیم. برای تشخیص واضح چنین موقعیت هایی به یک اسکنر استاتیک نیاز است، اما، متأسفانه، همیشه آنطور که به نظر می رسد آسان نیست.

کامپایلرهای مدرن

ممکن است خنده دار به نظر برسد، اما یکی از موثرترین آنهاست تحلیلگرهای کدخود کامپایلرها هستند. البته، آنها برای چیزی کاملا متفاوت در نظر گرفته شده اند، اما به عنوان یک امتیاز، هر یک از آنها یک تأیید کننده کد منبع خوب ارائه می دهد که می تواند تعداد زیادی خطا را شناسایی کند. چرا پس انداز نمی کند؟ در ابتدا، تنظیمات چنین تأیید کد کاملاً وفادارانه تنظیم می شود: در نتیجه، برای اینکه برنامه نویس را خجالت نکشید، کامپایلر فقط در مورد جدی ترین موانع شروع به قسم خوردن می کند. اما بیهوده - اگر سطح هشدارها را بالاتر قرار دهید، حفر مکان های مشکوک زیادی در کد کاملاً امکان پذیر است. به نظر می رسد این است. بیایید بگوییم در کد عدم بررسی طول رشته قبل از کپی کردن آن در بافر وجود دارد. اسکنر تابعی را پیدا می کند که یک رشته (یا قطعه ای از آن) را بدون بررسی طول آن در یک بافر با اندازه ثابت کپی می کند. مسیر انتقال آرگومان‌ها را دنبال می‌کند: از داده‌های ورودی به تابع آسیب‌پذیر و بررسی می‌کند که آیا می‌توان طول رشته‌ای را انتخاب کرد که باعث سرریز در تابع آسیب‌پذیر شود و با بررسی‌های قبل از آن قطع نشود. اگر چنین بررسی وجود نداشته باشد، تقریباً 100٪ سرریز بافر را پیدا می کنیم. مشکل اصلی در استفاده از یک کامپایلر برای بررسی این است که آن را "بلع" کد شخص دیگری کنید. اگر تا به حال سعی کرده اید یک برنامه را از منبع کامپایل کنید، می دانید که برآوردن تمام وابستگی ها، به خصوص در پروژه های بزرگ چقدر دشوار است. اما نتیجه ارزشش را دارد! علاوه بر این، IDE های قدرتمند علاوه بر کامپایلر، ابزارهای دیگری نیز دارند تجزیه و تحلیل کد. به عنوان مثال، قطعه کد زیر در ویژوال استودیو هشداری در مورد استفاده از تابع _alloca در حلقه صادر می کند که می تواند به سرعت پشته را سرریز کند:

char*b;
انجام دادن(
b = (char*)_alloca(9)
) while (1)

این مزیت آنالیزور استاتیک PREfast است. مانند FxCop برای تجزیه و تحلیل کد مدیریت شده، PREfast در ابتدا به عنوان توزیع شد ابزار جداگانهو بعداً بخشی از ویژوال استودیو شد.

RATS - ابزار حسابرسی خشن برای امنیت

وب سایت: www.securesoftware.com
مجوز: GNU GPL
پلتفرم: یونیکس، ویندوز
زبان ها: C++، PHP، Python، Ruby

خطا خطا - نزاع. برخی از ایراداتی که برنامه نویسان ایجاد می کنند، مهم نیستند و تنها با بی ثباتی برنامه تهدید می شوند. از سوی دیگر، برخی دیگر به شما اجازه می‌دهند کد پوسته را تزریق کنید و دستورات دلخواه را روی یک سرور راه دور اجرا کنید. دستوراتی که امکان سرریز بافر و سایر انواع مشابه حملات را فراهم می کند، از خطرات ویژه ای در کد هستند. بسیاری از این دستورات وجود دارد، در مورد C/C++ اینها توابعی برای کار با رشته ها هستند (xstrcpy()، strcat()، gets()، sprintf()، printf()، snprintf()، syslog() )، دستورات سیستم ( access()، chown()، chgrp()، chmod()، tmpfile()، tmpnam()، tempnam()، mktemp())، و همچنین دستورات فراخوانی سیستم (exec()، system () popen()). بررسی دستی کل کد (مخصوصاً اگر از چندین هزار خط تشکیل شده باشد) نسبتاً خسته کننده است. این بدان معنی است که شما به راحتی می توانید از انتقال برخی از عملکردهای پارامترهای بررسی نشده چشم پوشی کنید. ابزارهای ویژه برای حسابرسی، از جمله ابزار معروف موش ها (ابزار حسابرسی خشن برای امنیت) از شرکت معروف Fortify. این نه تنها با موفقیت کدهای نوشته شده در C / C ++ را مدیریت می کند، بلکه می تواند اسکریپت های Perl، PHP و Python را نیز پردازش کند. پایگاه داده ابزار شامل یک انتخاب چشمگیر با شرح مفصلی از مناطق مشکل در کد است. با کمک تحلیلگر، او منبعی را که به او داده می شود پردازش می کند و سعی می کند اشکالات را شناسایی کند و پس از آن اطلاعاتی در مورد کاستی های یافت شده ارائه می دهد. موش هااز طریق کار می کند خط فرمان، هم تحت سیستم های ویندوز و *nix.

یاسکا

وب سایت: www.yasca.org
مجوز: متن باز
پلتفرم: یونیکس، ویندوز
زبان ها: C++، جاوا، دات نت، ASP، Perl، PHP، Python و دیگران.

یاسکادرست مانند RATS نیازی به نصب ندارد، در حالی که نه تنها یک رابط کنسول، بلکه یک رابط کاربری گرافیکی ساده نیز دارد. توسعه دهندگان توصیه می کنند که ابزار را از طریق کنسول اجرا کنید - آنها می گویند، فرصت های بیشتری وجود دارد. خنده دار است که موتور یاسکا با PHP 5.2.5 نوشته شده است و مفسر (در کوتاه ترین نسخه) در یکی از زیر پوشه های آرشیو با برنامه است. کل برنامه به طور منطقی از یک جلو، مجموعه ای از پلاگین های اسکن، یک گزارش ساز و خود موتور تشکیل شده است که باعث می شود همه چرخ دنده ها با هم بچرخند. افزونه ها در فهرست افزونه ها ریخته می شوند - افزونه های اضافی نیز باید در آنجا نصب شوند. نکته مهم! سه تا از پلاگین های استاندارد ارائه شده با یاسکا، وابستگی های بدی دارند. JLint که فایل‌های .class جاوا را اسکن می‌کند، به jlint.exe در دایرکتوری resource/utility نیاز دارد. افزونه دوم، antiC، که برای تجزیه مرتب‌سازی جاوا و C/C++ استفاده می‌شود، به antic.exe در همان فهرست نیاز دارد. PMD، که کد جاوا را پردازش می کند، به جاوا JRE 1.4 یا بالاتر نیاز دارد که روی سیستم نصب شده باشد. می توانید با تایپ کردن دستور "yasca ./resources/test/" بررسی کنید که آیا نصب صحیح است یا خیر؟ یاسکانتیجه را در قالب یک گزارش ویژه تولید می کند. به عنوان مثال، یکی از پلاگین های استاندارد GREP اجازه می دهد تا از الگوهای شرح داده شده در فایل های grep استفاده کنید تا ساختارهای آسیب پذیر را مشخص کنید و به راحتی تعدادی از آسیب پذیری ها را شناسایی کنید. مجموعه ای از چنین الگوهایی قبلاً در برنامه گنجانده شده است: برای جستجوی رمزگذاری ضعیف، مجوز "رمز عبور برابر است با ورود"، تزریق SQL ممکن و موارد دیگر. زمانی که در گزارش می خواهید موارد بیشتری را مشاهده کنید اطلاعات دقیق، برای نصب افزونه های اضافی خیلی تنبل نباشید. چیزی که ارزش یک چیز را دارد این است که با کمک آنها می توانید کد را در .NET (VB.NET، C#، ASP.NET)، PHP، ColdFusion، COBOL، HTML، JavaScript، CSS، Visual Basic، ASP، Python، Perl اسکن کنید. .

Cppcheck

سایت اینترنتی:
مجوز: متن باز
پلتفرم: یونیکس، ویندوز
زبان: C++

توسعه دهندگان Cppcheckتصمیم گرفتیم که روی چیزهای کوچک پراکنده نشویم، و بنابراین فقط دسته بندی دقیق اشکالات و فقط در کد C ++ را بگیریم. انتظار نداشته باشید که برنامه هشدارهای کامپایلر را تکرار کند - این کار بدون درخواست کننده انجام می شود. بنابراین، برای تنظیم حداکثر سطح هشدار برای کامپایلر خیلی تنبل نباشید و از Cppcheck برای بررسی نشت حافظه، نقض عملیات تخصیص-تخصیص، سرریزهای مختلف بافر، استفاده از توابع منسوخ شده و موارد دیگر استفاده کنید. یک جزئیات مهم: توسعه دهندگان Cppcheck سعی کردند تعداد موارد مثبت کاذب را به حداقل برسانند. بنابراین، اگر برنامه یک خطا را برطرف کند، به احتمال زیاد می توانید بگویید: "این واقعاً است!" شما می توانید تجزیه و تحلیل را هم از کنسول و هم با کمک یک رابط کاربری گرافیکی زیبا که با Qt نوشته شده و تحت هر پلتفرمی کار می کند، شروع کنید.

فارغ التحصیلی

وب سایت: www.justanotherhacker.com/projects/graudit.html
مجوز: متن باز
پلتفرم: یونیکس، ویندوز
زبان ها: C++، PHP، Python، Perl

این اسکریپت ساده، همراه با مجموعه ای از امضاها، به شما امکان می دهد تعدادی از آسیب پذیری های مهم را در کد پیدا کنید و جستجو با استفاده از ابزار معروف grep انجام می شود. حتی ذکر رابط کاربری گرافیکی در اینجا نامناسب است: همه چیز از طریق کنسول انجام می شود. چندین کلید برای شروع وجود دارد، اما در ساده ترین حالت، کافی است مسیر منابع را به عنوان یک پارامتر مشخص کنید:

Graudit /path/to/scan

پاداش تلاش، گزارشی رنگارنگ در مورد مکان‌های بالقوه قابل بهره‌برداری در کد خواهد بود. باید بگویم که علاوه بر خود اسکریپت (که تنها 100 خط کد Bash است)، پایگاه های داده امضایی که حاوی regexps و نام توابع بالقوه آسیب پذیر در زبان های مختلف هستند، ارزشمند هستند. به طور پیش‌فرض، پایه‌های پایتون، پرل، PHP، C++ گنجانده شده است - می‌توانید فایل‌ها را از پوشه امضاها بردارید و از آنها در توسعه‌های خود استفاده کنید.

SWAAT

وب سایت: www.owasp.org
مجوز: متن باز
پلتفرم: یونیکس، ویندوز
زبان ها: جاوا، JSP، ASP.Net، PHP

اگر graudit از فایل های متنی برای تنظیم امضای آسیب پذیری استفاده می کند، سپس در SWAAT- یک رویکرد پیشرفته تر با فایل های XML. این چیزی است که یک امضای معمولی به نظر می رسد:

vuln match- عبارت منظمبرای جستجو؛
type - نوع آسیب پذیری را نشان می دهد:
شدت - نشان دهنده سطح خطر (بالا، متوسط ​​یا کم) است.
alt- گزینه جایگزینکد برای حل مشکل

SWAATپایگاه داده امضا را می خواند و از آن برای یافتن مناطق مشکل در منابع جاوا، JSP، ASP .Net و PHP استفاده می کند. پایگاه داده به طور مداوم به روز می شود و علاوه بر لیستی از توابع "خطرناک"، این شامل اشتباهات معمولیدر استفاده از قالب بندی رشته و نوشتن پرس و جوهای SQL. قابل توجه است که این برنامه به زبان C # نوشته شده است، اما به لطف پروژه Mono - اجرای باز پلت فرم .Net، تحت niks نیز به خوبی کار می کند.

اسکنر اشکال PHP

سایت: raz0r.name/releases/php-bug-scanner
مجوز: نرم افزار رایگان
پلتفرم: ویندوز
زبان: PHP

اگر نیاز به تجزیه و تحلیل استاتیک یک برنامه PHP دارید، توصیه می کنم امتحان کنید اسکنر اشکال PHP، که توسط نویسنده ما - raz0r نوشته شده است. کار برنامه بر اساس اسکن است توابع مختلفو متغیرهایی در اسکریپت های PHP که می توانند در حملات وب استفاده شوند. شرح چنین موقعیت‌هایی به‌اصطلاح پیش‌تنظیم‌ها انجام می‌شود و این برنامه در حال حاضر شامل 7 ایستگاه از پیش تنظیم خاص است که در دسته‌های گروه‌بندی شده‌اند:

  • اجرای کد؛
  • اجرای دستور؛
  • پیمایش دایرکتوری؛
  • جهانی ها بازنویسی می کنند.
  • عبارتند از؛
  • تزریق SQL؛
  • متفرقه

خنده دار است که این برنامه با PHP/WinBinder نوشته شده و با bamcompile کامپایل شده است، بنابراین درست شبیه یک برنامه معمولی ویندوز به نظر می رسد. از طریق یک رابط کاربر پسند، یک pentester می تواند تجزیه و تحلیل کد را برای آسیب پذیری های خاص فعال یا غیرفعال کند.

پیکسی

وب سایت: pixybox.seclab.tuwien.ac.at
مجوز: نرم افزار رایگان
پلتفرم: یونیکس، ویندوز
زبان: PHP

در قلب ابزار اسکن است کد منبعو ساخت نمودارهای جریان داده. این نمودار مسیر داده هایی را که از خارج از برنامه می آید - از کاربر، از پایگاه داده، از برخی افزونه های خارجی و غیره ردیابی می کند. به این ترتیب لیستی از نقاط آسیب پذیر (یا ورودی ها) در برنامه ها ساخته می شود. با کمک الگوهایی که آسیب‌پذیری‌ها را توصیف می‌کنند، Pixy چنین نقاطی را بررسی می‌کند و به شما امکان می‌دهد آسیب‌پذیری‌های XSS و SQL را تعیین کنید. علاوه بر این، خود نمودارها که در حین تجزیه و تحلیل ساخته می شوند، می توانند در پوشه نمودارها (به عنوان مثال xss_file.php_1_dep.dot) مشاهده شوند - این برای درک اینکه چرا این یا آن بخش از کد Pixy در نظر گرفته می شود بسیار مفید است. -آسیب پذیر. به طور کلی، توسعه خود بسیار آموزنده است و نشان می دهد که چگونه ابزارهای پیشرفته برای تجزیه و تحلیل کد استاتیک کار می کنند. در صفحه مستندات، توسعه دهنده به وضوح در مورد مراحل مختلف برنامه صحبت می کند، منطق و الگوریتم چگونگی تجزیه و تحلیل این یا آن قطعه کد توسط برنامه را توضیح می دهد. خود برنامه به زبان جاوا نوشته شده و به صورت متن باز توزیع شده است و در صفحه اصلی حتی یک سرویس آنلاین ساده برای بررسی کدهای آسیب پذیری XSS وجود دارد.

اونس 6

وب سایت: www.ouncelabs.com/products
مجوز: اشتراک افزار
پلتفرم: ویندوز

متأسفانه، راه حل های رایگان موجود هنوز یک برش پایین تر از همتایان تجاری خود هستند. کافی است کیفیت و جزییات گزارش را مطالعه کنید که همین است اونس 6- و بفهمید چرا این برنامه بر اساس یک موتور تجزیه و تحلیل ویژه Ounce Core است که کد را برای مطابقت با قوانین و سیاست های طراحی شده توسط تیمی از نفوذگران حرفه ای که تجربه شرکت های امنیتی معروف، جامعه هکرها و استانداردهای امنیتی را جمع آوری کرده اند بررسی می کند. . این برنامه انواع آسیب پذیری ها را در کد شناسایی می کند: از سرریز بافر گرفته تا تزریق SQL. در صورت تمایل، Ounce به راحتی با IDE های محبوب ادغام می شود تا بررسی خودکار کد را در طول ساخت هر بیلد جدید برنامه در حال توسعه پیاده سازی کند. به هر حال، شرکت توسعه دهنده - Ounce Labs - توسط خود IBM در تابستان امسال خریداری شد. بنابراین به احتمال زیاد این محصول به عنوان بخشی از یکی از برنامه های تجاری IBM به توسعه خود ادامه خواهد داد.

Klocwork Insight

وب سایت: www.klocwork.com
مجوز: اشتراک افزار
پلتفرم: ویندوز
زبان ها: C++، Java، C#

برای مدت طولانی، دوباره، یک محصول تجاری اسکن کد استاتیک را فقط برای C، C+ و جاوا پیاده‌سازی می‌کرد. اما، به محض اینکه Visual Studio 2008 و .NET Framework 3.5 عرضه شد، توسعه دهندگان پشتیبانی از C# را اعلام کردند. من برنامه را روی دو پروژه کمکی خود اجرا کردم که با عجله روی "شارپ" نوشتم و برنامه 7 آسیب پذیری مهم را آشکار کرد. خوب است که آنها منحصراً برای استفاده داخلی نوشته شده اند :). Klocwork Insightدر ابتدا پیکربندی شد، اول از همه، برای کار در ارتباط با محیط های توسعه یکپارچه. ادغام با همان Visual Studio یا Eclipse بسیار موفق است - شما به طور جدی فکر می کنید که چنین عملکردی باید به طور پیش فرض در آنها پیاده سازی شود :). اگر مشکلات منطق برنامه و مشکلات سرعت را در نظر نگیریم، پس Klocwork Insightبرای یافتن سرریزهای بافر، فیلتر کد کاربر از دست رفته، تزریق SQL/Path/Cross-site، رمزگذاری ضعیف و غیره کار بسیار خوبی انجام می دهد. یکی دیگر از گزینه های جالب این است که یک درخت اجرای برنامه بسازید، که به شما امکان می دهد به سرعت به آن بپردازید اصل کلیعملیات برنامه و به طور جداگانه، برای مثال، پردازش هر ورودی کاربر را دنبال کنید. و برای ساخت سریع قوانین برای بررسی کد، حتی یک ابزار ویژه ارائه شده است - Klocwork Checker Studio.

Coverity Prevent Analysis Static

وب سایت: www.coverity.com/products
مجوز: اشتراک افزار
پلتفرم: ویندوز
زبان ها: C++، Java، C#

یکی از معروف ترین تحلیلگرهای کد استاتیک برای C/C++، جاوا و سی شارپ. به گفته سازندگان آن، این راه حل توسط بیش از 100000 توسعه دهنده در سراسر جهان استفاده می شود. مکانیسم‌های متفکرانه به شما امکان می‌دهند جستجوی نشت حافظه، استثناهای کشف نشده، مشکلات عملکرد و البته آسیب‌پذیری‌های امنیتی را خودکار کنید. این محصول از پلتفرم‌های مختلف، کامپایلرها (gcc، Microsoft Visual C++ و بسیاری دیگر) پشتیبانی می‌کند و همچنین با محیط‌های توسعه مختلف، در درجه اول Eclipse و Visual Studio ادغام می‌شود. پیمایش کد بر اساس الگوریتم‌های پیمایش احمقانه از ابتدا تا انتها نیست، بلکه چیزی شبیه یک دیباگر است که نحوه رفتار برنامه را در موقعیت‌های مختلف پس از برخورد با شعبه تجزیه و تحلیل می‌کند. بنابراین، پوشش کد 100٪ به دست می آید. چنین رویکرد پیچیده ای، از جمله موارد دیگر، برای تجزیه و تحلیل کامل برنامه های کاربردی چند رشته ای که مخصوصا برای اجرا بر روی پردازنده های چند هسته ای بهینه شده اند، مورد نیاز بود. مرکز صداقت پوششبه شما امکان می دهد خطاهایی مانند شرایط مسابقه (خطایی در طراحی یک سیستم چندوظیفه ای، که در آن عملکرد سیستم به ترتیب اجرای بخش هایی از کد بستگی دارد)، بن بست ها و موارد دیگر را پیدا کنید. چرا برای معکوس ها لازم است؟ از توسعه دهندگان 0day sploits برای فایرفاکس و IE در مورد آن بپرسید :).

خزنده کد OWASP

وب سایت: www.owasp.org
مجوز: GNU GPL
پلتفرم: ویندوز
زبان ها: جاوا، سی شارپ، VB

خالق این ابزار، Alessio Marziali، نویسنده دو کتاب در ASP.NET، یک کدنویس معتبر برنامه های کاربردی پر بار برای بخش مالی و یک pentester است. در سال 2007، او آسیب پذیری های حیاتی را در 27 وب سایت دولتی ایتالیا منتشر کرد. فرزندان او - خزنده کد OWASP- طراحی شده برای تجزیه و تحلیل استاتیک کدهای .NET و J2EE / JAVA، به طور آشکار در اینترنت در دسترس است و در پایان سال نویسنده وعده انتشار آن را می دهد. نسخه جدیدبرنامه هایی با عملکرد بسیار بیشتر اما مهمترین چیز قبلاً پیاده سازی شده است - تجزیه و تحلیل کدهای منبع در سی #، ویژوال بیسیک و جاوا. فایل ها برای اسکن از طریق رابط کاربری گرافیکی انتخاب می شوند و اسکن به طور خودکار شروع می شود. برای هر بخش کد مشکل ساز، شرحی از آسیب پذیری در قسمت Threat Description نمایش داده می شود. درست است، میدانی دستورالعمل های OWASP، احتمالاً راه هایی برای حل مشکل را نشان می دهد ، افسوس که هنوز در دسترس نیست. اما می‌توانید از ویژگی آزمایشی اسکن کد بر روی یک دستگاه راه دور استفاده کنید که در تب Remote Scan موجود است. نویسنده قول می دهد که به طور جدی این ویژگی را ارتقا دهد و از جمله، کد منبع برنامه را برای تجزیه و تحلیل مستقیماً از سیستم کنترل نسخه جمع آوری کند.

هشدار

این اطلاعات برای اهداف اطلاعاتی ارائه شده است و در درجه اول نشان می دهد که چگونه توسعه دهندگان می توانند از خطاهای مهم در طول توسعه برنامه جلوگیری کنند. نه نویسنده و نه ویراستاران مسئول استفاده از دانش به دست آمده برای مقاصد غیرقانونی نیستند.