تست امنیتی سیستم توسط تیم امنیتی

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

برنامه نویس وظیفه دارد که انواع آسیب پذیری های امنیتی که مربوط به برنامه نویسی هست را بداند ، مثل انواع Injection یا XSS  وباید طوری کد بنویسد که از آن ها جلوگیری کند.

در یک تیم نرم افزاری افراد با توانایی ها و تجارب مختلفی وجود دارند.ما نمی توانیم  از همه به یک اندازه انتظار داشته باشیم.حتی افراد با تجربه هم اشتباه می کنند.بنابراین این انتظار اشتباهی است که انواع مسائل امنیتیرا بخواهیم فقط با برنامه نویس مدیریت کنیم.

شرکت های متفاوتی وجود دارند که امنیت نرم افزار را چه از لحاظ انواع حملات چه از لحاظ منطق کسب و کار تست می کنند و نتیجه را گزارش می کنند.به عنوان مثال اعلام می کنند :نرم افزار شما در مقابل با Sql Injection در فلان صفحه مشکل دارد.

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

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

تست امنیتی می تواند موارد زیر را شامل شود:

  • امنیت در طرف مشتری
  • امنیت احراز هویت
  • امنیت جلسه کاربر
  • بررسی امنیت حقوق دسترسی
  • بررسی امنیت در مقابل تزریق دستورات
  • امنیت دسترسی به سیستم فایل
  • امنیت ذخیره و بازیابی اطلاعات
  • ثبت رد پای عملیات، وقایع و گزارش خطا
  • امنیت در معماری سیستم
  • بررسی امنیت در مقابل حمله به دیگر کاربران (حملات سایت گذر و …)
  • تست استقرار سیستم
  • بررسی کد منبع
  • و …

منابع:

بررسی امنیت نرم‌افزار

ارزیابی امنیتی برنامه‌های کاربردی

 

نگاهی بر Katana (ساخت یک برنامه ساده)

اگر با Node.js کار نکرده باشید به احتمال زیاد این موضوع برای شما جالب خواهد بود که وظیفه ساخت وب سرور به عهده خودتان است.در کاتانا نیز به همان ترتیب شما ، با کلاسی به نام Startup سرکار دارید که می توان آن را نقطه آغازین درخواست دانست.برای ساخت اولین برنامه براحتی می توانید یک پروژه ساده  ASP.NET Web Application ایجاد کنید.NewProjبعد از آن شما می بایست پکیج   Microsoft.Owin.Host.SystemWeb را از نوگت دریافت کنید.این پکیج باعث می شود سرور OWIN در جریان درخواست اجرا شود.برای دانلود آن خط زیر را در پاور شل نوگت تایپ کنید:

install-package Microsoft.Owin.Host.SystemWeb

دانلود پکیج فوق باعث دانلود شدن باقی وابستگی ها نیز می شود.به عنوان مثال  Microsoft.Owin،

در واقع  Microsoft.Owin, شامل تعدادی متد و کلاس کمکی برای توسعه برنامه تحت OWIN است.حال به راحتی می توان کد زیر را اجرا کرد:


public class Startup
{
   public void Configuration(IAppBuilder app)
   {
      app.Run(context =>
      {
         context.Response.ContentType = "text/plain";
         return context.Response.WriteAsync("Hello World!");
      });
   }
} 

 تعویض هاست

برنامه که در بالا نشان داده شد در قالب pipeline درخواست  ASP.NET  است و در واقع از System.Web استفاده می کند که این موضوع باعث می شود که درخواست در قالب IIS پردازششود.بنابراین می تواند از تمام مزایای IIS بهره مند شود.

زمانی وجود دارد که شما نیاز دارید برنامه خود را به صورت سبک تر و کوچکتر هاست کنید.در این صورت به یک هاست دیگر نیاز داریم  که بتوانیم برنامه را روی آن و خارج از IIS هاست کنیم.

فرض کنید شما نیاز دارید تا برنامه خود را روی  command line هاست کنید در این صورت می توانید از OwinHost.exe استفاده کنید که در واقع یک سرور HttpListener است.

مثل باقی کامپننت های Owin به راحتی می توانید OwinHost.exe  را از نوگت دریافت کنید:

install-package OwinHost

برای اجرا برنامه فولدر پروژه رفته و سپس مانند تصویر زیر به فولدر پکیج OwinHost و OwinHost.exe را اجرا کنید.

cmd

همانطور که مشاهده کردید به راحتی توانستیم هاست برنامه را تغییر دهیم.

ادامه دارد… .

تفاوت بین زبان های برنامه نویسی روبی،پایتون،پی اچ پی

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

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

البته این اینفوگرافیک کمی قدیمی است ولی بیشتر اطلاعات آن هم اکنون نیز صحیح هستند.

ادامه خواندن “تفاوت بین زبان های برنامه نویسی روبی،پایتون،پی اچ پی”

نگاهی بر Katana (استاندارد OWIN)

در پست قبلی بر لزوم وجود یک استاندارد برای مستقل شدن برنامه Asp.net از هاست تاکید شد.

نحوه پیدایش Owin

اعضای انجمن دات نت با الهام از Rack در Ruby یک انتزاع را بین Web servers و اجزای فریمورک با دو هدف اصلی بوجود آوردند.

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

اجزای Owin

حاصل این انتزاع ،شامل دو عنصر اصلی است:

 اول: Environment Dictionary : این ساختار داده ای ، شامل تمام داده های مورد نیاز برای پردازش یک درخواست یا جواب  HTTP  است.(Request and Response)

دیکشنری به شکل زیر تعریف شده است:


IDictionary<string, object>

 

وب سرور های مبتنی بر OWIN مسئولیت پر کردن environment dictionary را برعهده خواهند داشت.این داده ها شامل body streams وheader  هستند.پس از آن وظیفه برنامه یا فریمورک است تا مقادیر این دیکشنری را بروز نگه دارد.

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

مقادیر موجود در دیکشنری:

Key Name

Value Description

"owin.RequestBody"

A Stream with the request body, if any. Stream.Null MAY be used as a placeholder if there is no request body. See Request Body.

"owin.RequestHeaders"

An IDictionary<string, string[]><string, string[]=""> of request headers. See Headers.

"owin.RequestMethod"

string containing the HTTP request method of the request (e.g.,"GET""POST").

"owin.RequestPath"

string containing the request path. The path MUST be relative to the “root” of the application delegate; see Paths.

"owin.RequestPathBase"

string containing the portion of the request path corresponding to the “root” of the application delegate; see Paths.

"owin.RequestProtocol"

string containing the protocol name and version (e.g. "HTTP/1.0" or"HTTP/1.1").

"owin.RequestQueryString"

string containing the query string component of the HTTP request URI, without the leading “?” (e.g., "foo=bar&baz=quux"). The value may be an empty string.

"owin.RequestScheme"

string containing the URI scheme used for the request (e.g., "http","https"); see URI Scheme.

دومین عنصر OWIN یک delegate است.delegate در واقع واسط بین تمام اجزای OWIN است.delegate به شکل زیر تعریف شده است:

Func<IDictionary<string, object>, Task>;

Func بالا از جنس  environment dictionary را دریافت و یک Task را بر می گرداند.

این نوع طراحی چند مزیت دارد:

وابستگی های خیلی کمی برای نوشتن یک کامپننت مبتنی بر OWIN وجود دارد.
به صورت asynchronous طراحی شده و باعث بهره وری بیشتر می شود.
به علت اینکه delegate یک واحد atomic از اجرا و همچنین  environment dictionary روی delegate  حمل می شود ، کامپننت های Owin می توانند به راحتی به صورت ذنجیره وار حمل و یک جریان پیچیده از پردازش HTTP را ایجاد کنند.

اگر موضوع بالا کمی گیج کننده بود لطفا این پست را مطالعه کنید.

توجه به این موضوع لازم است که Owin یک specification  است و قرار نیست نسل بعدی فریمورک وب باشد.OWIN مشخص کننده چگونگی ارتباط وب سرور و وب فریمورک است.

 

نگاهی بر Katana (مقدمه)

استفاده از استاندارد Owinمدتی است که در تعداد کثیری از پروژهای مایکروسافت به چشم می خورد. از این رو تصمیم گرفتم در قالب چند پست به بررسی Katana که یک پیاده سازی از Owin  است ، بپردازم و مفاهیم آن را توضیح دهم.

مقدمه:

در ابتدا ASP.NET برای دو گروه از برنامه نویسان بوجود آمده بود.

اولین گروه برنامه نویسان classic ASP : تکنولوژی ASP  کلاسیک از اولین گزینه ها برای ساخت وبسایت ها داینامیک و داده محور،در زمان خودش بود که با فراهم کردن امکاناتی از قبیل cache ،session  و  state management می توانست بسیاری از نیاز های برنامه نویسان را پوشش دهد.اما ASP  کلاسیک ضعفهایی هم داشت و مهم ترین آن ها،پیچیده شدن بیش از اندازه در زمانی که برنامه رشد می کرد بود. کدهای تکراری و چسبندگی اجزای برنامه ، مدیریت آن را بسیار دشوار می ساخت.از این رو نیاز به راه حلی بود که بتوان از مشکلات خلاص شد.این جا بود که ASP.NET به وسیله قدرتی که به واسطه شی گرایی داشت به کمک برنامه نویسان آمد.

گروه دوم برنامه نویسان ویندوز بودند : برنامه نویسان ویندوز بر خلاف برنامه نویسان ASP  کلاسیک  به HTML عادت نداشتند و به کار با محیط ویژوال و درگ دراپی در IDE خو گرفته بوند.علاوه بر آن اصلا با محیط stateless وب آشنا نبودند.از این رو مایکروسافت کوشید که با کنترل های سمت سرور و همچنین با مفهومی مثل Viewstate این تازگی ها را مخفی کند.

چالش های جدید بر سر راه ASP.NET

وب بالغ تر شد و چالش های جدید بر سر راه قرار گرفت.دو چالش اصلی وجود داشت.اول اینکه framework یکپارچه بود ولی دارای واحد هایی از قابلیت های مختلف بود که چسبندگی بالایی به System.Webداشتند.این چسبندگی باعث می شد که فاصله بین هر releases برابر باشد با هر releases دات نت و این موضوع با سرعت بالا وب اصلا هم خوانی نداشت . بنابراین مشکل دوم این بود که مایکروسافت نمی توانست سرعت خود را برای releasesها افزایش دهد.

گامهای تکاملی

مایکروسافت برای بهتر کردن ASP.NET کارهایی انجام داد که ASP.NET MVC وASP.NET Web API از مهمترین این کارها بود که باعث شد ضعف های موجود در ASP.NET تا حدودی از بین بروند.نمونه ای از این ضعفها،چسبندگی business و markup بود.کار جالب دیگری که انجام داد،عدم وابستگی ASP.NET Web API  به System.Web.dll بود که باعث راحتی در بروزرسانیWeb API می شد.

فریمورک چابک

تجزیه اجزای فریمورک از یکدیگر و همچنین releases کردن آن ها از طریق نوگت در حال حاضر در حال انجام است.یکی از قابلیت های بسیار خوبی که در Web API’وجود دارد،امکان self-hosting است.در واقع باقی فریمورک ها نیز شاید نیاز داشته باشند تا مثل Web API’ از این قابلیت استفاده کنند که این موضوع مستلزم اجرای برنامه در هاست  و مدیریت جداگانه است.این جا است که برنامه ما به هاست دچار چسبندگی می شود.

حال نیاز است تا یک استانداری وجود داشته باشد که برنامه ما از هاست مستقل باشد تا بتوان در صورت نیاز و با کمترین تغییرات ، برنامه را در هر هاستی که نیاز بود مثل self-host و یا IIS اجرا کرد.

نگاهی به Visual Studio “14” CTP و Asp.net Vnext

نسخه Visual Studio “14” CTP  منتشر شد و همانطور که در پست های قبلی امکاناتی مثل Roslyn و Vnext را معرفی کرده بودم ،در این نسخه یک سری از آن ها وجود دارد .همچنین یکی دیگر از امکانات جالب Apache Cordova  برای ساخت برنامه موبایل به وسیله HTML و JavaScript است.البته این برنامه را مایکروسافت ننوشته و فقط از آن درVisual Studio  پشتیبانی می کند.

تصمیم گرفتم این نسخه را نصب کنم.اول دانلود این نسخه که تقریبا ۴ گیگ بود،کلی زمان برد.در کل قبل از دانلود این نسخه به محدودیت های اصلی باید توجه داشت:Visual Studio "14" CTP Setup

  • برای استقاده در پروژه های واقعی اصلا پیشنهاد نمی شود.
  • روی سیستمی که از نسخه های قبلی ویژوال استودیو استفاده می کند نصب نمی شود.

 

ادامه خواندن “نگاهی به Visual Studio “14” CTP و Asp.net Vnext”

استفاده از توانمندی های فردی در محیط کار

در مدتی که فری لنسر بودم،با یک سری از موضوعات اصلا طرف نبودم ولی از زمانی که به عنوان برنامه نویس،وارد یک شرکت شده ام با مسائل جدید روبرو شدم که شاید بد نباشد با شما به اشتراک بگذارم:

agile-team

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

تجربه به من ثابت کرده که یک برنامه نویس برای موفق شدن،فقط و فقط نیاز به دانش فنی ندارد.شما نیاز دارید که شناخته شوید،تا بتوان به شما اعتماد کرد.برای شناخته شدن نیز راهی وجود ندارد به غیر از نشان دادن توانایی های فنی و غیر فنی.

این موضوع مهم است که فقط نباید روی مسائل فنی تمرکز کرد.یکی از عواملی که در ایجاد حس اعتماد تاثیر بسزایی دارد،پیگیر بودن است.یعنی نباید منتظر یک تسک جدید نشست تا کسی آن را به شما محول کنید.

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

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

راه های جدید را امتحان کنید و وقتی از صحت آن ها مطمئن شدید آن ها را پیشنهاد دهید.

دانش دامین نیز از عوامل مهمی است که نباید از آن غافل شد.

پ.ن:

صرفا جهت انتقال تجربه.

دو قابلیت جدید در C#6

Ascyn در Exception

یکی از امکانات جدیدی که در سی شارپ ۶ وجود دارد امکان استفاده از سینتکس async در catch  و finally است. استفاده از سینتکس async  در سی شاارپ ۵ بسیار شناخته شده است.حال در نسخه ۶ ما می توانیم کارهایی مثل لاگ زدن و … را در بلاک catch  و finally از async  استفاده کنیم.

try
{
  WebRequest webRequest =
    WebRequest.Create("http://IntelliTect.com");
  WebResponse response =
    await webRequest.GetResponseAsync();
  // ...
}
catch (WebException exception)
{
  await WriteErrorToLog(exception);
}

در کد بالا ما از کلمه کلیدی await برای لاگ زدن استفاده کرده ایم.بنابراین ما قادر خواهیم بود به سادگی از مدل برنامه نویسی Task-base در catch  و finally استفاده کنیم.  

چک کردن Null

سناریو زیر را در نظر بگیرید:

parent.child.child.child;

حال اگر یکی از child ها null بود چه می شود؟

var g1 = [parent].[child].[null].child;

در نسخه های قبلی سی شارپ ،برای جلوگیری از exception مجبور بودیم به صورت زیر عمل کنیم:

var g1 = (Child)null;
var item = this.Parent;
if (item != null)
{
    item = item.Child;
    if (item != null)
    {
        item = item.Child;
        if (item != null)
        {
            g1 = item.Child;
        }
    }
}
if (g1 != null) // TODO

در نسخه جدید فقط کافی است کد بالا را با کد زیر تعویض کنیم:

var g1 = parent?.child?.child?.child;
if (g1 != null) // TODO

معرفی سایت NET Tips.

از حدود سه یا ۴ سال قبل با سایتی آشنا شدم که نقش مهم و اساسی در پیشرفتم داشت.

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

dotnettips

این سایت بسیار زیبا ، بستری را ایجاد کرده که یک عده برنامه نویس دور هم جمع شوند و دانش خود را به اشتراک بگذارند.

این سایت از چند بخش مختلف از قبیل مطالب ، لینکها  ، دوره ها و پروژه های سورس باز  تشکیل شده است که به زیبایی پاسخگوی کامل یک برنامه نویس دات نت هستند.

در قسمت دوره ها شما می توانید با بهترین مفاهیم روز آشنا شوید:

 

از همین رسانه کوچک از وحید نصیری مدیر این سایت با ارزش تشکر می کنم.

سایت NET Tips.

معرفی دو قابلیت جدید در ASP.NET vNext

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

حال دو قابلیت:

POCO Controllers

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

public class HomeController
{
    // Helpers can be dependency injected into the controller
    public HomeController(IActionResultHelper resultHelper)
    {
        Result = resultHelper;
    }

    private IActionResultHelper Result { get; set; }

    public ActionResult Index()
    {
        return Result.Json(new { message = "Poco controllers!" });
    }
}

در کد بالا خبری از ارث بری از کلاس خاصی وجود ندارد.

Dependency Injection

همانطور که قبلا هم گفتم از Dependency injection  به صورت تو کار پشتیانی می شود.یعنی می توان به وسیله  IoC container وابستگی ها را تزریق کرد.

public class Startup
{
    public void Configure(IBuilder app)
    {
        var containerBuilder = new ContainerBuilder();
        containerBuilder.RegisterType().As().SingleInstance();
        containerBuilder.RegisterType().As().InstancePerLifetimeScope();
        containerBuilder.RegisterType().As().InstancePerDependency();

        AutofacRegistration.Populate(containerBuilder, Enumerable.Empty(), app.ApplicationServices);
        var container = containerBuilder.Build();

        app.UseServices(container.Resolve());

        app.Run(async context =>
            await context.Response.WriteAsync("---------- Done\r\n"));
    }
}

در کد بالا ما برای تزریق وابستگی از Autofac استفاده کرده ایم.

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

مایکروسافت به سمت کوچکتر کردن .NET Framework  و شکستن آن به پکیج های ریز تر رفته که این کار باعث سادگی در packaging و versioning خواهد شد.

یکی دیگر از نکات قابل توجه این است که دو برنامه قادر خواهند بود که در کنار یک دیگر روی سرور با ورژن های مختلف CLR بدون هیچ مشکلی کار کنند.