جنگولرن
3.82K subscribers
287 photos
74 videos
31 files
557 links
آموزش Django و بستگان
Download Telegram
Media is too big
VIEW IN TELEGRAM
برنامه نویسی از پایه قسمت چهل و ششم - استایل دهی به فرم جنگو

در ابتدای این ویدئو با ویجت های جنگو و PasswordInput آشنا شدیم. بعدش رفتیم سراغ کاستوم کردن ظاهر فرم های جنگو با راهنمایی گرفتم از داکیومنت Django. در ادامه آموزش یاد گرفتیم که چطور attr به widget ها اضافه کنیم و با این روش class برای input ها اضافه کردیم تا استایل دهی انجام بشه. همچنین یاد گرفتیم توی جنگو چطور کدهای html رو کامنت کنیم. در خلال آموزش با مفهوم context هم آشنا شدیم و در ادامه هم با حلقه for در template های جنگو کار کردیم. در انتهای ویدئو هم ایراد کدهامون رو پیدا کردیم و تونستیم خطاهای فرم رو نمایش بدیم. برای نمایش خطاهای فرم از novalidate در فرم ها استفاده کردیم.

لینک آپارات:
https://www.aparat.com/v/Jzne6
لینک یوتیوب:
https://youtu.be/zCS0Exuby0c
👍5
https://youtu.be/bKboIvNb_fY

دوستان اولین قسمت دوره آموزش مقدماتی DRF یا همون Django rest framework منتشر شد 🤩.
تو این دوره شما از صفر تا ۷۰ درصد DRF رو یاد خواهید گرفت بعد از این دوره میتونید هر برنامه ای که میخایید به صورت API و با استفاده از DRF توسعه بدید.
تو این دوره سعی میکنم علاوه بر یادگیری خود DRF با مفاهیم محیط کار و ابزار هاش هم آشنا بشید، مثل لینوکس، postman و ....

امیدوارم از این دوره چیزها مفید و باحالی یاد بگیرید❤️🫵

با معرفی دوره به دوستانتون باعث حمایت و در نتیجه دوره و آموزش ها بیشتر بشید🥹❤️‍🔥

مرسی از @AlirezaWDX برای تامبنیل ویدیو ❤️‍🔥🫵

💬 join -> @TorhamDevCH
👍112
Forwarded from  behrad
دوتا مفهوم داریم ، که خیلیا اینارو باهم اشتباها قاطی میکنن...
XSS : Cross Site Scripting
CSRF/XSRF : Cross Site Request Forgery

=+=+=+=+=+=+=+=+=+=+=+=+=+

من سعی میکنم جدا جدا توضیح بدم ، و بگم چیه...

=+=+=+=+=+=+=+=+=+=+=+=+=+

قبل از اینکه شروع کنم یه مفهومی هست که پیشنیازه توضیح بدم، بهش میگن:
SOP : Same Origin Policy

یه پالیسی (سیاست/قانون/عرف..) هست که توی وب رعایتش میکنن ، اونم اینه که کلاینتها/سرور ها رکوئستی رو valid میپندارن و معتبر میدونن که دقیقا از منبع درستش (منبع قبلی) باشه.

این اعتبار سنجی هم با چک کردن 3 تا چیز مشخص میشه:
1- پرتکلش همون باشه (مثلا HTTP)
2- آدرس هاست (دامین) همون باشه
3- پورت دقیقا همون باشه

مثلا یکی میاد یه رکوئست رو عوض میکنه به سمت براوزر تو و میگه من گوگلم:
https://hacker.com:80

براوزر تو گوگل رو این میدونه:
https://google.com:80
حالا میاد چک میکنه:
https://hacker.com:80
https://google.com:80
\____/ \______/ \__/
Prtocol Host Port

پروتکل همونه
هاست همون نیست
پورت همونه

یکی از شرطها برقرار نیست پس ارور:
Same Origin Policy
میده و رکوئست دراپ میشه😬

با این پالیسی میشه جلوی خیلی از حمله هارو گرفت ، ولی حملات دیگری هستن که با وجود این پالیسی بازم قابل انجامن مثل
XSS
XSRF/CSRF

که که قراره راجع بهشون حرف بزنیم
👍6
Forwarded from  behrad
#سوال : حمله XSS چیست؟
XSS
ایکس اس اس - مخفف
XSS : Cross Site Scripting
هست.

=+=+=+=+=+=+=+=+=+=+=+=+

بطور کلی : یعنی که در یک سایت ، کد جاوااسکریپت اینجکت (تزریق) کنیم!
یعنی یه جوری کد جاوا اسکریپت رو بچپونیم توی بدنه سایت ، که کده اجرا بشه!

سناریوهای مختلف داره.... مثلا من یادمه اون اوایل که وبلاگستان فارسی راه افتاده بود و همه واسه خودشون یه وبلاگ درست میکردن توی بلاگفا و😋😬
وبلاگ نویسی تازه به اون معنا توی ایران راه افتاده بود ، خیلی راحت میشد XSS رو توی وبلاگ ها زد!

کافی بود یه کد جاوا اسکریپت رو توی قسمت کامنتها بذاری ، بجای کامنت.... . 90 درصد سایتها اعتبار سنجیش نمیکردن ، و وقتی کامنتت نشون داده میشد ، کدت هم برای بقیه مردم ران میشد😶‍🌫️

و نابود....😬
=+=+=+=+=+=+=+=+=+=+=+=+

الان پیاده سازیش به این راحتیا نیست...

=+=+=+=+=+=+=+=+=+=+=+=+

به هر نوع
javascript injection
در یه وبسایت میگن XSS
=+=+=+=+=+=+=+=+=+=+=+=+

ایکس اس اس انواع مختلفی داره:

Reflected:
ایکس-اس-اس بازتابی:
مثلا یه سایتی هست ، یه فرمی داره که هر چی توش بنویسی میره سمت سرور و برمیگرده و بخش از کانتنت HTML صفحه میشه.

مثلا یه صفحه ساده رو فرض کنین ، توی قسمت
name : ———-
توی فرم هرچی بنویسی و فرم رو سابمیت کنی ، درخواستت میره و برمیگرده و هرچی توی name نوشته بودی رو نشون میده:
Your name is : "behrad"

اگه من به جای behrad یه کد js بزنم ، میره و میاد و اجرا میشه... این میشه بازتابی.
Stored:

ایکس اس اس ذخیره شده ، زمانی هست که کد مخرب میره توی یه دیتابیسی ذخیره میشه، و از اون به بعد از توی دیتابیس خونده میشه و میاد(شاید به همه مردم زینپس حمله صورت بگیره)

DOM:

یک نوع xss کلاینت ساید هست و زمانی هست که ایکس اس اس رو روی آبجک DOM میزنیم ( تخصصیه) وقتی DOM دست یه اسکریپت مخرب بیفته ، همه چیز صفحه دستش افتاده...

Mutation:

زمانی که یه جهشی توی اینپوت کلاینت صورت بگیره...

انواع دیگه هم داره که از حوصله این پیام خارجه🙂
=+=+=+=+=+=+=+=+=+=+=+=+

XSS
یعنی که در یک سایت ، کد جاوااسکریپت اینجکت (تزریق) کنیم!
👍9
Forwarded from  behrad
#سوال : حمله CSRF/XSRF چیست؟
CSRF/XSRF

سی‌سرف (موجسواری در دریا- sea surf) یا سی اس آر اف یا ایکس اس آر اف ، مخفف
CSRF/XSRF : Cross Site Request Forgery

هست.

=+=+=+=+=+=+=+=+=+=+=+=+

به طور کلی این حمله یعنی:

یک دامین ، رکوئستی که مربوط به دامین دیگری هست رو جعل میکنه و نهایتا مقادیری رو تغییر میده.
👇
👍7
Forwarded from  behrad
این حمله به شدت گسترده هست ، ازش میشه هزاران تا مثال زد.

=+=+=+=+=+=+=+=+=+=+=+=+

مثلا : یه url توی سایت داریم که هر موقع این url رو فراخونی کنیم ، و یه مقدار خاصی رو پست کنیم یه اتفاقی می افته... ( مثلا اکانتمون حذف میشه)

یه نوع API ساده طراحی شده... همه هم همینجوری طراحی میکنن..

طرف سایت فروم رو اینطوری طراحی کرده که برای حذف اکانت دکمه فلان رو بزن، که اون دکمه ریدایرت میده به :

mywesite.com/delete_my_acc.php

و اگر پارامتری به اسم delete با مقدار 1از طرف من پست بشه، اکانت من پاک میشه. همه همینجوری طراحی میکنن دیگه...

=========================
حالا

من خودم نمیخوام اکانتم رو پاک کنم ! دارم توی سایت برای خودم میجرخم که میبینم یه نفر توی فروم یه لینک داده که یه عکس سسکی خشگلی هست😬

منم تحریک میشم و روش کلیک میکنم!
ریدایرکت میشم به یه سایت سسکی و یه عکس سسکی تر هم میبینم و به خیال خودم کیف میکنم😬😀
بعدش برمیگردم که بیام توی فروم دوباره بچرخم...

منتهی بهم ارور میده که اکانت شما پاک شده! و من دیگه اکانتی ندارم!

=+=+=+=+=+=+=+=+=+

چه اتفاقی افتاد؟

من یک اتک XSRF خوردم و خودم خبر ندارم!

=+=+=+=+=+=+=+=+=+

سورس کد سایت سسکی این بوده:

<img source="sexy.png" >
<form
action="mywesite.com/delete_my_acc.php"
method="POST"
id="sexy"
>
<input type="hidden" name="delete" value="1" />
</form>
<script>
document.getElementById("sexy").submit()
</script>


=+=+=+=+=+=+=+=+=+=+=+=+

برای خودتون تحلیل کنین ببینین چیکار میکنه...

با جاوااسکریپت یه ریکوئست میزنه به اون URL و میگه که من بهرادم ... میخوام اکانتم رو پاک کنم!!!
باورت نمیشه من بهرادم؟ اینم کوکی هام!!!!!!
🍪🍪🍪🍪🍪🍪

(کوکی های من رو چجوری گرفت؟! نگرفت! خود براوزر شما برای هر URL که کش کرده {میشناسه} کوکی هارو انکپسوله میکنه و میفرسته همیشه.... واسه همینه که شما میتونی توی یه سایت لاگین کنی!)
=+=+=+=+=+=+=+=+

خلاصه من CSRF خوردم و اکانت من پاک شد...

=+=+=+=+=+=+=+=+
سیاست
SOP
که قبلش توضیح دادم، اینجا فقط جلوی این رو میگیره که سایت سسکی هکر نتونه جواب ریکوئست رو بگیره... یعنی ریکوئست رفته و موقع برگشت جوابش دراپ شده....
خب چه فایده... اکانت من پاک شده :)
هکر چیزی از نتیجه رو ندید.... فقط تیری توی تاریکی در کرد!

=+=+=+=+=+=+=+=+

این یه مثال خیـــــــــــلی ساده بود...

CSRF
رو میشه روی URL زد ..
میشه روی پارامترهای GET زد...
میشه توی فایلها زد
میشه روی عکس زد
میشه توی iframe زد
میشه توی POST
میشه روی لینک زد ،
میشه روی JS زد
میشه خیلی کارا کرد🥴

من به همین جا بسنده میکنم...

=+=+=+=+=+=+=+=+=+=+=+=+

خلاصه کلام اینکه:

سی-سرف یعنی یک دامین ، رکوئستی که مربوط به دامین دیگری هست رو جعل میکنه و نهایتا مقادیری رو تغییر میده.
👍163
Media is too big
VIEW IN TELEGRAM
برنامه نویسی از پایه قسمت چهل و هفتم - کاستوم کردن validation

توی این ویدئو اول ظاهرا خطاهارو درست کردیم و با فیلتری به اسم striptags آشنا شدیم و تونستیم ظاهر خطاها رو بهتر کنیم. بعد از اون متن خطاهارو کاستوم کردیم و با error_messages آشنا شدیم. در ادامه view جدیدی به اسم signup ساختیم و با HttpResponse جنگو هم آشنا شدیم. بعد از اون با پارامتر name در url ها آشنا شدیم و مزیت استفاده اش رو یاد گرفتیم. در انتهای آموزش هم با متد reverse آشنا شدیم و ازش استفاده کردیم.

لینک آپارات:
https://www.aparat.com/v/63a1c
لینک یوتیوب:
https://youtu.be/g297BS6tEm4
👍3
Media is too big
VIEW IN TELEGRAM
برنامه نویسی از پایه قسمت چهل و هشتم - دیتابیس چیست

در ابتدای این ویدئو برای ما سوال بود که اطلاعات کاربرها کجا ذخیره می شوند. پس به مفهومی به اسم دیتابیس رسیدیم و یکم در موردش سرچ کردیم. توی سرچ هامون با دیتابیس و نرم افزارهای DBMS آشنا شدیم و با اسم چند تا نرم افزار DBMS مثل SQL Server, PostgreSql, MySql, Oracle و... آشنا شدیم. در ادامه با SQLite هم آشنا شدیم و فهمیدیم که برای توسعه خیلی پر استفاده است و جنگو به صورت پیشفرض ازش استفاده می کنه. با نرم افزار DB Browser for SQLite دیتابیسمون رو باز کردیم و با جداول پیشفرض جنگو یکم آشنا شدیم. در ادامه با ارث بری از ModelForm دیدیم که جنگو چقدر راحت برای ما فرم ثبت نام رو ایجاد میکنه.

لینک آپارات:
https://www.aparat.com/v/r5IBe
لینک یوتیوب:
https://youtu.be/8KKy_QoCjyk
👍7
این متن بخشی از یک پست از کانال @pytens هست، خوشحال میشم نظر خودتون رو بگید (مهم نیست خودتون در چه سطحی هستید):

یک چند روزی هست ذهنم درگیر یک موضوع شده، همه چیز هم از یک دورهمی شروع شد و یکی از افراد که بعد از شنیدن صحبت‌ها گفت من یک دختر دارم ۹ سالش هست و داریم سعی می‌کنیم استعدادش رو کشف کنیم (با احترام به علایق) که راهی که براش بهتر هست رو پیش بگیره نه اینکه دکتر، مهندس بشه چون خانواده‌اش توی این مشاغل هستند (چه درک خوبی)

بعد از من پرسید بنظر شما که چندین سال هست توی این کار مشغول هستی چطور میشه فهمید یک نفر برنامه‌نویس خوبی میشه در نهایت یا نه !؟

نظرتون رو کامنت کنید یا خصوصی برای @miladhzz بفرستید. تشکر
👍7
دانلود Python Notes for Professionals

فقط فهرست مطالب رو ببینید. عجب چیزیه 😱
فایلش رو در ادامه آپلود میکنم
👍7
PythonNotesForProfessionals.pdf
5.9 MB
فایل PDF کتاب Python Notes for Professionals
دانلود کنید. کتاب با ارزشی هست.
🔥14
Media is too big
VIEW IN TELEGRAM
برنامه نویسی از پایه قسمت چهل و نهم - ظاهر فرم Register

ابتدای این ویدئو حین کار کردن با fields در model form نکته ای در مورد tuple ها یاد گرفتیم. بعدش یاد گرفتیم که چطور فیلدهای مشخصی رو فقط توی خروجی فرم نمایش بدیم. بعدش رفتیم سراغ تغییر label فیلد های فرم. بعد از اون help_texts مربوط به username رو حذف کردیم. بعدش خواستیم tool tip اضافه کنیم که یادم رفت. جلسه بعد ان شاالله اوکی اش میکنیم. در ادامه توی modelForm از widget استفاده کردیم و کلاس های مخصوص خودمون رو به فیلدها دادیم. این جلسه مثل یه کار واقعی بود و همه چیز رو تقریبا سرچ کردیم.

لینک آپارات:
https://www.aparat.com/v/qm2eP
لینک یوتیوب:
https://youtu.be/wcL7r5CIi4s
👍3
توی شرکت ی بخش آرشیوی داریم که همه‌ی کدهای قدیمی zip شده هستند و دیتاها tar compressed که خب طبیعی هست
گاهی نیاز میشه یک پروژه قدیمی به روز بشه یا اینکه یک بخشی از پروژه قدیمی برای کارهای جدید لازم میشه یا ...

خلاصه لازم میشه که اینکار صورت بگیره از قدیم هم یک چیزی جا افتاده که هر ورژنی که deploy میشه (فیچرهای بزرگ و اصلی) علاوه بر اینکه روی گیت لیبل میخوره و ... ی نسخه ازش بکاپ گرفته میشه بازم با فرمت zip

دیدم یکی از نیروها نشسته اینارو دونه دونه داره extract میکنه روی سیستمش و دنبال یکی از پروژه هایی میگرده که n فیچر مورد نیاز رو پیاده سازی کرده کلی هم وقتش رو گرفته بود و عصبی بود

براش همه تلاشش رو تبدیل کردم به این چند خط کد

import glob, importlib
packages = glob.glob("./**/*.zip")

for pk in packages:
sys.path.append(pk)
name = pk.split('/')[-1].split('.')[0]
module = importlib.import_module(module_name, package=None)
try:
module.needed_feature()
print(f"found feature in: {pk}")
break
except:
pass

اینجوری تو کمتر از چند دقیقه (بقول خودش تا قهوه رو بریزه کد مدنظر رو پیدا کرده بود)

دلیل اصلی zip ذخیره کردن کدها و جدا کردنش از دیتاها توی شرکت هم همینه پایتون توانایی اجرای کد داخل فایل zip رو هم داره.
بعضی وقتا پرسیدن دلیل اینکه چرا یک تصمیم خاص گرفته شده می‌تونه خیلی کمک کننده باشه و خیلی وقت براتون ذخیره کنه.
👏18👍6
Media is too big
VIEW IN TELEGRAM
برنامه نویسی از پایه قسمت پنجاهم - تابع هش چیست

اوایل این قسمت سیستمم قاطی کرده بود و صدا یکم خرابه، لذا عذرخواهی میکنم. همون اوایل tooltip رو اضافه کردیم به فرم و با استفاده از help_text فرم ها تونستیم این قابلیت رو اضافه کنیم. بعدش رفتیم سراغ تکمیل کد ذخیره کاربر در ویو signup و با متد save آشنا شدیم. دیدم که کاربر ساخته شده نمیتونه لاگین کنه چون پسوردش hash نشده بود. پس اول رفتیم یکم در مورد هش یاد گرفتیم و بعدش با استفاده از متد make_password مشکل رمزهای هش نشده رو اوکی کردیم.

لینک آپارات:
https://www.aparat.com/v/ZMqgn
لینک یوتیوب:
https://youtu.be/0gAVoLWFP5g
👍1
Forwarded from DevOps (Ahmadali Bagheri)
سلام رفقا جلسه چهارم دوره پروژه محور پیاده سازی جنگو هم رسید امااا این جلسه قرار در مورد Reverse Proxy صحبت کنیم . اقا بزار بگم داستان این چیه اصلا!!!

شما فکر کن میخوای چند تا سرور داشته باشی و لود بالانسینگ داشته باشی
یا فکر کن میخوای سرورت رو امن کنی و آی پیش رو دیگه هرکی از راه رسید در نیاره که با یه برنامه الکی attack نخوری
یا فکر کن میخوا بحث ssl یعنی encrypt/decrypt رو از روی سرور برداری که پرفورمنس کار بره بالا (‌خب یه بابایی باید اینو انجام بده )‌
یا فکر کن میخواد کش سرور داشته باشی که سرعت خیلی بالا بره بالا .....


اینجا Reverse proxy میاد وسط و برای اینکار ابزارهای مختلفی وجود داره
امیربهادر عزیز تو این جلسه اومده از ابزار Traefik استفاده کرده و همه چی رو گفته

وقتی این ابزار رو راه میندازی اصلا مهم نیست که پشتش جنگو باشه !‌لاراول باشه یا نست جی اس و هر فریمورک دیگه .... لذت ببرید و با بازنشر و کامنت و لایک انرژی بدین بهمون

https://www.youtube.com/watch?v=ptjA9Hc-0ls

راستی اگر سوالی بود لطفا زیر همون ویدیو بپرسین امیربهادر همه رو با عشق جواب میده
روی خود ریپو هم میتونین issue بزنین

اگر دوست داشتین به کانال خود امیربهادر هم سر بزنین کلی محتوای خوب داره 👇🏼👇🏼👇🏼👇🏼
https://t.iss.one/BenDevelop
https://www.youtube.com/@bendev8723
https://www.linkedin.com/in/amirbahador/

پس یه مرور نمکی بکنیم باهم

شنبه ها آمازون
سه شنبه ها ترافورم
چهارشنبه ها نت آپس مقدماتی و بعد از این کورس نت آپس پیشرفته
دوشنبه ها و پنج شنبه ها دوره پروژه محور Django + docker + CI/CD
👍5
به قول django expert هشتگ منهای جنگو 😁

حداقل سابقه کاری که خواستن ۳ تا ۶ سال بوده
بعد به خاطر عدم تطابق سن رزومه ام رد شده.
احتمالا ۳۷ سال سن، سن کمی هست و بالاتر خواستن 🥸
🤣15👍2🤯21
https://www.youtube.com/watch?v=vPIvIoPu2co

سومین قسمت دوره آموزش مقدماتی DRF یا همون Django rest framework 🧠.

تو این قسمت بیشتر با فانکشن بیس آشنا میشیم API ساخت آبجکت رو مینویسیم. با postman کار میکنیم و نگاهی به متد ها مختلف http میندازیم و سعی میکنیم غیر از DRF چیزهای دیگه ای هم یاد بگیریم 🤝


امیدوارم از این دوره چیزها مفید و باحالی یاد بگیرید❤️🫵

با معرفی دوره به دستانتون باعث حمایت و در نتیجه دوره و آموزش ها بیشتر بشید🥹❤️‍🔥

💬 join -> @TorhamDevCH
4👍1
Media is too big
VIEW IN TELEGRAM
برنامه نویسی از پایه قسمت پنجاه و یکم - ساخت اولین ریپازیتوری

توی این قسمت در مورد سورس کنترل یا ورژن کنترل ها تحقیق کردیم و یکم تاریخچه شون رو بررسی کردیم. فهمیدیم که SVN و Git و TFS و... وجود داره. بعدش در مورد گیت هاب و گیت لب هم مطالعه کردیم. در ادامه برای اینکه یه محیط واقعی رو شبیه سازی کنیم git رو روی یک ویندوز۷ نصب کردیم و از صفر شروع کردیم به کار با گیت. بعدش با git gui و git bash آشنا شدیم. در ادامه ریپازیتوری خودمون رو به اسم basic-programming ساختیم و با فایل gitignore هم آشنا شدیم. بعدش رفتیم سراغ ریموت شدن به یه ریپازیتوری و دیدم که یکم سخته. لذا آسون ترین روش رو استفاده کردیم و کدهامون رو به گیت وصل کردیم. خیلی مختصر با دستور clone و status و commit و push هم آشنا شدیم و در ادامه گیت رو توی پایچارم فعالسازی کردیم. در نهایت تغییراتی روی پروژه اعمال کردیم و commit و push کردیم. یه بار هم از دستور revert استفاده کردیم و در نهایت rollback رو هم یاد گرفتیم.

لینک آپارات:
https://www.aparat.com/v/YSyCg
لینک یوتیوب:
https://youtu.be/yQ9v9fkdMDM
👍2
آیا همیشه بهتره از آخرین نسخه پایتون برای همه پروژه ها استفاده کنیم؟
نظر چند تا از دوستان با تجربه در این مورد:

✔️یکسری پکیج هایی که اپدیت ندادن از ۳.۹ به ۳.۱۰ نیاز به یکسری تغییرات ریز دارن که باید فورک کنی دستی اپدیت کنی. ولی من خودم از ۳.۱۰ استفاده میکنم همه جا

✔️چون رو ۳.۱۰ یک تایمی انقدر سر پکیج ها ارور خوردم اومدم ۳.۹ همچی اوکی بود و اینکه الان دیفالت ۳.۱۰ وصله اوکی، ولی قدیمی ها روی ۳.۸ و ۳.۹ موندن دیگ

✔️تقریبا تمام پروژه هایی که تجاری هستن پایتون ۳.۸ و ۳.۹ استفاده میکنم. پروژه های استارتاپی و شخصی و ... آخرین نسخه پایتون (فکرکنم ۳.۱۱) برای من اینطوریه. روی همین ۳.۸ و ۳.۹ تا حالا چندین بار سر package conflict سرویس شدیم جرات نداریم بالاتر ببریم توی پروژه هایی که حساسن

✔️ببین من معتقدم که بسته به نیازت باید بری جلو و میدونم این خیلی کلیشه ای هست ولی اگر کاری نداشته باشم و لنگ نسخه بالا تر نباشم ۳.۹ ولی مثلاً من الان تفاوت سرعتم با ۳.۱۰ مشهوده و نیاز دارم سریع تر باشم توی یه پروژه دیگه با ۳.۱۰ میرم جلو

🙏🏻 شما هم نظر خودتون رو بدید (خصوصی هم بگید اوکیه). نظرات بقیه رو هم به کامنت ها اضافه میکنم
🔥5