سؤال

هل يعرف أحد ممارسة جيدة لتأمين الوسائط لـ asp.net؟

أحتاج إلى استضافة مجموعة متنوعة من الوسائط التي تتطلب إذنًا لعرض صورة/مقطع فيديو محدد.أي.قد يكون أو لا يكون لدى مستخدم معين إذن لعرض ملف وسائط - وقد تتغير هذه الحقيقة بسرعة.

لا يهمني إذا كان بإمكانهم تنزيل ملف وسائط يمكنهم الوصول إليه، فأنا لا أريدهم أن يكونوا على دراية بالعناصر التي لا ينبغي لهم الوصول إليها.

لقد فكرت بالفعل في تشويش عنوان url - وهذا يبدو ضعيفًا جدًا بالنسبة لي.

لدي نموذج مستخدمين مصادق عليهم (وأنا لست على استعداد لتغيير هذا).

أرغب في إبقاء بنية مجلد ملفات الوسائط غير مرتبطة بالأذونات.

هل كانت مفيدة؟

المحلول

بناء httphandler يجب الوصول إلى جميع الوسائط من خلال. بعد ذلك ، قبل استرداد الملف وإرساله إلى المستخدم ، يمكنك تنفيذ أي عمليات التحقق التي تريدها. احتفظ بجميع وسائطك خارج مسار wwwroot الرئيسي ، أو رفض الوصول إلى هذا المجلد باستخدام الأذونات.

مزيد من المعلومات حول هذا الموضوع هنا:

http://www.15seconds.com/issue/020417.htm

نصائح أخرى

يمكنني استخدام ملف XML مثل هذا لتعيين المستخدمين/المجموعات الوصول إلى ملف

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root[
    <!ELEMENT file ANY>
    <!ATTLIST file name ID #REQUIRED>
]>
<root>
    <file name="file.doc" users="155,321" groups="grp5" />
    <file name="file2.doc" users="321" groups="" />
</root>

يتم تخزين الملفات فوق جذر HTTP بحيث لا يمكن الوصول إليها بواسطة URL.

عندما يحاول المستخدم الوصول إلى getfile.aspx؟ file = file.doc i تحميل xml ، احصل على السطر مع

XmlNode xnFile= XML.GetElementById(wantedFile);

, ، ثم أسمي وظيفة

 HasAccess(Context.User, xnFile); 

الذي يتحقق مما إذا كان المستخدم قد قام بتسجيل الدخول ومقارنة الأذونات ، وإذا كان من الجيد أن يكون لدى هذا المستخدم الملف ، فأنا أقرأ الملفات من القرص وأكتبها

FileInfo thisFile = new FileInfo(secretLocation + wantedFile);
Response.Clear();
Response.Buffer = false;
Response.BufferOutput = false;
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("Content-Length", thisFile.Length.ToString());
Response.AddHeader("Content-disposition", "filename=" + thisFile.Name);
Response.ContentType = "application/none";
Response.WriteFile(secretLocation + wantedFile);
Response.Close();
Response.End();
Response.ClearContent();
Response.ClearHeaders();

في الواقع ، لدي الآن أكثر من ألف ملف ، وأفكر في كتابة بيانات الملف إلى قاعدة البيانات حيث تالفة XML مرتين في 5 سنوات ، وربما بسبب التعطل أو الاستخدام المتزامن.

من تعليقك في إجابة Spikolynn

أنا في حيرة - كيف يختلف هذا عن التشويش؟ هل سيتمكن المستخدم المصادق عليه من مشاركة صورة (يتم تفويضها من أجلها) مع مستخدم آخر مصادق عليه ولكنه غير مصرح به؟

أعتقد أنك تحاول ذلك منع غير مصرح به مشاركة من وسائل الإعلام.

هذا شيء قد وضعت الكثير من الشركات (Microsoft و Apple و IBM ، إلخ) مبلغًا كبيرًا من المال. كان الحل DRM, والآن يقومون بإزالته ، لأن فشلت.

لذا ، جوابي هو أنك لا يمكن منع المشاركة إذا كان المستخدم على استعداد لوضع بعض الجهد لتجنب ذلك.

يمكنك فقط حافظ على صدق الناس صادقين من خلال تطبيق بعض التقنيات مثل Spikolynn أو lusid اشرح في إجاباتهم.

أقترح جدولًا يحتوي على الملفات التي يمكن لكل مستخدم الوصول إليها:

UserID int
FileID varchar

ثم جدول لملفاتك:

FileID    UniqueIdentifier
FileType  char(4)  <- so you know which extension to use.
etc...

على القرص الصلب، قم بتسمية الملف FileID (UniqueIdentifier) ​​ونوع الملف (الامتداد، على سبيل المثال..jpg).سيحتفظ معرف الملف الموجود في جدول الأذونات بالمعرف الفريد الذي تم إنشاؤه في الجدول الآخر.

يمكنك تمرير هذا عبر عنوان URL مع العلم بأمان نسبي أن المستخدم لن يتمكن من تخمين اسم أي ملف آخر.

تحديث:هذا، بالمناسبة، كثيراً أبسط من كتابة HttpHandler أو التعامل مع أذونات الملف.ومع ذلك، في حين أن فرص قيام شخص ما بتخمين اسم ملف آخر ضئيلة للغاية، إلا أنها ليست أمانًا محكمًا حيث قد يمنح مستخدم واحد آخر حق الوصول إلى الملف.

brownpaperpackage.aspx؟ id = {guid}

في حالة تحميل media.aspx ، يمكنك التحقق من مصادقة المستخدم ، ثم تحقق من أن المستخدم لديه الحق في عرض الوسائط ، وإذا فعلوا ذلك ، فحمل الوسائط كدفق وتغذيها على استجابة الصفحة كـ Spikolynn مُبَرهن.

لما نعملها بهذه الطريقه؟ من السهل أن ترمز وتحصل على جميع فوائد خدمات المصادقة ASP.NET و IIS ، والتي يمكنك من خلالها العثور على المستخدم يطلب الوسائط. من التافهة تعيين هذا المستخدم إلى قائمة وصول لكائنات الوسائط الخاصة بك. والصفحة لديها كائن الطلب هناك. أنت أيضًا تخفي اسم الوسائط ، لذلك لا يمكنك معرفة ما يحدث من عنوان URL.

كيف تمنع الناس من الوصول إلى وسائل الإعلام الخاصة بك مباشرة؟ لا يمكن تخزين ملفات الوسائط الخاصة بك في الدليل الظاهري IIS. إذا كانت كذلك ، فهناك احتمال أن يتم تنزيلهم مباشرة. يمكنك تخزينها في قاعدة بيانات كصفيف بايت (blob) أو تخزينها على القرص خارج الدليل الافتراضي على الويب. يجب على المستخدمين المرور عبر ASP.NET للوصول إلى الملفات

كيف يمكنك تتبع ما يمكن للمستخدمين الوصول إلى الوسائط؟ يمكنك تتبع المستخدمين Thorugh ASP.NET. هذا يعني أن كل مستخدم لديه معرف في جدول ASPNET_USERS. قم بإنشاء جدول لوسائل الإعلام الخاصة بك مع معرف واسم ملف (أو نقطة تحتوي على الوسائط الفعلية). ثم تحتاج فقط إلى إنشاء جدول ثالث يربط الاثنين. سيحتوي هذا الجدول على معرف المستخدم ومعرف الوسائط ، مما يدل على هذا المستخدم عرض هذه الوسائط. باستخدام معرف المستخدم (من عضوية ASP.NET) ومعرف الوسائط (من عنوان URL) الذي تحتاجه فقط

select count(*) from UserMedia where UserId = @UserGuid and MediaId = @MediaIdFromUrl

وإذا كان العد> 0 يمكن للمستخدم عرض الوسائط.

مثال على كيفية استخدام عنوان URL:

<asp:image 
  runat="server" 
  ImageUrl="brownpaperpackage.aspx?id=53a2ea4(snip)76ca8b" />
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top