۱۳۸۸/۰۳/۱۸

مشكل امنيتي FreeTextBox‌ و روش رفع آن


FreeTextBox يكي از اديتورهاي متني بسيار خوب تحت وب ASP.Net‌ است كه از نگارش 1 تا 3 و نيم ASP.Net را پشتيباني مي‌كند. به همراه آن يك image gallery هم جهت آپلود تصاوير ارائه مي‌شود كه بسيار ارزشمند است. اما مشكلي كه دارد عدم بررسي پسوند فايل آپلود شده است. به عبارتي خاصيت AcceptedFileTypes آن هنگام آپلود تصاوير بررسي نمي‌شود و مي‌تواند مشكلات امنيتي حادي را به وجود آورد (براي مثال شخص بجاي تصوير مي‌تواند فايل aspx را نيز آپلود كند). راه حلي هم براي آن وجود ندارد. سورس اين كامپوننت فقط به خريداران ارائه مي‌شود و نگارش مجاني آن بدون سورس است.

اما با استفاده از توانايي‌هاي موجود در فايل استاندارد global.asax مي‌توان روي آپلود تمامي فايل‌ها در برنامه نظارت داشت (نه فقط اين يك مورد بلكه سراسر برنامه تحت كنترل قرار مي‌گيرد). روش كار به صورت زير است:
protected void Application_BeginRequest(Object sender, EventArgs e)
{
List<string> toFilter = new List<string> { ".aspx", ".asax", ".asp", ".ashx", ".asmx", ".axd", ".master", ".svc" };
if (HttpContext.Current != null && HttpContext.Current.Request != null && HttpContext.Current.Request.Files != null)
for (int i = 0; i < HttpContext.Current.Request.Files.Count; i++)
{
string fileNamePath = HttpContext.Current.Request.Files[i].FileName.ToLower();
string name = Path.GetFileName(fileNamePath);
string ext = Path.GetExtension(fileNamePath);
if (toFilter.Contains(ext) || name == "web.config")
{
HttpContext.Current.Response.StatusCode = 403; //Forbidden
HttpContext.Current.Response.End();
}
}
}
در اين‌جا تمامي فايل‌هاي آپلودي بررسي شده و اگر پسوند خطرناكي داشتند، يك صفحه forbidden به شخص نمايش داده مي‌شود و تمام!

اين كد را به صورت Http module هم مي‌توان درآورد.