PDA

View Full Version : سوال: جلوگیری از دسترسی به فایل ها از بیرون سایت



farhadt
دوشنبه 07 آذر 1390, 11:46 صبح
سلام.

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

PhoenixNet
دوشنبه 07 آذر 1390, 23:01 عصر
در Asp .NET کار سختی می باشد چون در نسخه های IIS 7.5 به پایین شما امکان کنترل عکس ها و فایل ها غیر از صفحات مخصوص ASP .NET را ندارید.
راه حل :
یک صفحه ASP .NET بین فایل ها و دید بیرونی به فایل ایجاد نمایید.در این صورت با ورود یک درخواست می توانید با استفاده از اطلاعات Request متوجه بشید که درخواست از دامنه دیگری است یا نه!
مثال :
Http://sample.com/file.aspx?id=1234

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

http://mvolo.com/blogs/serverside/archive/2006/11/10/Stopping-hot_2D00_linking-with-IIS-and-ASP.NET.aspx

programer-ir
دوشنبه 07 آذر 1390, 23:37 عصر
فکر می کنم خیلی کار سختی باشه ولی اگه بشه خیلی برای سایت مزیت بالایی حساب می شه

Saman Hashemi
سه شنبه 08 آذر 1390, 07:36 صبح
خوب اگه save as کرد یا به هر طریقی عکس ذخیره کرد میتونه بذاره تو سایت دیگه...!
بهترین کار اینه که روی عکس آدرس سایت بندازید اتفاقا خوب هست تبلیغات رایگان میشه...!:چشمک:

meisam3322
سه شنبه 08 آذر 1390, 08:15 صبح
با سلام خدمت دوست خوبم ، سامان

با گذاشتن آدرس سایت برروی عکس به دلیل کپی رایت و مسائل مشابه، اگه یه زمانی عکس واقعا مهم باشه (حالا به هر دلیل طرفی که عکس های شما رو از روی سایت برداشته) ، نرم افزارهای قدرتمند و زیادی هست که کارشون فقط و فقط حذف Watermark از روی عکس و فیلو هست.

Saman Hashemi
سه شنبه 08 آذر 1390, 10:17 صبح
با گذاشتن آدرس سایت برروی عکس به دلیل کپی رایت و مسائل مشابه، اگه یه زمانی عکس واقعا مهم باشه (حالا به هر دلیل طرفی که عکس های شما رو از روی سایت برداشته) ، نرم افزارهای قدرتمند و زیادی هست که کارشون فقط و فقط حذف Watermark از روی عکس و فیلو هست.
این یه راهی بود که حداقل طرف به زحمت بندازه و الا شدن اینطوری که شما میگی میشه لابد...!

rahmatr
سه شنبه 08 آذر 1390, 21:23 عصر
با استفاده از HttpModule (http://msdn.microsoft.com/en-us/library/ms227673.aspx) این کار امکان پذیر و بسیار ساده است.

یک نمونه ساده اینجا هست :
http://madskristensen.net/post/HttpModule-to-block-external-referrers-in-ASPNET.aspx

fakhravari
سه شنبه 08 آذر 1390, 21:55 عصر
با سلام
اقایrahmatrاگر میشه کمی در باره این موضوع توضیح دهید.

rahmatr
چهارشنبه 09 آذر 1390, 09:48 صبح
هر درخواستی از کلاینت به سرور، چه یک فایل aspx باشد یا یک فایل css و یا یک عکس، ابتدا از تونل HttpModule ها عبور می کند و بعد به خود فایل می رسد. حال اگر در یک HttpModule این درخواست برگشت داده شود، دیگر به فایل نمی رسد.

78538

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

کلاسهای HttpModule باید با اینترفیس IHttpModule پیاده سازی شوند :

using System;
using System.Web;
using System.Linq;

public class BlockOtherHosts : IHttpModule
{
string[] BlockedFiles = new string[] { ".jpg", ".css", ".js" };

public void Init(HttpApplication application)
{
application.BeginRequest += new EventHandler(this.Application_BeginRequest);
}

private void Application_BeginRequest(Object source, EventArgs e)
{
HttpContext context = ((HttpApplication)source).Context;

string filePath = context.Request.FilePath;
string fileExtension = VirtualPathUtility.GetExtension(filePath);

if (BlockedFiles.Contains(fileExtension.ToLower()))
{
if (context.Request.UrlReferrer != null && !context.Request.UrlReferrer.Host.Equals(context.R equest.Url.Host,StringComparison.OrdinalIgnoreCase ))
{
context.Response.Write("<h1><font color=red>دسترسی غیر مجاز</font></h1>");
context.Response.End();
}
}
}

public void Dispose() { }
}


در این کلاس context.Request.UrlReferrer آدرس صفحه ای که این درخواست را فرستاده (همان سایتی که از فایل شما سوءاستفاده کرده!) و context.Request.FilePath مسیر فایل درخواستی بر روی سایت شماست.
بقیه کد به اندازه کافی واضح است.

کلاس را به پروژه اضافه کنید و در فایل web.config ثبت کنید :
برای IIS 6.0 و IIS 7.0 Classic Mode :


<configuration>
<system.web>
<httpModules>
<add name="BlockOtherHosts" type="BlockOtherHosts"/>
</httpModules>
</system.web>
</configuration>

و برای IIS 7.0 Integrated Mode


<configuration>
<system.webServer>
<modules>
<add name="BlockOtherHosts" type="BlockOtherHosts"/>
</modules>
</system.webServer>
</configuration>


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

دسترسی غیر مجاز

fakhravari
چهارشنبه 09 آذر 1390, 12:16 عصر
با سلام
مثال ادرس عکس میدم http://a-velayat.com/5_files/bg-tile-.jpg
من کلاس بالا را در APP_code گذاشتم و ادرس کنفیگ هم دادم ولی ادرس عکس بالا بازم باز میشود.

rahmatr
چهارشنبه 09 آذر 1390, 12:21 عصر
مثال ادرس عکس میدم http://a-velayat.com/5_files/bg-tile-.jpg
من کلاس بالا را در APP_code گذاشتم و ادرس کنفیگ هم دادم ولی ادرس عکس بالا بازم باز میشود.


اون کلاس برای جلوگیری از دسترسی به فایلها از سایتهای دیگر بود.
وقتی آدرس فایل را در مرورگر بصورت دستی باز می کنید، context.Request.UrlReferrer برابر null است و دستورات داخل بلوک if اجرا نمی شوند.

اگر می خواهید در این حالت هم فایل باز نشود، دستور if را تغییر دهید :

if (context.Request.UrlReferrer == null || !context.Request.UrlReferrer.Host.Equals(context.R equest.Url.Host, StringComparison.OrdinalIgnoreCase))

fakhravari
چهارشنبه 09 آذر 1390, 13:41 عصر
با سلام
if تغیر دادم نشد :گیج:

rahmatr
چهارشنبه 09 آذر 1390, 18:47 عصر
من تست کردم کار می کرد. توی همین کلاس breakPoint بذار ببین اشکال کجاست.

البته یک سوال برای خودم پیش اومد که آیا این کار جلوی ایندکس شدن عکس ها و فایلهای سایت رو در موتورهای جستجو نمی گیرد؟ و یا مشکلات دیگری ندارد؟

کسی اطلاع دارد؟

fakhravari
چهارشنبه 09 آذر 1390, 23:09 عصر
با سلام
ax ببنید. تمام مراحل رفتم.

Saber_Fatholahi
پنج شنبه 10 آذر 1390, 11:23 صبح
من تست کردم کار می کرد. توی همین کلاس breakPoint بذار ببین اشکال کجاست.

البته یک سوال برای خودم پیش اومد که آیا این کار جلوی ایندکس شدن عکس ها و فایلهای سایت رو در موتورهای جستجو نمی گیرد؟ و یا مشکلات دیگری ندارد؟

کسی اطلاع دارد؟

سلام نه همشهری
برای محدود کردن دسترسی ربات های جستجوگرها می توانید از فایلی به نام robots.txt در ریشه سایت استفاده کرده و محدودیت هاارو اعمال کنید
مثلا یک نمونه از فایل ها:


User-agent: *
Disallow: /Admin/
Disallow: /App_Code/
Disallow: /CKEditor/
Disallow: /CKFinder/
Disallow: /App_Themes/
Disallow: /App_Data/
Disallow: /bin/
Disallow: /Images/
Disallow: /Web.config
Disallow: /CSS/
Disallow: /Global.asax
Disallow: /JS/
Disallow: /Scripts/
Disallow: /Users/

که با توچه به نیازتون میتونین محدودیت هارو حتی روی موتور جستجوی خاصی اعمال کنید

موفق و موید باشید

fakhravari
پنج شنبه 10 آذر 1390, 23:28 عصر
با سلام اقای Saber_Fatholahi
در مورد این مطلب اگر میشه راهنمایی های لازم رو بکنید :خجالت:

Saber_Fatholahi
جمعه 11 آذر 1390, 07:22 صبح
دوست عزیز تا جایی که تونستم واضح و روشن شرح دادم مثال هم گذاشتم البته نمی دونم منظور شما از روشن چیه:بامزه:

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

حالا ما با این فایل می تونیم برای این رباتهای فضول دسترسی به بعضی قسمت هارو محدود کنیم که اونارو اینکس نمی کنه دیگه به روباتها خزنده هم می گن

موفق و موید باشید

rahmatr
جمعه 11 آذر 1390, 11:49 صبح
سلام نه همشهری
برای محدود کردن دسترسی ربات های جستجوگرها می توانید از فایلی به نام robots.txt در ریشه سایت استفاده کرده و محدودیت هاارو اعمال کنید

محدود کردن دسترسی ربات های جستجوگر یک بحث جداست و با ممنوع کردن درخواست های سایتهای دیگر متفاوت است.

منظور من این بود که مثلا وقتی دسترسی به عکسهای یک سایت از سایتهای دیگر با روشی که در پست 9 (http://barnamenevis.org/showthread.php?315587-%D8%AC%D9%84%D9%88%DA%AF%DB%8C%D8%B1%DB%8C-%D8%A7%D8%B2-%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C-%D8%A8%D9%87-%D9%81%D8%A7%DB%8C%D9%84-%D9%87%D8%A7-%D8%A7%D8%B2-%D8%A8%DB%8C%D8%B1%D9%88%D9%86-%D8%B3%D8%A7%DB%8C%D8%AA&p=1386333&viewfull=1#post1386333) شرح دادم ممنوع شده باشد، اگر کاربری یکی از عکسهای سایت را در جستجوی گوگل پیدا کرده و کلیک کند، ممکن است عکس نمایش داده نشود و یا شاید اصلا این کار جلوی ایندکس شدن عکس را در گوگل گرفته باشد.

sh-eng
جمعه 11 آذر 1390, 13:21 عصر
خوب اگه با print sc عکس رو برداشتن چی؟

fakhravari
جمعه 11 آذر 1390, 23:41 عصر
با سلام خدمت اقای rahmatr
در مورد باز نشدن تصاویر و فایلها اگر میشه یه سمپل کوچیک درست کنید ممنون میشم چون هر کاری میکنم بازم تصاویر باز میشن:خجالت:
ابن باز نشدن روی هاست جواب میده یا روی سیستم خودمون هم جواب میده

Saber_Fatholahi
شنبه 12 آذر 1390, 11:03 صبح
محدود کردن دسترسی ربات های جستجوگر یک بحث جداست و با ممنوع کردن درخواست های سایتهای دیگر متفاوت است.

منظور من این بود که مثلا وقتی دسترسی به عکسهای یک سایت از سایتهای دیگر با روشی که در پست 9 (http://barnamenevis.org/showthread.php?315587-%D8%AC%D9%84%D9%88%DA%AF%DB%8C%D8%B1%DB%8C-%D8%A7%D8%B2-%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C-%D8%A8%D9%87-%D9%81%D8%A7%DB%8C%D9%84-%D9%87%D8%A7-%D8%A7%D8%B2-%D8%A8%DB%8C%D8%B1%D9%88%D9%86-%D8%B3%D8%A7%DB%8C%D8%AA&p=1386333&viewfull=1#post1386333) شرح دادم ممنوع شده باشد، اگر کاربری یکی از عکسهای سایت را در جستجوی گوگل پیدا کرده و کلیک کند، ممکن است عکس نمایش داده نشود و یا شاید اصلا این کار جلوی ایندکس شدن عکس را در گوگل گرفته باشد.

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

fakhravari
شنبه 12 آذر 1390, 16:43 عصر
با سلام
اقای rahmatr در مورد غیر فعال کردن این فایل ها صحبت میکردند .
بحث اقای Fatholahi (http://barnamenevis.org/member.php?32514-Saber_Fatholahi) بر روی فایها و بخش های دیگر که توسط روبوتها پیدا میشد.
حالا اگر این ربوتها این فایها رو پیدا کنند با روش اقای rahmatr دیگر عکسها و فایهای دیگر نمایش داده نمیشود

fakhravari
یک شنبه 28 اسفند 1390, 20:47 عصر
با سلام اقای rahmatr
من این سمپل داشتم اما روی هاست تست نکرده بودم.
روی لوکال همه چیز درسته اما روی هاست چرا کار نمیکنه.
iis هم ست کردم.:گیج:

fakhravari
یک شنبه 28 اسفند 1390, 21:03 عصر
بله انگار درست شد.
نمیشه از یه دستور بهتری استفاده شود؟ string[] BlockedFiles = new string[] { ".zip", ".rar", ".doc", ".jpg" };
به جاش از ContentType استفاده کرد که امنیتش بالا بره.
string[] ax = { "image/gif", "image/bmp", "image/jpeg", "image/pjpeg", "image/png", "image/tiff", "image/vnd", "image/svg+xml" };

fakhravari
یک شنبه 24 مرداد 1395, 10:30 صبح
هر درخواستی از کلاینت به سرور، چه یک فایل aspx باشد یا یک فایل css و یا یک عکس، ابتدا از تونل HttpModule ها عبور می کند و بعد به خود فایل می رسد. حال اگر در یک HttpModule این درخواست برگشت داده شود، دیگر به فایل نمی رسد.

78538

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

کلاسهای HttpModule باید با اینترفیس IHttpModule پیاده سازی شوند :

using System;
using System.Web;
using System.Linq;

public class BlockOtherHosts : IHttpModule
{
string[] BlockedFiles = new string[] { ".jpg", ".css", ".js" };

public void Init(HttpApplication application)
{
application.BeginRequest += new EventHandler(this.Application_BeginRequest);
}

private void Application_BeginRequest(Object source, EventArgs e)
{
HttpContext context = ((HttpApplication)source).Context;

string filePath = context.Request.FilePath;
string fileExtension = VirtualPathUtility.GetExtension(filePath);

if (BlockedFiles.Contains(fileExtension.ToLower()))
{
if (context.Request.UrlReferrer != null && !context.Request.UrlReferrer.Host.Equals(context.R equest.Url.Host,StringComparison.OrdinalIgnoreCase ))
{
context.Response.Write("<h1><font color=red>دسترسی غیر مجاز</font></h1>");
context.Response.End();
}
}
}

public void Dispose() { }
}


در این کلاس context.Request.UrlReferrer آدرس صفحه ای که این درخواست را فرستاده (همان سایتی که از فایل شما سوءاستفاده کرده!) و context.Request.FilePath مسیر فایل درخواستی بر روی سایت شماست.
بقیه کد به اندازه کافی واضح است.

کلاس را به پروژه اضافه کنید و در فایل web.config ثبت کنید :
برای IIS 6.0 و IIS 7.0 Classic Mode :


<configuration>
<system.web>
<httpModules>
<add name="BlockOtherHosts" type="BlockOtherHosts"/>
</httpModules>
</system.web>
</configuration>

و برای IIS 7.0 Integrated Mode


<configuration>
<system.webServer>
<modules>
<add name="BlockOtherHosts" type="BlockOtherHosts"/>
</modules>
</system.webServer>
</configuration>


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

دسترسی غیر مجاز


برای iis 8 باید چیکار کرد؟