جلوگيری از دزدیده شدن محتویات وب سایت در ASP.NET
هر نوع اطلاعاتي که بتوان فقط با يک URL به آن دسترسي
پيدا کرد ديگر مال همه است و همه ميتوانند به آن دسترسي داشته باشند و سايتهايي مثل
گوگل در ظرف چند دقيقه کل اطلاعات شما را به اين صورت دريافت ميکنند.
بعضي اوقات شما دوست نداريد همه به اطلاعات شما دسترسي داشته باشند و ميخواهيد فقط
به بعضي افراد اجازه دسترسي به بعضي از فايلها را بدهيد خوب به نظر شما راه حل
چيست؟ اگر فقط يک سيستم مديريت کاربر بگذاريد و کاربران پس از ورود به آن URL خاص
دسترسي پيدا کنند خيلي جالب نخواهد بود زيرا فقط کافيست آن آدرس URL لو رود تا
مجددا افراد بدون مجوز بتوانند به آن دسترسي پيدا کنند. پس عملا Authentication
ساده ASP.net قادر به امن کردن فايلهاي شما نيست و شما بايد تدابير ديگري
بيانديشيد.
حتي در مورد اين فکر نکنيد مثلا اسم فايل را بگذاريد 32sdf43ef45.pdf چون اين کار
ابلهانهاي است و در اصل مسئله تفاوتي ايجاد نمي کند. يک Spider و يا يک Hacker خوب
ميتواند به راحتي به فايلهاي شما دسترسي پيدا کند.
راه حل در استفاده از HttpHandler است.
مروري بر HttpHandler
HttpHandler شامل يکسري API هايي جهت انجام امور اشياء Request/Response که با
استفاده از آن ميتوانيد انتقال اطلاعات را کنترل کنيد. در اينجا ما بايد يک Handler
ايجاد کنيد که در زماني که کسي درخواست يک فايل مثلا doc. ميدهد اجرا شود.
خوب بهتر است مقداري کد نويسي کنيم تا بهتر موضوع مشخص شود و متوجه شويد چطور
ميتوان در يک سايت E-Commerce اطلاعات را امن کرد بدون استفاده از تکنيک هاي FTP و
نياز به مرورگرهاي خاص.
تغيير Web.Config
مرحله اول: بايد تگ زير را در web.config موجود در فولدري که ميخواهيد آن را Secure
کنيد وارد کنيد.
|
<HttpHandlers>
<add verb="*" path="*.doc" type="pdfIntercept.pdfHandler, pdfInterceptX" />
</HttpHandlers>
|
با اينکار در واقع به IHttpHandler ميگوئيم که ما
ميخواهيم درخواستهايي که آخر آنها doc است را کنترل کنيم.
مشخصه verb ميتواند حالتهاي POST يا GET يا HEAD داشته باشد که در اينجا ما نوشته
ايم * يعني تمامي حالتهاي تقاضا را مورد پوشش قرار مي دهد.
مشخصه Path در واقع آدرسي که بايد مورد بررسي قرار گيرد که با نوشتن doc.* گفته ايم
کليه آدرس هاي منتهي به doc
مشخصه Type در واقع کلاس دات نت است که بايد تقاضا را Handle کند. بايد نام کامل
کلاس را به صورت زير بنويسيم.
[NAMESPACE].[CLASS], [ASSEMBLY NAME]
اضافه کردن يک پسوند دلخواه Custom Extension
بايد توجه کرد که بايد پسوند مورد نياز را در IIS هم اضافه کنيم. درضمن سپس تنظيمات
دايراکتوري محتوي فايلها را به صورت زير انجام دهيد:
Read : False
Write: False
Directory Browsing: False
حال IIS Manager را اجرا کنيد و سپس Properties/Edit…
را انتخاب کنيد آنگاه به بخش Home برويد و دکمه Configuration را بزنيد. سپس بايد
پسوند مورد نياز خود مثلا doc, pdf را در صفحه تنظيمات نرم افزار اضافه کنيد. برروي
دکمه add بزنيد و اطلاعات مورد نياز را پر کنيد کار بسيار ساده اي است.
بعد از اينکه اينکارها را کرده ايد حال آماده هستيد تا کد مربوط به HttpHandler را
بنويسيد.
کد HttpHandler
در زير کد مربوط به HttpHandler ارائه شده است. البته شما خود بايد کد مربوط به
Authentication مربوط به سايت خود را در آن قرار دهيد.
|
using System;
using System.Web;
using System.IO;
namespace pdfIntercept
{
public class pdfHandler : IHttpHandler
{
//Notice ProcessRequest is the only method
//exposed by the IHttpHandler
public void ProcessRequest(HttpContext context)
{
try
{
string strString = "yes";
HttpRequest oRequest = context.Request;
HttpResponse oResponse = context.Response;
//ADD YOUR CUSTOM AUTHENICATION HERE
//ADD YOUR CUSTOM AUTHENICATION HERE
//ADD YOUR CUSTOM AUTHENICATION HERE
//ADD YOUR CUSTOM AUTHENICATION HERE
if (strString == "yes")
{
//Since they've made it this far, they've been validated
//by your system…
//We'll fire up a FileStream object
FileStream MyFileStream;
long FileSize;
//Map the path to the .doc file
//You might need to parse out the Request path to figure out
//what resource they're actually requesting…
string strMapPath = context.Server.MapPath("book1.doc");
MyFileStream = new FileStream(strMapPath, FileMode.Open);
FileSize = MyFileStream.Length;
//Allocate size for our buffer array
byte[] Buffer = new byte[(int)FileSize];
MyFileStream.Read(Buffer, 0, (int)FileSize);
MyFileStream.Close();
//Do buffer cleanup
context.Response.Buffer = true;
context.Response.Clear();
//Add the appropriate headers
context.Response.AddHeader("content-disposition",
"attachement filename=x.doc");
//Add the right contenttype
context.Response.ContentType = "application/doc";
//Stream it out via a Binary Write
context.Response.BinaryWrite(Buffer);
}
else
{
//It's a bogus request and they weren't validated.
context.Response.Write("<b>DENIED</b>");
}
}
catch (System.Exception err)
{
err.ToString();
}
}
//By calling IsReusable, an HTTP factory can query a handler to
//determine whether the same instance can be used to service
//multiple requests
public bool IsReusable
{
get
{
return false;
}
}
}
}
|
اگر ميخواهيد پيچيدگي مربوط به binary stream را کم
کنيد ميتوانيد از متد Response.WriteFile به صورت زير استفاده کنيد.
|
if (strString == "yes")
{
context.Response.Buffer = true;
context.Response.Clear();
context.Response.AddHeader("content-disposition",
"attachement; filename=x.doc");
context.Response.ContentType = "application/doc";
context.Response.WriteFile("pp.doc");
}
else
{
context.Response.Write("<b>DENIED</b>");
}
|
مراحل کد ارائه شده به صورت زير است:
1. HttpHandler درخواست مربوط به يک فايل doc را دريافت ميکند.
2. سپس شما يکسري چک کردن با ديتابيس براي اينکه متوجه شويد کاربر مجاز به استفاده
است انجام ميدهيد.
3. اگر درخواست مجاز بود يک Binary Stream فايل را براي کاربر ارسال ميکند.
4. اگر درخواست غير مجاز بود برروي صفحه نوشته ميشود Denied
HttpHandler يک ابزار بسيار قوي جهت کنترل دسترسي به محتويات موجود برروي وب سايت
شما است.
از اين روش ميتوان در سايتهاي E-Commerce و در جاهايي که لازم دسترسي به يک يا چند
فايل محدود شود استفاده نمود. با اين روش ديگر هيچ URL در کار نخواهد بود که کسي
بتواند با منتشر کردن آن اطلاعات شما را بردارد.
منبع:
www.iranasp.net
نویسنده:Amin
Roudaky
|