PDA

View Full Version : تشخیص نوع فایل در آپلود



twelve
شنبه 24 فروردین 1387, 20:55 عصر
من میخوام به کاربر امکان آپلود فایل با یک نوع مشخص ( مثلا عکس ) بدم
چطور میتونم کنترل کنم که فایلی که کاربر آپلود میکنه واقعا عکسه ؟؟؟
آیا راهی وجود داره که فایل های مخرب رو شناسایی کرد و از ذخیره شدنشون جلوگیری کرد؟
خطا رو به چه صورت هندل کنم در این مورد؟
جستجو که کردم چیزی یافت نکردم ، یعنی اصلا نمیدونم دنبال چه چیزی باید بگردم!؟؟:لبخند:

shahab_ksh
شنبه 24 فروردین 1387, 22:06 عصر
میتونی از فرمت فایل استفاده کنی ببینی فرمتش چی فقط فرمتهای دلخواه رو بتونن آپلود کنن

twelve
شنبه 24 فروردین 1387, 22:29 عصر
اگر منظورت پسوند ظاهریشه که خیلی راحت میشه اون رو عوض کرد و فایل رو آپلود کرد ....
من میخوام فرمت واقعی فایل رو به دست بیارم ، تا نشه هر چیزی رو گذاشت روی سرور

shahab_ksh
شنبه 24 فروردین 1387, 23:19 عصر
نمیشه این کارو بکنی

behzadk
یک شنبه 25 فروردین 1387, 07:01 صبح
منم می گم فرمت واقعی رو
مثلا فایل bmp اول اون دو حرف bm است

twelve
یک شنبه 25 فروردین 1387, 10:21 صبح
منم می گم فرمت واقعی رو
مثلا فایل bmp اول اون دو حرف bm است

منظورت رو متوجه نشدم.... توضیح میدی؟

raravaice
یک شنبه 25 فروردین 1387, 10:48 صبح
سلام

چندتا راه داری :

1. از contentType توی کنترل Fileupload استفاده کنی که متاسفانه فقط توی IE محتوی اصلی رو بدون توجه به پسوند بهت میده.و اگر اصرار داری از همین روش استفاده کنی اینجا رو ببین :
http://barnamenevis.org/forum/showthread.php?t=101104
دوست خوبمون جناب صالحی لینک خوبی رو گزاشته که بتونی محتوای یه فایل رو تشخیص بدی.

2. اگر هدف اینه که کاربر فقط بتونه عکس آپلود کنه پیشنهاد من اینه که بدون توجه به پسوند و نوع فایل InputStream رو بریزی توی یه نوع IMAGE حالا با یه try و Catch میتونی چک کنی که واقعا این فایل یه عکس هست یا نه.

3. اگر میخوای حرفه ای تر بررسی کنی مسئله رو باید به امضاء هر نوع فایل که توی سرآیند اون ذخیره شده رجوع کنی و نوع فایل رو تشخیص بدی.

موفق باشید

twelve
یک شنبه 25 فروردین 1387, 11:39 صبح
ممنون ، خوشحالم که این کار هم نشد نداره!
من دنبال همین روش سوم هستم . چون کاربر میتونه علاوه بر عکس فایل های آفیس (ppt ، doc ، xsl ) هم آپلود کنه. آگر مقاله ای رو در این مورد معرفی کنید و یا مکانیزم کار رو توضیح بدید ممنون میشم.

raravaice
یک شنبه 25 فروردین 1387, 13:07 عصر
سلام

دنبال مقاله نباش چون پیدا نمیکنی.

ببین اگر هر فایلی رو شما تو مد متن باز کنی چند بایت اول اونا شامل این امضاء هست که اصطلاحا به اونا میگن EXIF که برای هر نوع فایل متفاوت هست و اگر هر گونه دستکاری توی اون انجام بشه عملکرد فایل از بین میره.
مثلا برای عکسهای JPEG فکر میکنم با JIFF شرئع میشه البته نا گفته نمونه چیزی که تو روش اول بهش اشاره کردم در حقیقت همین کارو با API های ویندوز انجام میده ولی اگر شما میخوای خودت این کارو انجام بدی بگرد دنبال EXIF نوع فایلات.

موفق باشید

twelve
یک شنبه 25 فروردین 1387, 13:56 عصر
پس با این حساب من باید یک text editor تعریف کنم و فایل مورد نظر رو با اون باز کنم و اون به اصطلاح امضا رو چک کنم ؟ من چند فایل وورد و پاور پوینت رو با NotePad باز کردم اما اثری از Exif توش نبود ، فقط این رو توی عکس دیدمش. آیا این کلمه در تمام فایلها باید وجود داشته باشه؟
ضمن اینکه در کل این کار خیلی کار وقت گیر و پردازش سنگینی باید داشته باشه فکر نکنم ارزش این همه صرف هزینه رو داشته باشه ، راهی که الان به نظرم میرسه اینه که فایل آپلود شده رو اسکن کنم ، مثل ایمیل یاهو که فایلهای الصاق شده به ایمیل رو از نظر وجود ویروس اسکن میکنه...این راه به نظرتون چطوره؟ آیا میشه اینکارو مجانی!!! انجام داد؟!

shahab_ksh
یک شنبه 25 فروردین 1387, 15:51 عصر
اگر هدف اینه که کاربر فقط بتونه عکس آپلود کنه پیشنهاد من اینه که بدون توجه به پسوند و نوع فایل InputStream رو بریزی توی یه نوع IMAGE حالا با یه try و Catch میتونی چک کنی که واقعا این فایل یه عکس هست یا نه.


فکر میکنم این روش برای غالب های خاص جواب گو باشه مثلا برای عکس فقط

raravaice
یک شنبه 25 فروردین 1387, 17:56 عصر
فکر میکنم این روش برای غالب های خاص جواب گو باشه مثلا برای عکس فقط

من مگه غیر از این گفتم شهاب جان؟!!!




ضمن اینکه در کل این کار خیلی کار وقت گیر و پردازش سنگینی باید داشته باشه

شما وقتی داری از FileUpload استفاده میکنی یه خاصیتی هست به نام InputStream که میتونی به محتوی فایل قبل از ذخیره دسترسی داشته باشی حالا میتونی اونو به بایت تبدبل کنی و با EXIF مشخصی که تعریف داری چند بایت اول رو مقایسه کنی!

پردازش همونه فقط چند تا شرط کوچیک اضافه میشه.



راهی که الان به نظرم میرسه اینه که فایل آپلود شده رو اسکن کنم

چطور میخوای اسکنش کنی؟!

موفق باشید

twelve
یک شنبه 25 فروردین 1387, 18:30 عصر
شما وقتی داری از FileUpload استفاده میکنی یه خاصیتی هست به نام InputStream که میتونی به محتوی فایل قبل از ذخیره دسترسی داشته باشی حالا میتونی اونو به بایت تبدبل کنی و با EXIF مشخصی که تعریف داری چند بایت اول رو مقایسه کنی!

پردازش همونه فقط چند تا شرط کوچیک اضافه میشه

ممکنه مثالی در این مورد ذکر کنین؟ من که به کل گیج شدم.من همیشه فکر میکردم تا فایل آپلود نشده هیچ عملیاتی نمیشه روش انجام داد!:گیج:


چطور میخوای اسکنش کنی؟!

راستش نمیدونم ، اگر بشه همچین کاری کرد (همونطور که گفتم ایمیل یاهو اینکارو میکنه)
خیلی از مسائل حل میشه

raravaice
یک شنبه 25 فروردین 1387, 21:31 عصر
Dim bytes(FileUpload.PostedFile.ContentLength - 1) As Byte
FileUpload.PostedFile.InputStream.Read(bytes, 0, FileUpload.PostedFile.ContentLength)


یا



Dim bytes() As Byte
Dim ms1 As New IO.MemoryStream
ms1 = FileUpload.PostedFile.InputStream
bytes = ms.ToArray
ms.Close()

حالا متغییر Bytes حاوی محتویات فایل شماست.

موفق باشید