PDA

View Full Version : آپلود فایل عکس + اطلاعات رشته ای . کمک لازم دارم شدید!



masoud399
چهارشنبه 25 آذر 1394, 00:41 صبح
دوستان و اساتید محترم من یه کد واسه آپلود عکس نوشتم و درکنارش یه سری اطلاعات هم باید ثبت بشه. خیلی از خطاها رو چک کردم ولی متاسفانه درنهایت اگر خطایی توآپلود عکس باشه بازهم اطلاعات ثبت میشه. خواهشا ایراد کارم رو بگید و درکل هرجای کدم ایرادی هست بگید درستش چیه!
سورس برنامه :


<?php
if (isset($_POST['code'])) {

$code = $_POST['code'];
$fname = $_POST['fname'];
$lname = $_POST['lname'];
$num = $_POST['num'];
$tmp = $_FILES['file']['tmp_name'];
$filename = $_FILES['file']['name'];
$path = "files";
//-------------تعیین فرمت و اندازه تصویر---------------------
$filetype = array("jpg", "jpeg", "gif", "png");
$fieExt = explode(".", $_FILES['file']['name']);
$type = end($fieExt);
if ((!$_FILES['file']['type'] == "image/jpg")
|| (!$_FILES['file']['type'] == "image/jpeg")
|| (!$_FILES['file']['type'] == "image/gif")
|| (!$_FILES['file']['type'] == "image/png")
&& (!in_array($type, $filetype))) {
echo "پسوند فایل معتبر نیست" . "<br/>";
}
else if ($_FILES['file']['size'] > 100000) {
echo "حجم فایل باید کمتر از 100 کیلوبایت باشد!" . "<br/>";
}
else{
move_uploaded_file($tmp, "$path/$filename");
echo "<img src=\"".$path."/".$filename."\" width='300' height='300' />";
}
if (empty($code) || empty($fname) || empty($lname) || empty($num)) {
echo "فیلدها را پر کنید!" . "<br/>";
}
$qr = "SELECT * FROM person WHERE code=$code";
$res = mysql_query($qr, $cn);
if (mysql_num_rows($res)> 0) {
echo "کد ملی قبلا ثبت شده" . "<br/>";
}
else if (strlen($code)!=10) {
echo "کد ملی باید 10 رقم باشد!" . "<br/>";
}
else {
$qr1 = "INSERT INTO person (code, fname,lname, num, filename, filepath) VALUES
('$code','$fname','$lname','$num','$filename','$pa th')";
mysql_query($qr1, $cn);
echo "اطلاعات ثبت گردید." . "<br/>";
}
}
?>

mojooriass
چهارشنبه 25 آذر 1394, 12:56 عصر
در جاهایی از if برای چک کردن خطا ها استفاده کردید برای مثال موقعی که پسوند فایل چک کردید علاوه بر چاپ کردن خطا با دستور


exit();

برنامه را متوقف کنید

masoud399
پنج شنبه 26 آذر 1394, 02:06 صبح
در جاهایی از if برای چک کردن خطا ها استفاده کردید برای مثال موقعی که پسوند فایل چک کردید علاوه بر چاپ کردن خطا با دستور


exit();

برنامه را متوقف کنید


داداش منظورت تمام قسمتاییه که شرط گذاشتم (if و else ها)...؟
این دستور exit() چه تاثیری داره و چرا باید بعداز چاپ خطا انجام بشه.؟؟
من این دستور رو واسه تمام خطاهام گذاشتم ولی با اینکار اگه فایلم حجم مناسبی داشته باشه ثبت میشه ولی بقیه اطلاعات اگه غلط باشن (مثلا کد ملی نامعتبر) دیگه بقیه ثبت نمیشن.!

mamad_za
دوشنبه 09 فروردین 1395, 05:41 صبح
شما ساختار if , else if مشکل داره

if ((!$_FILES['file']['type'] == "image/jpg") || (!$_FILES['file']['type'] == "image/jpeg") || (!$_FILES['file']['type'] == "image/gif") || (!$_FILES['file']['type'] == "image/png") && (!in_array($type, $filetype))) { echo "پسوند فایل معتبر نیست" . ""; } else if ($_FILES['file']['size'] > 100000) { echo "حجم فایل باید کمتر از 100 کیلوبایت باشد!" . ""; } else{ move_uploaded_file($tmp, "$path/$filename"); echo "<img src=\"".$path."/".$filename."\" width='300' height='300' />"; }

تا اینجا این عملیات رو انجام میده اگه درست باشه که فایل رو ایجاد می کنه و در ادامه میره خطای بعدی رو چپ می کنه .
اگه هم غلط باشه باز تمام خط کدات رو می خونه چنتا راهکار باید بزاری برای اینکار یا یه header بزاری ریدایرک کنه یا exit
بعد تصور کن عکس رو درست وارد کنه بعد اطلاعات کد ملی اینا اشتباه باشه در واقع یه بار عکس upload کرده بدون اینکه مشخصاتش درست وارد بشه، و چند بار این کارو انجام بده تصور کم چی میشه دیگه

kb0y667
شنبه 19 تیر 1395, 01:30 صبح
بطور کلی برنامه نویسی شما درست هست
و همه if و else ها درست هست

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

بعد شاکی میشید و همه جا داد میزنید : زبانphp اصلا امنیت نداره


آنقدر ضعف و حفره امنیتی دیدم
که نمیدونم کدم رو تعریف کنم
بطور کلی :

نمیشه اعتماد کرد $_FILES['file']['type'] به


یا اینکه :
شما درنهایت $path میفرستید به دیتابیس
که همیشه مقدار ثابتی داره "files"

گمان میکنم قصد شما این بوده که
قبل از move_uploaded_file
بنویسید :

$path.="/".$filename;
و درقسمت :

<img src="">
تبدیل بشه به
echo "<img src=\"".$path."\"/>
که بعد ازثبت در دیتابیس
مسیر فایل ثبت بشه
نه مسیر پوشه





مثلا تصور کن مقدار

$_POST['code'];
یه نفر تایپ کنه :

1122334455 and 1=0
یا
1122334455&&1=0
و رشته شما خواهد شد :

$qr = "SELECT * FROM person WHERE code=1122334455 and 1=0";
پس هیچ وقت پاسخ مثبت از دیتابیس دریافت نمیشه
و میشه هرچقدر دلش خواست ثبت کنه


البته من همش سعی کردم مثال های ساده بزنم
وگرنه با همین حفره امنیتی ساده
یه سایت عظیم رو به باد میده

چه برسه به بقیه نواقصی که بنده حوصله نداشتم حتی اشاره کنم