• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
كد آپلود كه خودم نوشتم! لطفا نظر بدهيد!
#1
با سلام اين كد رو خودم نوشتم و روي سرور خانگي كار كرده اما هنوز روي يه سرور واقعي امتحانش نكردم وفقط براي آپلود 2 نوع فايل با پسوند js , css هست و ماكزيمم حجم فايل هم 100 كيلو بايت هست.
برنامه كار ميكنه و ازش راضي هستم اما چيزي كه منو نگران ميكنه نواقص امنيتيش هست.
از اساتيدي كه اينجا حضور دارن خواهش مي كنم در مورد نواقص برنامه و اينكه كجاهاش اضافي و بدرد نخوره و چه چيز اساسي كم داره و مخصوصا در مورد نقصهاي امنيتيش توضيح بدهند و منو راهنمايي كنن!
---------------
فرم آپلود:
کد:
<form name="UPLOAD_FORM" action="uploader.php" method="post" enctype="multipart/form-data" id="OPLOAD_FORM">
<input type="file" name="THE_FILE" id="THE_FILE" size="50" /><br/>
<input type="submit" name="SUBMIT" id="SUBMIT" value="Upload" />
</form>
uploader.php:
کد:
<?php
$HRL="http://localhost/upload_example/";
$MAX_SIZE=100000;
//***********
if((!isset($_SERVER['HTTP_REFERER']))or empty($_SERVER['HTTP_REFERER'])){
die("ERROR (1)");
}
//***********
$REFERER=strtok($_SERVER['HTTP_REFERER'],"?");
//***********
if(($REFERER!=$HRL)and($REFERER!=$HRL."index.html")){
die("ERROR (2)");
}
//***********
if($_SERVER['REQUEST_METHOD']!="POST"){
die("ERROR (3)");
}
//***********
if((count($_REQUEST)!=1)or(count($_POST)!=1)or(count($_FILES)!=1)){
die("ERROR (4)");
}
//***********
if((!isset($_FILES['THE_FILE']))or(!isset($_POST['SUBMIT']))or(!isset($_REQUEST['SUBMIT']))){
die("ERROR (5)");
}
//***********
if(empty($_FILES['THE_FILE'])or empty($_POST['SUBMIT'])or empty($_REQUEST['SUBMIT'])){
die("ERROR (6)");
}
//***********
if(($_POST['SUBMIT']!="Upload")or($_REQUEST['SUBMIT']!="Upload")){
die("ERROR (7)");
}
//***********
if($_FILES['THE_FILE']['size']>$MAX_SIZE){
die("ERROR (8)");
}elseif($_FILES['THE_FILE']['size']==0){
die("ERROR (9)");
}
//***********
$FILE_NAME=$_FILES['THE_FILE']['name'];
$pl=explode(".",$FILE_NAME);
$tp=count($pl);
if($tp==1){
die("ERROR (10)");
}elseif(($pl[$tp-1]!="js")and($pl[$tp-1]!="css")){
die("ERROR (11)");
}
//***********
if(!is_dir("./uploads")){
if(!mkdir("./uploads",0644)){
  die("ERROR (12)");
}
}
//***********
$NEWNAME="upl".chr(rand(97,122)).chr(rand(97,122)).chr(rand(97,122)).rand(1000,9999).chr(rand(97,122)).rand(1000,9999).chr(rand(97,122)).rand(100,999).".".$pl[$tp-1];
if(file_exists("uploads/".$NEWNAME)){
while(file_exists("uploads/".$NEWNAME)){
  $NEWNAME="upl".chr(rand(97,122)).chr(rand(97,122)).chr(rand(97,122)).rand(1000,9999).chr(rand(97,122)).rand(1000,9999).chr(rand(97,122)).rand(100,999).".".$pl[$tp-1];
}
}
//***********
if(!is_uploaded_file($_FILES['THE_FILE']['tmp_name'])){
die("ERROR (13)");
}
//***********
if(!move_uploaded_file($_FILES['THE_FILE']['tmp_name'],"./uploads/".$NEWNAME)){
die("ERROR (14)");
}
//***********
if(!chmod("./uploads/".$NEWNAME,0644)){
die("ERROR (15)");
}
//***********
echo"<font face=\"Tahoma\" style=\"font-size: 15pt\" color=\"#008000\"><b>Successful upload!</b></font>\n";
echo"<p><font face=\"Verdana\" size=\"2\" color=\"#703700\">Your file address:</font><br>";
echo"<input type=\"text\" name=\"ADDRESS\" id=\"ADDRESS\" size=\"70\" value=\"".$HRL."uploads/".$NEWNAME."\" style=\"color: #9EF068; font-family: Tahoma; font-size: 10pt; border: 1px solid #182C14; background-color: #518A42\" /></p>";
echo"<hr color=\"#96B086\" size=\"5\" />";
echo"<a href=\"index.html\">Back</a>";
?>

دوستان اگه دير به نظرهاتون جواب دادم يا در مورد برنامه توضيح بيشتري ندادم ببخشيد چون از شهرستانم و اين سرعت ما فوق تصور اينترنت همراه هزينه مباركش منو كفري كرده!
تشكر!
  پاسخ
تشکر شده توسط : oia
#2
Big Grin اگه بهتون گفته بشه میشه از همه این شرط ها عبور کرد چه حالی بهتون دست میده.
هیچ وقت از رفرر تو شرط ها استفاده نکنید چون قابل تغییر هست.
کافیه فرم شما رو طرفی که میخواد سایت رو هک کنه داشته باشه.
خود به خود شما همه داده ها رو بهشون دادید و شما هم صحت همون داده ها رو چک میکنیدExclamationکه این کار خطرناکه.
حالا درسته اگه تو قسمت مدیریت استفاده بشه فقط مدیر بهش دسترسی داره ولی خب اگه شما فکر کنید تا امروز کسی این کد رو هک نکرد(هیچ مدیری سایت خودش رو هک نمیکنه)پس تو سیستم بعد برا قسمت ارسال مقاله کاربر همراه با عکس ازش استفاده میکنم اونجاست که هک میشید.
بهترین راه استفاده از کد امنیتی هست برا مواردی که آپلود فایل دارید و مهم تر اینکه کاربر ناشناس هم طرف حساب شما باشه.
فکر کنم یه مورد قبلا آپلود فایل تو انجمن دیده باشم یه سرچ بزنید

برا این میگم هک چون مثلا شما یه فایل test.js رو هاست دارید که تو سایت اجرا میشه کافیه طرف هکر یه فایل با همین نام و محتوای document.write('this site hacked'); آپلود کنه اونوقت ایندکس شما همین پیعام رو میده
طراحی و برنامه نویسی صفحات پویا - Iranveb.net
پورتال جدیدترین اخبار داخل و خارج کشور - Iranveb.com
  پاسخ
تشکر شده توسط : mehdimalek
#3
کدت مشکلی نداره فقط به حتما MimeType فایل رو بررسی کن کن که همون فایلهایی باشه که می خوایی
  پاسخ
تشکر شده توسط : mehdimalek
#4
ConfusedUndecidedSadSad
تمام موهاي بدنم سيخ شد كه!
من از رفرر براي اين استفاده كردم كه فقط و فقط از صفحه اي كه گذاشتم آپلود صورت بگيره و نه از جاي ديگه!
جناب pesarelor يه كم پايين سيكل برام شرح بده كه چه سوتي هايي در اين آپلودر مادر مرده دادم كه خودم بي خبرم!
بيچاره شدم كه حالا ناز توجهت بگو چه چيزي اضافه كنم تا يه چيز درستي از آب در بياد اون سرچي هم كه گفتي ميزنم تا ببينم چيكار بايد بكنم.
بدبخت شدم ... ببينيد اين سايت اينطوريه كه مثل آپلودر هاي فايل ميمونه! و هركسي آپلود كرد لينك مستقيم فايلش بهش داده ميشه و خلاص! بابا يه راهنمايي كنيد كه مثلا چه جوري اين كد كار دستم ميده و بگيد چيكار كنم!
ممنونتم جناب pesarelor
Sad
  پاسخ
تشکر شده توسط :
#5
نه نگران نباشید این کار امنیت سایت رو پایین نیاورده
اتفاقا خوب کاری کردید از reffer استفاده کردید
  پاسخ
تشکر شده توسط : mehdimalek
#6
HeartHeartHeart
آخيش نزديك سكته سوم به دادم رسيديد! احيا شدم ...
Smile
مرسي
  پاسخ
تشکر شده توسط :
#7
فقط همون mimetype رو‌ حتما بررسی کنید
  پاسخ
تشکر شده توسط : mehdimalek
#8
باید با یک برنامه کار کرد تا بشه نظر داد
البته چیزی که از کدهات برداشت می شه بنظر میاد که کد مطمئنی باشه
البته جا برای یه کاره بهتر هنوز هست.
استفاده از پایگاه داده می تونه به مراتب به برنامت کمک کنه تا بتونه از نظر امنیت بهتر جواب بده و هم گاره قشنگتری از کار دربیاد. البته این بسته به این داره که قراره با این برنامه چی کار کنی. شاید هدف تولید این نرم فزار بیشتر از این نیاز به کار نداره!. فقط وقتی رفتین رو سرور انلاین حق دسترسی پوشه upload رو یادتئن نره Sleepy Wink

نقل قول:هیچ وقت از رفرر تو شرط ها استفاده نکنید چون قابل تغییر هست.
کافیه فرم شما رو طرفی که میخواد سایت رو هک کنه داشته باشه.
خود به خود شما همه داده ها رو بهشون دادید و شما هم صحت همون داده ها رو چک میکنیدExclamationکه این کار خطرناکه.
Huh Blush

نقل قول:برا این میگم هک چون مثلا شما یه فایل test.js رو هاست دارید که تو سایت اجرا میشه کافیه طرف هکر یه فایل با همین نام و محتوای document.write('this site hacked'); آپلود کنه اونوقت ایندکس شما همین پیعام رو میده
اگه شما نگاهی به کد بندازید می بینید که تقریبا غیر ممکنه!
  پاسخ
تشکر شده توسط : mehdimalek
#9
سلام.

بهتر بود width,height رو هم چک میکردی.

چون اونوقت فایل php رو با پسوند jpg رو میشه آپلود کرد.

کد پی‌اچ‌پی:
list($width,$height,$type,$attr)=getimagesize($_FILES["picpath"]["tmp_name"]); 
  پاسخ
تشکر شده توسط : mehdimalek
#10
علی جان فایل های سی اس اس و جاوااسکریپت که طول و عرض ندارن. تازه mimetype ‌به‌همین درد می خوره. در ضمن فایل php با‌پسوند jpg هم آپلود بشه روی سرور اصلا اجرا نمیشه
  پاسخ
تشکر شده توسط : mehdimalek


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان