PDA

View Full Version : سوال: چگونگی نگهداری تصاویر در سایت بصورت امن



daffy_duck376
دوشنبه 23 فروردین 1389, 16:17 عصر
سلام دوستان.در یک سایت مجبور هستم تصاویری رو که کاربران upload می کنند به صورت خیلی امن نگهداری کنم به صورتی که هیچکس به تصاویر سایرین دسترسی نداشته باشد و فقط عکسهای ارسال شده خودش رو بتواند ببیند.حال من دو راه دارم 1- عکس ها رو توی database ذخیره کنم که در این صورت حجم دیتابیس بسیار بزرگ شده و نگهداری سایت هزینه سنگینی خواهد داشت و یا نام تصاویر را با الگوریتم های رمز نگاری رمز کنم و ذخیره کنم در این صورت مشکل حجم بانک برطرف میشود ولی امنیت پایین تری دارد. دوستان کسی پیشنهاد بهتری داره . به نظر شما روش دوم از نظر امنیت چقدر مشکل دارد. آنقدری هست که کلا بیخیالش بشم؟توضیح اینکه احراز هویت سیستم کاربری form authentication می باشد.

Peyman.Gh
دوشنبه 23 فروردین 1389, 17:39 عصر
تصاویر را تغییر پسوند بده مثلاً پسوندی که برای IIS شناخته شده باشد مثل Ascx !

daffy_duck376
دوشنبه 23 فروردین 1389, 20:01 عصر
تصاویر را تغییر پسوند بده مثلاً پسوندی که برای IIS شناخته شده باشد مثل Ascx !
میشه بگید این کار چه حسنی داره ؟ بیشتر توضیح بدید. اگر بعدا بخواهم تصاویر رو نمایش بدم و یا دانلود کنم به مشکل بر نمی خورم ؟

Peyman.Gh
دوشنبه 23 فروردین 1389, 20:05 عصر
یکی از مزیت های این کار این است که به عنوان مثال شما عکسی با نام Test.jpg دارید و وقتی این آدرس را در مرورگر وارد نمایید عکس برای شما نمایش داده میشود اما زمانی که مثلاً به Ascx تغییر پسوند دهید (ASP.NET User Control) این پسوند برای IIS شناخته شده میباشد و اگر Test.Ascx را وارد نمایید تصویر را به شما نشان نمیدهد.
بر روی سرور این مساله را امتحان نمایید.

alireza_s_84
دوشنبه 23 فروردین 1389, 20:31 عصر
یکی از مزیت های این کار این است که به عنوان مثال شما عکسی با نام Test.jpg دارید و وقتی این آدرس را در مرورگر وارد نمایید عکس برای شما نمایش داده میشود اما زمانی که مثلاً به Ascx تغییر پسوند دهید (ASP.NET User Control) این پسوند برای IIS شناخته شده میباشد و اگر Test.Ascx را وارد نمایید تصویر را به شما نشان نمیدهد.
بر روی سرور این مساله را امتحان نمایید.
خوب این روش روش بدی نیست اما اگر قرار باشه عکس ها فقط خود کاربر ببینه که مشکل پیش میاد چون پردازش فایلها برای هر کاربری به یک شکل توسط IIS صورت میگیره یعنی هرکسی که درخواست این عکس ها رو بده سرور درخواست رو بلوکه میکنه اما بهتره اینجوری عمل کنیم که از الگوریتم خاصی برای ذخیره عکسهای هر کاربر استفاده کنیم برای مثال به ازای هرکاربر پوشه ای داشته باشیم همنام یوزرنیم یا شناسه کاربر و یا اینکه اسم فایلهای ذخیره شده رو با نام کاربری یا شناسه کاربر ذخیره کنیم. بعد با نوشتن یک httpModule درخواستهایی رو که به این عکسها صورت میگیره رو چک میکنیم که توسط چه کاربری صورت گرفته اگر کاربر لاگین کرده کاربر موردنظر باشه که اجازه دیدن عکس رو میدیم و گرنه اونو به صفحه ای هدایت میکنیم که شما نمیتنونید این عکس رو ببینید.
اگر نیاز به کد داشتی اعلام کن برات یک نمونه قرار میدم.
موفق باشید

Peyman.Gh
دوشنبه 23 فروردین 1389, 20:43 عصر
خوب این روش روش بدی نیست اما اگر قرار باشه عکس ها فقط خود کاربر ببینه که مشکل پیش میاد چون پردازش فایلها برای هر کاربری به یک شکل توسط IIS صورت میگیره یعنی هرکسی که درخواست این عکس ها رو بده سرور درخواست رو بلوکه میکنهخوب موقع نمایش عکس را به حالت اول بر میگردونیم.

alireza_s_84
دوشنبه 23 فروردین 1389, 20:56 عصر
خوب موقع نمایش عکس را به حالت اول بر میگردونیم.
اینکار عیب داره مراحل کار رو دقت کنید:
1- هر کاربری عکسی رو آپلود کرد ما پسوند فایل رو عوض میکنیم.
2- هر وقت کاربری عکسی رو درخواست کرد ما باید یک الگوریتمی داشته باشیم تا ببینیم که این کاربر به کدوم عکس اجازه دسترسی داره به کدوم نداره.
3- اگر کاربر اجازه داشت عکس رو تغییر نام میدیم تا کاربر بتونه اون رو ببینه.
خوب به نظر شما اینکار روش درستیه؟؟؟
نباید مدام عکس ها رو تغییر نام بدیم بلکه با یک ماژول به راحتی میتونیم درخواست رو بررسی کنیم
و بدون هیچ تغییر نامی عکس ها رو در محیط امنی قرار بدیم.
برای مثال شما وقتی میخوای یک صفحه داشته باشی که کاربران لاگین نکرده اون رو نبینن میای اونو تغییر نام میدی یا اینکه از یک ماژول استفاده میکنی تا کاربر رو تعیین هویت کنی؟؟؟

Peyman.Gh
دوشنبه 23 فروردین 1389, 21:03 عصر
خوب شما به چه نحوی میخواهید بر روی محتویات درون یک پوشه نظارت داشته باشید ؟!
به طور مثال تصویر Test.Jpg در پوشه image میباشد و من با وارد کردن آدرس آن به صورت
image/Test.jpg/ آیا نمیتونم عکس را مشاهده کنم ؟!

alireza_s_84
دوشنبه 23 فروردین 1389, 21:18 عصر
خوب شما به چه نحوی میخواهید بر روی محتویات درون یک پوشه نظارت داشته باشید ؟!
به طور مثال تصویر Test.Jpg در پوشه image میباشد و من با وارد کردن آدرس آن به صورت
image/Test.jpg/ آیا نمیتونم عکس را مشاهده کنم ؟!

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

Peyman.Gh
دوشنبه 23 فروردین 1389, 21:29 عصر
اگر من یک httpHandler بنویسم و به شما اجازه ندم شما چه جوری میخوای ببینی؟

این هم به عنوان راه حل دوم میشه منظور کرد :متفکر:

daffy_duck376
سه شنبه 24 فروردین 1389, 06:46 صبح
خوب این روش روش بدی نیست اما اگر قرار باشه عکس ها فقط خود کاربر ببینه که مشکل پیش میاد چون پردازش فایلها برای هر کاربری به یک شکل توسط IIS صورت میگیره یعنی هرکسی که درخواست این عکس ها رو بده سرور درخواست رو بلوکه میکنه اما بهتره اینجوری عمل کنیم که از الگوریتم خاصی برای ذخیره عکسهای هر کاربر استفاده کنیم برای مثال به ازای هرکاربر پوشه ای داشته باشیم همنام یوزرنیم یا شناسه کاربر و یا اینکه اسم فایلهای ذخیره شده رو با نام کاربری یا شناسه کاربر ذخیره کنیم. بعد با نوشتن یک httpModule درخواستهایی رو که به این عکسها صورت میگیره رو چک میکنیم که توسط چه کاربری صورت گرفته اگر کاربر لاگین کرده کاربر موردنظر باشه که اجازه دیدن عکس رو میدیم و گرنه اونو به صفحه ای هدایت میکنیم که شما نمیتنونید این عکس رو ببینید.
اگر نیاز به کد داشتی اعلام کن برات یک نمونه قرار میدم.
موفق باشید
اگه زحمت بکشی و یه نمونه کد قرار بدی خیلی ممنونت میشم.

Alireza_Salehi
سه شنبه 24 فروردین 1389, 07:00 صبح
این هم یک روش دیگر برای امن کردن فایلها:
http://www.15seconds.com/issue/070104.htm

alireza_s_84
سه شنبه 24 فروردین 1389, 10:54 صبح
اگه زحمت بکشی و یه نمونه کد قرار بدی خیلی ممنونت میشم.

خوب این بستگی به نوع سیستم شناسایی افراد در وب سایت شما داره. اگر از سیستم شناسایی خود Asp.net استفاده میکنید اینجوری عمل کنید:
یک پوشه برای نگهداری عکس های امنیتی قرار بدین مثلا: (PersonalPictures)
هر فایلی که آپلود میشه ابتدای نامش یوزرنیم کاربر رو اضافه کنی مثلا: (عکسی بنام 1.jpg آپلود شده و متعلق به یوزری بنام reza هست شما اینجوری تغییر نام بده reza1.jpg)
یک فایل وب کانفیگ برای جلوگیری از دسترسی افراد بی نام به این پوشه قرار بدین:


<?xml version="1.0"?>
<configuration>
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</configuration>

بعد در فایل Global.asax اینجوری ویرایش کنید:


protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
String Path = Request.Path;

if (Path.Contains("PersonalPictures"))
{
String FileRequested = Path.Substring(Path.LastIndexOf("/") + 1);
if (Context.User.Identity.IsAuthenticated)
{
if (!FileRequested.StartsWith(Context.User.Identity.N ame))
{
Context.RewritePath("~/Access.aspx");
}
}
}
}

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

alireza_s_84
سه شنبه 24 فروردین 1389, 11:10 صبح
این هم یک روش دیگر برای امن کردن فایلها:
http://www.15seconds.com/issue/070104.htm
شما سوال دوستمون رو خوب بخون تا ببینی چقدر پاسختون جوابگو هست.
این روش برای این دوستمون پاسخگو نیست.
موفق باشید

daffy_duck376
سه شنبه 24 فروردین 1389, 14:49 عصر
خوب این بستگی به نوع سیستم شناسایی افراد در وب سایت شما داره. اگر از سیستم شناسایی خود ASP.NET استفاده میکنید اینجوری عمل کنید:
یک پوشه برای نگهداری عکس های امنیتی قرار بدین مثلا: (PersonalPictures)
هر فایلی که آپلود میشه ابتدای نامش یوزرنیم کاربر رو اضافه کنی مثلا: (عکسی بنام 1.jpg آپلود شده و متعلق به یوزری بنام reza هست شما اینجوری تغییر نام بده reza1.jpg)
یک فایل وب کانفیگ برای جلوگیری از دسترسی افراد بی نام به این پوشه قرار بدین:


<?xml version="1.0"?>
<configuration>
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</configuration>
بعد در فایل Global.asax اینجوری ویرایش کنید:


protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
String Path = Request.Path;

if (Path.Contains("PersonalPictures"))
{
String FileRequested = Path.Substring(Path.LastIndexOf("/") + 1);
if (Context.User.Identity.IsAuthenticated)
{
if (!FileRequested.StartsWith(Context.User.Identity.N ame))
{
Context.RewritePath("~/Access.aspx");
}
}
}
}
البته راه دیگه ای هم وجود داره و اون هم اینه که بجای تغییر نام فایل های آپلود شده به ازای هر کاربر یک پوشه داشته باشید که ویژگیهایی هم داره مثلا از زحمت تغییر نام فایلها راحت میشین و دیگه اینکه اگر قرار بود کاربر رو حذف کنید که طبیعتا عکس هاش هم باید حذف بشه به جای حذف تک تک عکس ها کل پوشه رو حذف کنید.
باز هم سوالی بود در خدمت هستم.
موفق باشید
ممنون از توجه شما . فکر کنم روش دوم شما بهتر باشه یعنی برای هر کاربر یک پوشه بسازم .
اما اونوقت از کد هایی که شما قرار داده اید نمیشود استفاده کرد و پوشه هر کاربر نامش جدا خواهد بود . برای اون هم نمونه کدی دارید؟ اگه بگذارید ممنون میشوم. ضمنا برای اینکه به شما بیشتر زحمت ندهم برای این موضوع باید در اینترنت چه چیزی سرچ کنم تا نتیحه مورد نظرم را پیدا کنم ؟

alireza_s_84
سه شنبه 24 فروردین 1389, 18:05 عصر
ممنون از توجه شما . فکر کنم روش دوم شما بهتر باشه یعنی برای هر کاربر یک پوشه بسازم .
اما اونوقت از کد هایی که شما قرار داده اید نمیشود استفاده کرد و پوشه هر کاربر نامش جدا خواهد بود . برای اون هم نمونه کدی دارید؟ اگه بگذارید ممنون میشوم. ضمنا برای اینکه به شما بیشتر زحمت ندهم برای این موضوع باید در اینترنت چه چیزی سرچ کنم تا نتیحه مورد نظرم را پیدا کنم ؟

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


String PathRequested = (Path.Substring(Path.LastIndexOf("/") + 1).LastIndexOf("/") + 1);

باز هم سوالی هست در خدمت هستم

Alireza_Salehi
سه شنبه 24 فروردین 1389, 18:29 عصر
شما سوال دوستمون رو خوب بخون تا ببینی چقدر پاسختون جوابگو هست.
این روش برای این دوستمون پاسخگو نیست.
موفق باشید

اتفاقا جوابگو هست ولی نه به صورت کامل ، بلکه احتیاج به کمی تغییرات داره،

1. همه عکسها در یک پوشه قرار داده میشود
2. پوشه فوق از طریق امن کردن Role حفاظت می شود - با توجه به مقاله فوق به IIS فهمانده می شود که فایل های عکس را هم امن کند.
3. لیست تصاویر هر کاربر در دیتابیس ذخیره می شود
4. اگر فایلی درخواست شد که مجوز دسترسی نداشت Response مربوط به Forbidden صادر می شود.

نکات:
. قرار دادن همه فایها در یک پوشه مدیریت را آسان می کند
. اگر نیاز شد به ازای هر Role یک پوشه جدا تعریف می شود
. با توجه به قرار گرفتن لیست تصاویر در دتابیس و فایها در پوشه خود حجم دیتابیس هم کم می شود
. در فایل Global.asax به راحتی می توان درخواست فایل های غیر مجاز را فیلتر کرد.
. با تغییرات کمی در FormsAuthentication هم می توان لیست فایل های مجاز هر کاربر را چک کرد.

تنها مسئله اینه که ASP.NET عملیات تائید مجوز را برای فایل های عکس در نظر نمی گیرد و باید از طریق IIS طبق مقاله فوق عمل کرد. و قابلیت فوق را اضافه کرد.

alireza_s_84
سه شنبه 24 فروردین 1389, 20:06 عصر
اتفاقا جوابگو هست ولی نه به صورت کامل ، بلکه احتیاج به کمی تغییرات داره،

1. همه عکسها در یک پوشه قرار داده میشود
2. پوشه فوق از طریق امن کردن Role حفاظت می شود - با توجه به مقاله فوق به IIS فهمانده می شود که فایل های عکس را هم امن کند.
3. لیست تصاویر هر کاربر در دیتابیس ذخیره می شود
4. اگر فایلی درخواست شد که مجوز دسترسی نداشت Response مربوط به Forbidden صادر می شود.

نکات:
. قرار دادن همه فایها در یک پوشه مدیریت را آسان می کند
. اگر نیاز شد به ازای هر Role یک پوشه جدا تعریف می شود
. با توجه به قرار گرفتن لیست تصاویر در دتابیس و فایها در پوشه خود حجم دیتابیس هم کم می شود
. در فایل Global.asax به راحتی می توان درخواست فایل های غیر مجاز را فیلتر کرد.
. با تغییرات کمی در FormsAuthentication هم می توان لیست فایل های مجاز هر کاربر را چک کرد.

تنها مسئله اینه که ASP.NET عملیات تائید مجوز را برای فایل های عکس در نظر نمی گیرد و باید از طریق IIS طبق مقاله فوق عمل کرد. و قابلیت فوق را اضافه کرد.
خوب وقتی قراره کاری انجام بشه باید تمامی حالات رو در نظر گرفت شما یک هاست به من معرفی کن که اجازه بده تعمیمات ISAPI رو تغییر بدم؟؟؟
ضمنا روشی که من گفتم حتی بدون استفاده از Role ها و (با کمی تغییرات) بدون وابستگی به شناسایی فرمی هم قابل بکارگیری هست. توجه داشته باشید که گاهی اوقات بعضی روش ها ممکنه جالب باشه اما در عمل ممکنه دردسر آفرین باشه.
اگر دوست ما به گفته شما عمل میکرد و نوبت پابلیش کردن سایت می رسید انوقت چه کار باید میکرد؟؟؟
آیا مدیرت هاست این کار رو براش انجام میداد؟؟؟
بهر حال اون مثال برای کسانی خوبه که از مزایای سرور اختصاصی استفاده میکنند .
موفق باشید