PDA

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



soroush.r70
یک شنبه 23 تیر 1392, 22:12 عصر
من یه قسمتی دارم در وب سایتم کاربرا میان تصاویرشون رو برای مدیر وب سایت آپلود می کنن می خواستم بدونم راهی وجود داره که این تصاویر ارسال می شن به یه فرمت خاصی تبدیل بشن که باز نشن و کسی ندونه که تصویرن و در موقع دانلود توسط مدیر به حالت تصویر برگردن

در واقع می خوام تصاویر دارای امنیت بشن

دوستان هر راهی می دونین برای امنیت تصاویر بهم بگین تا ازش استفاده کنم ممنون

mtnam1372
یک شنبه 23 تیر 1392, 22:24 عصر
برنامه نویس ها ی php خیلی وققته که به یک مقاله امنیتی کامل نیاز دارن .
خیلی وقته که میخام بنویسم اما همیشه یه کار پیش میاد تالان 10 صفحشو نوشتم:))

ببین عزیزم روش ها زیاده

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

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

یه پیشنهاد اینکه همیشه اسم فایل های اپلودی رو هم عوض کن و بعد ذخیره کن که طرف نتونه دسترسی بهش پیدا کنه
اوکی مهربون؟

colors
یک شنبه 23 تیر 1392, 23:09 عصر
برنامه نویس ها ی php خیلی وققته که به یک مقاله امنیتی کامل نیاز دارن .
خیلی وقته که میخام بنویسم اما همیشه یه کار پیش میاد تالان 10 صفحشو نوشتم:))

ببین عزیزم روش ها زیاده

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

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

یه پیشنهاد اینکه همیشه اسم فایل های اپلودی رو هم عوض کن و بعد ذخیره کن که طرف نتونه دسترسی بهش پیدا کنه
اوکی مهربون؟

هرچند که سوال دوستمون یه چیز دیگه ای بود, ولی اینای که فرمودین کامل نیست و نحایتا برای امنیت کامل بهترین راه عبور از توابع GD و تبدیل با همون توابع هستش.

برای سوال دوستمون هم راه و روشهای مختلفی رو میشه پیش گرفت. مثلا بعد از آپلود تصاویر, به پوشه ی خاصی انتقال و با htaccess محدودیت های لازم رو اعمال کنید. ( نام تصاویر و یا حتی پسوند رو هم میشه تغییر داد که یافتنش برای کاربر غیرممکن بشه )

soroush.r70
یک شنبه 23 تیر 1392, 23:10 عصر
ممنون دوست عزیز بحث من روی قسمت آپلود نیست در واقع اصل وقتی تصویر روی سرور قرار گرفت می خوام امنیت این تصاویر نمی دونم با عوض شدن پسوندشون یا .... حفظ بشه تا زمانی که مدیر اونا رو دانلود کنه و دوباره به تصویر اصلی برگرده و اونا رو پاک کنه می خوام امنیت تصاویر روی سرور حفظ بشه که کسی ندونه اصلان چیزایی که روی سرور هست تصویرن

colors
یک شنبه 23 تیر 1392, 23:22 عصر
از این توابع هم برای کد و دی کد کردن فایلها در سمت سرور استفاده کن.

<?php
/*
* Created By Ayham Alsuleman
* CryptFile and DecryptFile
*/

function CryptFile($InFileName,$OutFileName,$password){
//check the file if exists
if (file_exists($InFileName)){

//get file content as string
$InFile = file_get_contents($InFileName);

// get string length
$StrLen = strlen($InFile);

// get string char by char
for ($i = 0; $i < $StrLen ; $i++){
//current char
$chr = substr($InFile,$i,1);

//get password char by char
$modulus = $i % strlen($password);
$passwordchr = substr($password,$modulus, 1);

//encryption algorithm
$OutFile .= chr(ord($chr)+ord($passwordchr));
}

$OutFile = base64_encode($OutFile);

//write to a new file
if($newfile = fopen($OutFileName, "c")){
file_put_contents($OutFileName,$OutFile);
fclose($newfile);
return true;
}else{
return false;
}
}else{
return false;
}
}




function DecryptFile($InFileName,$OutFileName,$password){
//check the file if exists
if (file_exists($InFileName)){

//get file content as string
$InFile = file_get_contents($InFileName);
$InFile = base64_decode($InFile);
// get string length
$StrLen = strlen($InFile);

// get string char by char
for ($i = 0; $i < $StrLen ; $i++){
//current char
$chr = substr($InFile,$i,1);

//get password char by char
$modulus = $i % strlen($password);
$passwordchr = substr($password,$modulus, 1);

//encryption algorithm
$OutFile .= chr(ord($chr)-ord($passwordchr));
}

//write to a new file
if($newfile = fopen($OutFileName, "c")){
file_put_contents($OutFileName,$OutFile);
fclose($newfile);
return true;
}else{
return false;
}
}else{
return false;
}
}

//Example
$orginalfile = 'colors.jpg';
$crypt = 'saman.jpg';
$decrypt = 'decrypt.jpg';
$password = 'pass';

CryptFile($orginalfile,$crypt,$password);

?>

به متغیر crypt نام رندوم و پسوند ثابت بده. ( مثلا پسوند: ho )

mtnam1372
یک شنبه 23 تیر 1392, 23:26 عصر
اقایی که گفتی بحثت تکمیل نیست قرار نبود من اینجا بحث تکمیلی بگم توی همون پست گفتم
روش ها زیاده

من اصل کار رو گفتم که کامل هم هست و تست شده
خواهشا ادعای همه چی دون بودن نکنین
----------------------------------------------------------------------------

AliRezaPro
یک شنبه 23 تیر 1392, 23:59 عصر
یعنی یه همچین چیزی ؟

function replace_extension($filename, $new_extension) {
$info = pathinfo($filename);
return $info['filename'] . '.' . $new_extension;
}
میتونید بررسی کنید که اگر مدیر بود پارامترهای مناسب به این تابع فرستاده بشه و در غیر اینصورت extention رو به یه چیز دیگه تبدیل کنه

soroush.r70
دوشنبه 24 تیر 1392, 10:28 صبح
از این توابع هم برای کد و دی کد کردن فایلها در سمت سرور استفاده کن.

<?php
/*
* Created By Ayham Alsuleman
* CryptFile and DecryptFile
*/

function CryptFile($InFileName,$OutFileName,$password){
//check the file if exists
if (file_exists($InFileName)){

//get file content as string
$InFile = file_get_contents($InFileName);

// get string length
$StrLen = strlen($InFile);

// get string char by char
for ($i = 0; $i < $StrLen ; $i++){
//current char
$chr = substr($InFile,$i,1);

//get password char by char
$modulus = $i % strlen($password);
$passwordchr = substr($password,$modulus, 1);

//encryption algorithm
$OutFile .= chr(ord($chr)+ord($passwordchr));
}

$OutFile = base64_encode($OutFile);

//write to a new file
if($newfile = fopen($OutFileName, "c")){
file_put_contents($OutFileName,$OutFile);
fclose($newfile);
return true;
}else{
return false;
}
}else{
return false;
}
}




function DecryptFile($InFileName,$OutFileName,$password){
//check the file if exists
if (file_exists($InFileName)){

//get file content as string
$InFile = file_get_contents($InFileName);
$InFile = base64_decode($InFile);
// get string length
$StrLen = strlen($InFile);

// get string char by char
for ($i = 0; $i < $StrLen ; $i++){
//current char
$chr = substr($InFile,$i,1);

//get password char by char
$modulus = $i % strlen($password);
$passwordchr = substr($password,$modulus, 1);

//encryption algorithm
$OutFile .= chr(ord($chr)-ord($passwordchr));
}

//write to a new file
if($newfile = fopen($OutFileName, "c")){
file_put_contents($OutFileName,$OutFile);
fclose($newfile);
return true;
}else{
return false;
}
}else{
return false;
}
}

//Example
$orginalfile = 'colors.jpg';
$crypt = 'saman.jpg';
$decrypt = 'decrypt.jpg';
$password = 'pass';

CryptFile($orginalfile,$crypt,$password);

?>

به متغیر crypt نام رندوم و پسوند ثابت بده. ( مثلا پسوند: ho )



ممنون دوست عزیز این روشی که شما می گین جالبه

حالا می شه لطف کنید بگید به چه صورت من می تونم اون تصاویر رو در موقع آپلود توسط کاربر کد کنم و پسورد بذارم و موقع دانلود توسط مدیر دیکد کنم اگه می شه با مثال لطف کنید توضیح بدید.

colors
دوشنبه 24 تیر 1392, 11:24 صبح
ممنون دوست عزیز این روشی که شما می گین جالبه

حالا می شه لطف کنید بگید به چه صورت من می تونم اون تصاویر رو در موقع آپلود توسط کاربر کد کنم و پسورد بذارم و موقع دانلود توسط مدیر دیکد کنم اگه می شه با مثال لطف کنید توضیح بدید.

والا تاحالا همچین سیستمی پیاد نکردم که بتونم بهینه ترین روش رو مطرح کنم, ولی یه چیزی مث زیر امکان پذیر هست.

1 - کاربر تصویر را انتخاب و ارسال میکنه.
2 : شما فایل ارسالی کاربر رو بعد از بررسی ها و فیلترهای مورد نظر روی سرور ذخیره میکنید و در ادامه اسکریپت فایل مورد نظر ( روی سرور ) رو با تابع بالا و با نام دلخواه, پسوند و پسورد ثابت کد میکنید.(خود تابع مجددا همون فایل کد شده رو با نام و پسوند شما تو همون دایرکتوری ذخیره میکنه ) و بعد فایل اولیه رو حذف و نام فایل جدید کد شده رو تو یه جدول در بانک اطلاعاتتون ( پسوند فایل ارسالی کاربر (فایل اولیه)همراه با تاریخ ثبت و کاربر و ... ) نگهداری میکنید. مثلا:

$orginalfile = '193769_heroa.jpg'; # تصویر ارسال شده توسط کاربر
$crypt = 'saman.jpg'; # فایل جدید کد شده که باید با نام و پسوند دلخواه شما ست بشه / مثلا نام رندوم و پسوند ثابت
$password = 'pass'; # پسورد ثابت برای کد و دی کد کردن فایلها

CryptFile($orginalfile,$crypt,$password);
به توضیحات دقت کن.
3 - وقتی مدیر وارد بخش کنترل پنل میشه لیست نامهای فایلهای دیکد شده همراه با مشخصاتی مث کاربر و زمان و ... رو براش لیست میکنین.
4 - مدیر که روی آیتم های این لیست کلیک کنه نام فایل کد شده رو همراه با پسوند و پسورد ثابت برای تابع DecryptFile بالا میفرستین که یه نسخه از این فایل رو براتون دی کد ( باز ) کنه و میشه به صورت های مختلف اون تصویر جدید رو نمایش داد. ( header ). مثلا:

$crypt = 'saman.hoo'; # نام ذخیره شده در بانک همراه با پسوند ثابت
$decrypt = $crypt.$db['type']; # نام و پسوندی که بعد از دی کد کردن به فایل باز شده اختصاص داده میشه / که باید هم نام فایل بالایی و با پسوند فایل اولیه که در بانک ذخیره کردین باشه... ...
$password = 'pass'; # پسورد ثابت برای کد و دی کد کردن فایلها

DecryptFile($crypt,$decrypt,$password);
به توضیحات دقت کن.

یه کمی پیچیده هست ولی زیاد سخت نیست.

soroush.r70
سه شنبه 25 تیر 1392, 10:53 صبح
ممنون از دوستان حالا این تاپیک در مورد امنیت تصاویر بود می خوام یه سوال دیگه خارج از تصویر بپرسم

به چه صورت می شه کاری کرد که کاربر وقتی فایلی رو آپلود می کنه این فایل تبدیل به فایل فشرده بشه با یه پسورد ثابت بشه و مدیر وقتی میاد دانلودش می کنه بیاد پسورد اون فایلو که خودش می دونه دستی توی یک فیلد بنویسه و فایل رو دانلود کنه