PDA

View Full Version : باگ Yii



under22
دوشنبه 01 اردیبهشت 1393, 20:03 عصر
دوستان Yii یک باگ کاملا خنده دار داره وقتی شما میخاین قابلیتی رو سایت بگزارید که افراد فایل آپلود کنند برای مثال افراد برای استخدام فایل رزومه خود رو ارسال کنند .
شما هم می تونید از کلاس خود Yii استفاده کنید یا استنشن نصب کنید که بحث من نیست ولی وقتی میخاین تو رول هاتون این فایل رو ولیدیت کنید برای مثال به این شکل این کد رو درون مدل و rules قرار می دهید که فایل فقط pdf,word رو بگیره و کاملا هم امن هست .


array('resumeFile', 'file', 'types' => 'docx,doc,pdf',
'allowEmpty' => FALSE,
'enableClientValidation' => TRUE,
'maxSize' => 4 * 1024 * 1024,
'mimeTypes' =>'application/pdf,application/x-download,
application/vnd.openxmlformats-officedocument.wordprocessingml.document,
application/msword',
'message'=>'فایل word , pdf قابل قبول می باشد',
'wrongType'=>'فایل word , pdf قابل قبول می باشد',
'wrongMimeType'=>'فایل word , pdf قابل قبول می باشد',
'tooLarge'=>'فایل انتخابی باید کمتر از 4 مگابایت باشد'
),

اینجا الآن یک باگی داره . اگه شما هر فایلی بهش بدید مثله هلو ! کار میکنه ولی به دو شرط یکی اینکه اکستنشن فایل اینفو درون هاست فعال باشه که بحث من نیست و دومی اینکه باید سایز فایلی که کاربر میخاد آپلود کنه باید کمتر از میزان سایز وارد شده فایل درون phph.ini باشد اگه بیشتر باشه با یه اررو جالب که برای cfilevalidator فریمورک هست رو به رو می شوید .
دو راه دارید یکی اینکه خودتون دستی چک کنید قبل از دادن فایل به مدل برای ولیدیت و دومی که اصول نیست اینه که سایز فایل آپلود شده رو در Php.ini زیاد بگزاریم .
همین مشکل داشت منو بیچاره میکرد واقعا باگ cfilevalidator حساب میشه که نمیاد سایز فایلو چک کنه . یعنی maxSize رو داخل filevalidator آدم حساب نمیکه http://barnamenevis.org/images/smilies/yahoo/124.gif
اینم باگ Yii !

MMSHFE
سه شنبه 02 اردیبهشت 1393, 01:42 صبح
دوست عزیز، این باگ از Yii نیست. شما با خود PHP هم اگه فایل آپلود کنید، حتی اگه توی فرم، MAX_FILE_SIZE رو بصورت مخفی بگذارین و فرضاً سایز رو 20 مگابایت بگذارین ولی توی php.ini حداکثر اندازه 2 مگابایت باشه، با خطا مواجه میشین. یکم قبلش مطالعه کنید، بعد اسم باگ بیارین. برای اینکه حرفم هم مستند باشه، توضیحات سایت php.net رو میارم (لینک (http://us2.php.net/manual/en/features.file-upload.errors.php)) :

Since PHP 4.2.0, PHP returns an appropriate error code along with the file array. The error code can be found in the error segment of the file array that is created during the file upload by PHP. In other words, the error might be found in $_FILES['userfile']['error'] (http://us2.php.net/manual/en/reserved.variables.files.php).

UPLOAD_ERR_OK Value: 0; There is no error, the file uploaded with success.
UPLOAD_ERR_INI_SIZE Value: 1; The uploaded file exceeds the upload_max_filesize (http://us2.php.net/manual/en/ini.core.php#ini.upload-max-filesize) directive in php.ini.
UPLOAD_ERR_FORM_SIZE Value: 2; The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.
UPLOAD_ERR_PARTIAL Value: 3; The uploaded file was only partially uploaded.
UPLOAD_ERR_NO_FILE Value: 4; No file was uploaded.
UPLOAD_ERR_NO_TMP_DIR Value: 6; Missing a temporary folder. Introduced in PHP 4.3.10 and PHP 5.0.3.
UPLOAD_ERR_CANT_WRITE Value: 7; Failed to write file to disk. Introduced in PHP 5.1.0.
UPLOAD_ERR_EXTENSION Value: 8; A PHP extension stopped the file upload. PHP does not provide a way to ascertain which extension caused the file upload to stop; examining the list of loaded extensions with phpinfo() (http://us2.php.net/manual/en/function.phpinfo.php) may help. Introduced in PHP 5.2.0.

به خطای 1 و 2 دقت کنید: اگه کد خطا 1 باشه یعنی از تنظیمات php.ini بیشتر بوده و اگه 2 باشه یعنی از تنظیمات فرم بیشتر بوده. بطور کلی شما نمیتونید توی تنظیمات فرم، از تنظیمات php.ini فراتر رفته و سایزی بیشتر از اون تنظیم کنید.

under22
سه شنبه 02 اردیبهشت 1393, 17:31 عصر
آقای شهرکی عزیز من خودم میدونستم این خطا از PHP هست ولی خب دلیل ما برای استفاده از فریمورک چیه
سرعت و امنیت و بهینه بودن کد ها و تمیز تر بودن کد های و ...
ما وقتی داریم از این فریمورک استفاده می کنیم خیلی زشته که نتونه این قضیه رو تو خودش هندل کنه من برای جلوگیری از این خطلا یک If کوچیک نوشتم یعنی Yii نمی تونست همچین کاری رو تو خودش انجام بده .
به نظره من این باگ واسه Yii حساب میشه

MMSHFE
سه شنبه 02 اردیبهشت 1393, 22:02 عصر
ببینید، وقتی توی PHP خطا تولید شده، فریمورک نمیتونه و نباید بگه که خطا وجود نداشته. حالا Yii اومده و کد هر دو خطای 1 و 2 رو یکی کرده و گفته سایز فایل غیرمجازه که کاربر رو از سردرگمی در بیاره و ضمناً بخاطر مقاصد امنیتی، تنظیمات داخلی php.ini رو هم لو نده و قطعاً کسی که سراغ فریمورک میاد، اینقدر اطلاعات داره که بدونه برای آپلود فایلهای حجیم باید تنظیماتی مثل post_max_size و upload_max_filesize رو توی php.ini اصلاح کنه و یا در مواردی که میخواد چند فایل همزمان آپلود کنه، max_file_uploads رو باید افزایش بده. اتفاقاً برخلاف تصور شما من فکر میکنم Yii به بهترین شکل ممکن (ازنظر امنیت و راحتی کاربر) این مسئله رو مدیریت کرده چون بهرحال خطای 1 و 2 مربوطه به حجم غیرمجازه و چه فرقی میکنه که توی php.ini باشه یا توی MAX_FILE_SIZE خود فرم؟ برنامه نویسی هم که تنظیمات رو نگاه میکنه و میبینه حجم فایل بیشتر از MAX_FILE_SIZE نیست، خودبخود ذهنش سمت php.ini میره. درهرصورت باگ با این چیزهایی که میگین خیلی فرق داره.

under22
سه شنبه 02 اردیبهشت 1393, 22:26 عصر
آقای شهرکی من دو تا فرم داشتم که جفتش آپلود داشت ولی یکیش ajax بود من یکیشونو نگا کردم کد هامو یه نگاه دیگه اندختم و یه سری اصلاحات دادم . اون فرمی که ajax نمیفرستاد کلا درست شد .
به نظرم اشتباه از من بوده چون دیگه به محض انتخاب فایل سایزشو تشخصی میداد و نمیزاشت فرم ارسال بشه ولی بازم این مشکلی که گفتم تو فرم ajax وجود داشت که ارور رو موقع ویلیدیت میداد که من با این شرط درستش کردم


if ($model->resumeFile->size != 0)

من حرف شما رو قبول دارم اتفاقا Yii تو خیلی موارد عالی عمل کرده ولی به نظرم با اینکه Yii از وب 2 پشتیبانی میکنه تو زمینه کار با ajaxضعیف عمل کرده . تو این موردم بهتر بود خود Yii هندل می کرد
چون معمکنه خیلی از کاربرا مثله من اینو ندونن
درضمن اون اروری که بنده میگفتم جزوه ارور های بالا نیست تو اون ارور میگفت که فایل ابنفو نمیتونه mimetype رو بخونه

MMSHFE
چهارشنبه 03 اردیبهشت 1393, 09:32 صبح
خوب البته باز هم نسبت به فریمورکهایی که اصلاً با وب 2 (بصورت توکار) میانه خوبی نداره، چند قدم جلوتره ولی بهرحال مثل هر فریمورک دیگری، یکسری نواقص هم داره. یکی از این مشکلات هم کار با AJAX هست که توی نسخه 2 بازنویسی شده. الآن هم که گفتین مشکل سر تشخیص MIME Type بوده و این هم طبیعیه و تقصیر Yii نیست و وقتی میخواین تشخیص رو بر اساس MIME Type انجام بدین، باید افزونه مربوطه یعنی fileinfo نصب باشه چون بخاطر امنیت بیشتر، Yii نمیاد MIME Type رو از روی پسوند فایل تشخیص بده بلکه هدر فایل رو میخونه (با کمک fileinfo) و اون مورد دیگه (سایز) هم بنظر من Yii خطایی مرتکب نشده که اسم باگ روش گذاشتین.