جنگولرن
دکوریتور lru_cache یکی از ابزارهای جالب و کاربردی در پایتون هست که به ما کمک میکنه تا عملکرد برنامههامون رو با ذخیرهسازی نتایج محاسبات قبلی بهبود ببخشیم. این دکوریتور به صورت خودکار نتایج تابع رو برای ورودیهای تکراری ذخیره میکنه و وقتی هم که همون ورودی…
در مورد دکوریتور lru_cache توی پایتون.
با تشکر از عمو جی پی تی
با تشکر از عمو جی پی تی
😁5❤2
تجربه مصاحبه از کانال pyHints با یکم حذفیات از پست اصلی
سیستمی رو پیاده سازی کن که بعنوان ورودی یک استرینگ از محاسبات ریاضی بصورت infix دریافت کنه؛ بتونه خروجی رو بصورت postfix, یا prefix (هرکدوم راحتتری) تحویل بده یا اگر object اون کلاس صدا زده شده؛ با استفاده از postfix/prefix پیادهسازی شده محاسبات رو انجام بده و خروجی رو تحویل.
من اینو یادمه که با postfix حل کردم چون راحتتر بود (stack) :
اما چندتا چیز رو بررسی میکرد:
۱- چون صحبت از object شد باید. OOP میبود
۲- حتماً باید call رو براش پیادهسازی میکردم که callable باشه (این یعنی داندر متودها رو میشناسم)
۳- سراغ پیادهسازی سادهتر رفتم (تصمیم گیری و شناخت مسأله، البته توضیح هم دادم چرا بنظرم سادهتر هست و ...)
۴- استفاده از stack که بعد خود stack رو پیادهسازی کردم (آشنایی با DS, حتی بحث هم کردم بین LinkedList, Array چرا و کدوم رو انتخاب میکنم برای ساخت stack) .
اگر خواستید پیادهسازی کنید این حالات رو تست کنید (تو مصاحبه از مصاحبه کننده باید پرسیده بشه)
۱- سیستم ورودی invalid داشته باشه؛ خروجی برای هر دو حالت None هست
۲- سیستم infix برای اولویت دادن به محاسبات از () ممکنه استفاده کنه
۳- سیستم فقط از ۴ عمل اصلی + پرانتز پشتیبانی خواهد کرد
۴- ورودیهای عددی ممکنه float/int باشه
۵- ممکنه بین کاراکترها space باشه یا نباشه
"17+3.5" or "17 + 3.5"
هر دو درست هست.
سیستمی رو پیاده سازی کن که بعنوان ورودی یک استرینگ از محاسبات ریاضی بصورت infix دریافت کنه؛ بتونه خروجی رو بصورت postfix, یا prefix (هرکدوم راحتتری) تحویل بده یا اگر object اون کلاس صدا زده شده؛ با استفاده از postfix/prefix پیادهسازی شده محاسبات رو انجام بده و خروجی رو تحویل.
من اینو یادمه که با postfix حل کردم چون راحتتر بود (stack) :
اما چندتا چیز رو بررسی میکرد:
۱- چون صحبت از object شد باید. OOP میبود
۲- حتماً باید call رو براش پیادهسازی میکردم که callable باشه (این یعنی داندر متودها رو میشناسم)
۳- سراغ پیادهسازی سادهتر رفتم (تصمیم گیری و شناخت مسأله، البته توضیح هم دادم چرا بنظرم سادهتر هست و ...)
۴- استفاده از stack که بعد خود stack رو پیادهسازی کردم (آشنایی با DS, حتی بحث هم کردم بین LinkedList, Array چرا و کدوم رو انتخاب میکنم برای ساخت stack) .
اگر خواستید پیادهسازی کنید این حالات رو تست کنید (تو مصاحبه از مصاحبه کننده باید پرسیده بشه)
۱- سیستم ورودی invalid داشته باشه؛ خروجی برای هر دو حالت None هست
۲- سیستم infix برای اولویت دادن به محاسبات از () ممکنه استفاده کنه
۳- سیستم فقط از ۴ عمل اصلی + پرانتز پشتیبانی خواهد کرد
۴- ورودیهای عددی ممکنه float/int باشه
۵- ممکنه بین کاراکترها space باشه یا نباشه
"17+3.5" or "17 + 3.5"
هر دو درست هست.
👍6✍4🔥1🤮1
بکند کارها به این چیزا دقت نمیکنن. اما جالب بود. از لینکدین سعید خسروی:
یه ترفند کوچیک ولی مهم توی طراحی رابط کاربری که خیلی وقتا نادیده گرفته میشه 👇
اشتباه رایج: وقتی یه کانتینر (مثلاً یه کارت یا باکس) داخل یه کانتینر بزرگتر قرار میگیره، بعضیها میان و برای هر دو یه border-radius برابر میذارن. نتیجهاش چی میشه؟ گوشههای تیز و ناهماهنگ که حس تمیزی طراحی رو از بین میبره!
راهحل درست: شعاع گوشهی بیرونی باید برابر باشه با شعاع گوشهی داخلی بهعلاوهی فضای خالی (padding) بین اونها.
مثلاً اگه border-radius عنصر داخلی ۱۶ پیکسل باشه و فاصله بین اون و عنصر بیرونی ۸ پیکسل باشه، پس border-radius عنصر بیرونی باید ۲۴ پیکسل باشه.
اینجوری گوشهها دقیقاً هممرکز و تمیز درمیاد و طراحی حرفهایتر دیده میشه.
یه ترفند کوچیک ولی مهم توی طراحی رابط کاربری که خیلی وقتا نادیده گرفته میشه 👇
اشتباه رایج: وقتی یه کانتینر (مثلاً یه کارت یا باکس) داخل یه کانتینر بزرگتر قرار میگیره، بعضیها میان و برای هر دو یه border-radius برابر میذارن. نتیجهاش چی میشه؟ گوشههای تیز و ناهماهنگ که حس تمیزی طراحی رو از بین میبره!
راهحل درست: شعاع گوشهی بیرونی باید برابر باشه با شعاع گوشهی داخلی بهعلاوهی فضای خالی (padding) بین اونها.
مثلاً اگه border-radius عنصر داخلی ۱۶ پیکسل باشه و فاصله بین اون و عنصر بیرونی ۸ پیکسل باشه، پس border-radius عنصر بیرونی باید ۲۴ پیکسل باشه.
اینجوری گوشهها دقیقاً هممرکز و تمیز درمیاد و طراحی حرفهایتر دیده میشه.
👍31✍5❤2
Forwarded from سید فرندز / برنامه نویسی / هک و امنیت / تکنولوژی (Mohammad Khoshnava)
تو این ویس غر زدم به افرادی که مدام میگن مدرن پایتون کد بزنید و تایپینک پیشرفته استفاده کنید و …
حتی میگن جنگو کد نزنید شمارو تنبل میکنه
بابا بیا برو مسخرمون نکن، بزار کارمون روبکنیم پروژه لانچ بشه
یکجور پایتون کد میزنن از cpp پیچیده تر، اه
✅ @MohamadKhoshnava
حتی میگن جنگو کد نزنید شمارو تنبل میکنه
بابا بیا برو مسخرمون نکن، بزار کارمون روبکنیم پروژه لانچ بشه
یکجور پایتون کد میزنن از cpp پیچیده تر، اه
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21👎9
سید فرندز / برنامه نویسی / هک و امنیت / تکنولوژی
Voice message
نمیشه یه جاهایی ش رو بوووق بزارم
ولی نکته قابل تاملی میگه
ولی نکته قابل تاملی میگه
❤2
Forwarded from Learning With M
خیلی ها پرسیدن، تو که ۲۲ سال دات نت کار کردی، چرا الان java و golang و php؟
سوال خوبیه.
اگر ما مهندس نرم افزار هستیم، زبان میشه ابزار توسعه نرم افزار و هرچی باشه مهم نیست.
اگر برنامه نویس دات نت یا هر زبان دیگری هستیم و نمیخواهیم رهاش کنیم، میشیم برنامه نویس اون زبان.
برنامه نویسی ۳۰ الی ۴۰٪ مهندسی نرم افزاره.
نظر شخصیم اینه که : اگر به زبان برنامه نویسی خاصی وابستگی زیادی دارید، احتمالا به زودی AI با هزینه خیلی کمتر از انسان اونو برامون انجام خواهد داد، ولی اگر مهندسیتون رو تقویت کنید، AI قراره ۳۰ الی ۴۰% کارتون رو که همون برنامه نویسی باشه رو راحت تر کنه.
سوال خوبیه.
اگر ما مهندس نرم افزار هستیم، زبان میشه ابزار توسعه نرم افزار و هرچی باشه مهم نیست.
اگر برنامه نویس دات نت یا هر زبان دیگری هستیم و نمیخواهیم رهاش کنیم، میشیم برنامه نویس اون زبان.
برنامه نویسی ۳۰ الی ۴۰٪ مهندسی نرم افزاره.
نظر شخصیم اینه که : اگر به زبان برنامه نویسی خاصی وابستگی زیادی دارید، احتمالا به زودی AI با هزینه خیلی کمتر از انسان اونو برامون انجام خواهد داد، ولی اگر مهندسیتون رو تقویت کنید، AI قراره ۳۰ الی ۴۰% کارتون رو که همون برنامه نویسی باشه رو راحت تر کنه.
👍26❤5👎5👏2🤮1🥱1
اضافه کردن یک CustomValidator به ولیدیتور پسورد در پروژه جنگو
برای فیلد پسورد تعداد کاراکتر مشخص کرده و متن پیغامش هم فارسی نوشته و از دیکشنری و ترجمه کردن استفاده نشده
تشکر از عمو جی پی تی
برای فیلد پسورد تعداد کاراکتر مشخص کرده و متن پیغامش هم فارسی نوشته و از دیکشنری و ترجمه کردن استفاده نشده
تشکر از عمو جی پی تی
👍8❤1
ویو LogoutView از نسخه 5.0 جنگو به بعد فقط ریکوئست از نوع post رو قبول میکنه.
یعنی چی؟
یعنی دیگه با لینک دادن بهش لاگ اوت نمیشیم و خطای 405 می بینیم.
باید با post بفرستیم و csrf_token هم ارسال بشه.
این نمودار سلسله مراتب هم از سایت https://ccbv.co.uk/ گرفتم.
یعنی چی؟
یعنی دیگه با لینک دادن بهش لاگ اوت نمیشیم و خطای 405 می بینیم.
باید با post بفرستیم و csrf_token هم ارسال بشه.
این نمودار سلسله مراتب هم از سایت https://ccbv.co.uk/ گرفتم.
👍19😁5
Forwarded from علی بیگدلی
همدلیدر مسیر یادگیری
از اونجایی که قول داده بودم که با پلتفرم مکتبخونه پیگیر رایگان سازی دوره برای تعداد افراد بیشتری بشم. بالاخره این اتفاق افتاد و الان در طرح بزرگ همدلی مکتبخونه دو دوره جنگو مقدماتی و پیشرفته منو می تونین با ۱۰۰٪ تخفیف تهیه کنین. 😄🌷
باشد که این بار به دست همه نیازمنداش برسه و بتونن از یادگیری غافل نشن.
جنگو مقدماتی:
https://mktb.me/tgk5/
جنگو پیشرفته:
https://mktb.me/vmxs/
۱۰۰ تا دوره محبوب مکتبخونه رایگان شدن
توی حوزه های مختلف از برنامه و نویسی و شبکه و هوش مصنوعی تا مهارت های نرم و زبان و ...
کافیه دوره ها رو توی سبد خریدتون با برداشتن تیک (دوره کامل ) و فقط خرید محتوا اضافه کنین و کد HAMDELI رو وارد کنین و در این صورت می تونین به رایگان از دوره ها استفاده کنین.
از اونجایی که قول داده بودم که با پلتفرم مکتبخونه پیگیر رایگان سازی دوره برای تعداد افراد بیشتری بشم. بالاخره این اتفاق افتاد و الان در طرح بزرگ همدلی مکتبخونه دو دوره جنگو مقدماتی و پیشرفته منو می تونین با ۱۰۰٪ تخفیف تهیه کنین. 😄🌷
باشد که این بار به دست همه نیازمنداش برسه و بتونن از یادگیری غافل نشن.
جنگو مقدماتی:
https://mktb.me/tgk5/
جنگو پیشرفته:
https://mktb.me/vmxs/
۱۰۰ تا دوره محبوب مکتبخونه رایگان شدن
توی حوزه های مختلف از برنامه و نویسی و شبکه و هوش مصنوعی تا مهارت های نرم و زبان و ...
کافیه دوره ها رو توی سبد خریدتون با برداشتن تیک (دوره کامل ) و فقط خرید محتوا اضافه کنین و کد HAMDELI رو وارد کنین و در این صورت می تونین به رایگان از دوره ها استفاده کنین.
❤29👎2👍1
اگر می خواید AI جاتون رو نگیره سعی کنید Requirement Engineering رو یاد بگیرید و بفهمید.
یک کتاب خفن در موردش
Software Requirements Third Edition - Joy Beatty
متن بالا بخشی از یه پست کانال thisisnabi بود 😁
توضیحات chatgpt:
مهندسی نیازمندیها یا Requirement Engineering بخشی از فرآیند توسعه نرمافزار است که به شناسایی، تحلیل، مستندسازی و مدیریت نیازمندیهای سیستم میپردازد. هدف از این علم، اطمینان از این است که نرمافزار در نهایت به نیازها و خواستههای کاربران و ذینفعان پاسخ میدهد.
فرآیند مهندسی نیازمندیها معمولاً شامل مراحل زیر است:
1. شناسایی نیازمندیها**: در این مرحله، نیازمندیهای واقعی سیستم شناسایی میشوند. این کار معمولاً با جمعآوری اطلاعات از ذینفعان، مصاحبهها، کارگاهها و بررسی مستندات موجود انجام میشود.
2. تحلیل نیازمندیها**: نیازمندیها تحلیل و بررسی میشوند تا مشخص شود که آیا آنها قابل فهم، کامل، قابل اندازهگیری و قابل تحقق هستند یا خیر.
3. مستندسازی نیازمندیها**: نیازمندیها باید به شکل مستند و مطابق با استانداردهای مشخصی ثبت شوند تا در آینده بتوان به آنها مراجعه کرد.
4. تایید نیازمندیها**: پس از مستندسازی، نیازمندیها باید توسط ذینفعان تأیید شوند تا از صحت و تناسب آنها اطمینان حاصل شود.
5. مدیریت نیازمندیها**: نیازمندیها باید به طور مداوم مدیریت شوند تا تغییرات و اصلاحات لازم در طول فرآیند توسعه نرمافزار اعمال شوند.
مهندسی نیازمندیها به عنوان یکی از مراحل کلیدی در توسعه نرمافزار شناخته میشود و تأثیر زیادی بر کیفیت پروژه و رضایت مشتری دارد.
یک کتاب خفن در موردش
Software Requirements Third Edition - Joy Beatty
متن بالا بخشی از یه پست کانال thisisnabi بود 😁
توضیحات chatgpt:
مهندسی نیازمندیها یا Requirement Engineering بخشی از فرآیند توسعه نرمافزار است که به شناسایی، تحلیل، مستندسازی و مدیریت نیازمندیهای سیستم میپردازد. هدف از این علم، اطمینان از این است که نرمافزار در نهایت به نیازها و خواستههای کاربران و ذینفعان پاسخ میدهد.
فرآیند مهندسی نیازمندیها معمولاً شامل مراحل زیر است:
1. شناسایی نیازمندیها**: در این مرحله، نیازمندیهای واقعی سیستم شناسایی میشوند. این کار معمولاً با جمعآوری اطلاعات از ذینفعان، مصاحبهها، کارگاهها و بررسی مستندات موجود انجام میشود.
2. تحلیل نیازمندیها**: نیازمندیها تحلیل و بررسی میشوند تا مشخص شود که آیا آنها قابل فهم، کامل، قابل اندازهگیری و قابل تحقق هستند یا خیر.
3. مستندسازی نیازمندیها**: نیازمندیها باید به شکل مستند و مطابق با استانداردهای مشخصی ثبت شوند تا در آینده بتوان به آنها مراجعه کرد.
4. تایید نیازمندیها**: پس از مستندسازی، نیازمندیها باید توسط ذینفعان تأیید شوند تا از صحت و تناسب آنها اطمینان حاصل شود.
5. مدیریت نیازمندیها**: نیازمندیها باید به طور مداوم مدیریت شوند تا تغییرات و اصلاحات لازم در طول فرآیند توسعه نرمافزار اعمال شوند.
مهندسی نیازمندیها به عنوان یکی از مراحل کلیدی در توسعه نرمافزار شناخته میشود و تأثیر زیادی بر کیفیت پروژه و رضایت مشتری دارد.
✍10❤7👍4👎1👏1
Forwarded from Python BackendHub (Mani)
از کانال های مختلف دیدم پست میذارن که بله تایپینگ کد شما رو بیشتر میکنه کثیف تر میکنه اگه میخواستیم تایپ بزنیم که میرفتیم سمت C و این حرفا. اولا که C تایپ سیستم قوی نداره. تایپ سیستم بسیار ساده ای داره. پس statically typed بودن یا نبودن یک زبون رو خوب/بد بودن تایپ سیستمش تاثیری نمیذاره. پس اگه انتخابتون C هست برای اینکه تایپ سیستم قوی داشته باشین انتخاب درستی نیست!
ثانیا تایپینگ خودش یک داکیومنته. مثلا شما فکر کنید من یک سیستم نوشتم که ۱۰ تاسیستم مختلف رو integrate میکنه و یک API واحد میده برای هر ۱۰ تاشون. من یا میتونم ۱۰ صفحه داکیومنت بنویسم که اگه خواستیم یک سیستم جدید اضافه کنیم چه دپندسی هایی وجود داره یا اینکه میتونم یک Enum داشته باشم به اسم
مثالش, من اینجا فقط یک سرویس Digikala دارم. و برای دیجی کالا یک رفتاری رو تعریف کردم و چک کردم سرویسی نباشه که این رفتار براش تعریف نشده باشه (`assert_never`)
وقتی من یک سرویس جدید اضافه کنم به Enum ام اگه من کد رو کمپایل کنم یا تایپ چکر رو کد ران کنم و کدم کمپایل شه, کلی ارور تایپینگ میبینم که میگه شما این دپندنسی رو تعریف نکردی. مثل همین فانکشن. اون موقع به محض اینکه من تمام ایرادات تایپینگ رو برطرف کنم PRام تموم شده.
کد خواناییشو از دست میده؟ نه واقعا!شما اگه خوانایی کد رو به تعداد خط ملاک قرار میدین, پس کد ننویسید که خیلی خوانا و تمیز باشه. کد خوانا یعنی من کدی رو بخونم و بفهمم چیکار میکنه و constraint های اون کد چیه و تو موقع استفاده ازش اشتباه نکنم.
یک مثال دیگه بازم تو پست بعدی میزنم
@PyBackendHub
ثانیا تایپینگ خودش یک داکیومنته. مثلا شما فکر کنید من یک سیستم نوشتم که ۱۰ تاسیستم مختلف رو integrate میکنه و یک API واحد میده برای هر ۱۰ تاشون. من یا میتونم ۱۰ صفحه داکیومنت بنویسم که اگه خواستیم یک سیستم جدید اضافه کنیم چه دپندسی هایی وجود داره یا اینکه میتونم یک Enum داشته باشم به اسم
Service
و همه جا با اون Enum بیام exhaustive check انجام بدم.مثالش, من اینجا فقط یک سرویس Digikala دارم. و برای دیجی کالا یک رفتاری رو تعریف کردم و چک کردم سرویسی نباشه که این رفتار براش تعریف نشده باشه (`assert_never`)
def do_foo(service: Service):
match service:
case Service.DIGI_KALA: ...
case _: assert_never(service)
وقتی من یک سرویس جدید اضافه کنم به Enum ام اگه من کد رو کمپایل کنم یا تایپ چکر رو کد ران کنم و کدم کمپایل شه, کلی ارور تایپینگ میبینم که میگه شما این دپندنسی رو تعریف نکردی. مثل همین فانکشن. اون موقع به محض اینکه من تمام ایرادات تایپینگ رو برطرف کنم PRام تموم شده.
کد خواناییشو از دست میده؟ نه واقعا!شما اگه خوانایی کد رو به تعداد خط ملاک قرار میدین, پس کد ننویسید که خیلی خوانا و تمیز باشه. کد خوانا یعنی من کدی رو بخونم و بفهمم چیکار میکنه و constraint های اون کد چیه و تو موقع استفاده ازش اشتباه نکنم.
یک مثال دیگه بازم تو پست بعدی میزنم
@PyBackendHub
❤7👍1👎1
سید فرندز / برنامه نویسی / هک و امنیت / تکنولوژی
Voice message
فکر نکنید پست قبلی به این جواب داده
👎3❤2😁2
داشتم یه مدل میساختم که باید برای یه فیلدش چند مقدار مشخص تعریف میکردم.
طبق عادت قدیمی، رفتم یه لیست (value, label) بسازم… ولی وسط کار چشمم افتاد به models.TextChoices
گفتم خب، یه بار امتحانش کنم… و از همون لحظه فهمیدم این بهترین راهه برای تعریف choice field تو Django
مزیتهاش چیه؟
به جای "info" میگی Level.INFO → هم امنتره، هم IDE بهت autocomplete میده.
مقدار دیتابیس و برچسب نمایشی رو با هم داری.
میتونی با obj.get_level_display() اسم قابل نمایش رو بگیری.
کد ساختاریافته تره
وقتی میشه کد تمیزتر و قابل نگهداریتری داشت، چرا هنوز با استرینگ خام کار کنیم؟ 😉
از لینکدین شایان حسین زاده
طبق عادت قدیمی، رفتم یه لیست (value, label) بسازم… ولی وسط کار چشمم افتاد به models.TextChoices
گفتم خب، یه بار امتحانش کنم… و از همون لحظه فهمیدم این بهترین راهه برای تعریف choice field تو Django
مزیتهاش چیه؟
به جای "info" میگی Level.INFO → هم امنتره، هم IDE بهت autocomplete میده.
مقدار دیتابیس و برچسب نمایشی رو با هم داری.
میتونی با obj.get_level_display() اسم قابل نمایش رو بگیری.
کد ساختاریافته تره
وقتی میشه کد تمیزتر و قابل نگهداریتری داشت، چرا هنوز با استرینگ خام کار کنیم؟ 😉
از لینکدین شایان حسین زاده
👍13❤3👎1
چرا جنگو رو یاد گرفتی؟
Final Results
11%
باهاش کارمند بشم
19%
پروژه های فریلنسری باهاش انجام بدم
28%
هم فریلنسری هم کارمندی
15%
از سر بیکاری
28%
یه اشتباهی بود کردیم دیگه
19%
موارد دیگه
😁19👎1
امنیت پایدارتر با یک چرخش ساده! 😎
✅ اگه با JWT کار کرده باشی، میدونی که ما یک access token و یک refresh token داریم
✅ اکسس توکن ما که خب عمرش کوتاهه مثلا بعد 10 دقیقه باطل میشه و از طریق رفرش توکن که عمرش بلندتره(مثلا 7 روز) باید یک اکسس توکن و رفرش توکن جدید از سرور درخواست کنیم
🤨 حالا یک مسعله ای هست این وسط ؟!
رفرش توکن شما نباید اینطوری باشه که توی اون 7 روز هربار که ازش استفاده کردی فرت و فرت بهت اکسس توکن بده.
😈 اینطوری اگه هکر عزیز بنا به هر علتی به اون رفرش توکن دسترسی پیدا کنه توی اون 7 روز هزاربار میتونه token بگیره و عشق و حال کنه
☝🏻اینجا دوتا مفهوم داریم به اسم rotate refresh token
و revoke refresh token که خیلی شبیه هم هستن(با فرق کوچولو)
✅ Rotate Token
یعنی هر بار که کاربر از Refresh Token استفاده کرد، یه Access Token جدید و یه Refresh Token جدید صادر میکنیم.
توی این حالت، Refresh Token قبلی دیگه نباید قابل استفاده باشه
اینجوریه که میگه: تو بیا رفرش توکن رو توی یک جایی مثلا ردیس یا هرچی، ذخیره کن و وقتی کاربر از اون رفرش توکن استفاده کرد قبلی رو حذف کن و جدیده رو بزار جاش تا یکبار بیشتر نتونه استفاده کنه
✅ Revoke Token
یعنی بیاعتبار کردن یک توکن قبل از اینکه تاریخ انقضاش برسه(با expire طبیعی توکن اشتباه نگیری). مثلا وقتی کاربر logout میکنه یا Refresh Token جدید گرفته، Refresh Token قبلی رو revoke میکنیم.
✅ در واقع میشه یه جورایی گفت :
اRotate یعنی "توکن جدید بده و قبلی رو کنار بذار"
اRevoke یعنی "توکن فعلی رو از کار بنداز"
این لینک زیر هم خیلی مفصل تر توضیح داده
https://auth0.com/docs/secure/tokens/refresh-tokens/refresh-token-rotation
از تلگرام @LearnByLearn
✅ اگه با JWT کار کرده باشی، میدونی که ما یک access token و یک refresh token داریم
✅ اکسس توکن ما که خب عمرش کوتاهه مثلا بعد 10 دقیقه باطل میشه و از طریق رفرش توکن که عمرش بلندتره(مثلا 7 روز) باید یک اکسس توکن و رفرش توکن جدید از سرور درخواست کنیم
🤨 حالا یک مسعله ای هست این وسط ؟!
رفرش توکن شما نباید اینطوری باشه که توی اون 7 روز هربار که ازش استفاده کردی فرت و فرت بهت اکسس توکن بده.
😈 اینطوری اگه هکر عزیز بنا به هر علتی به اون رفرش توکن دسترسی پیدا کنه توی اون 7 روز هزاربار میتونه token بگیره و عشق و حال کنه
☝🏻اینجا دوتا مفهوم داریم به اسم rotate refresh token
و revoke refresh token که خیلی شبیه هم هستن(با فرق کوچولو)
✅ Rotate Token
یعنی هر بار که کاربر از Refresh Token استفاده کرد، یه Access Token جدید و یه Refresh Token جدید صادر میکنیم.
توی این حالت، Refresh Token قبلی دیگه نباید قابل استفاده باشه
اینجوریه که میگه: تو بیا رفرش توکن رو توی یک جایی مثلا ردیس یا هرچی، ذخیره کن و وقتی کاربر از اون رفرش توکن استفاده کرد قبلی رو حذف کن و جدیده رو بزار جاش تا یکبار بیشتر نتونه استفاده کنه
✅ Revoke Token
یعنی بیاعتبار کردن یک توکن قبل از اینکه تاریخ انقضاش برسه(با expire طبیعی توکن اشتباه نگیری). مثلا وقتی کاربر logout میکنه یا Refresh Token جدید گرفته، Refresh Token قبلی رو revoke میکنیم.
✅ در واقع میشه یه جورایی گفت :
اRotate یعنی "توکن جدید بده و قبلی رو کنار بذار"
اRevoke یعنی "توکن فعلی رو از کار بنداز"
این لینک زیر هم خیلی مفصل تر توضیح داده
https://auth0.com/docs/secure/tokens/refresh-tokens/refresh-token-rotation
از تلگرام @LearnByLearn
✍18❤7👍6👏2🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
وقتی یه نفر میگه: تو که کارت راحته، فقط نشستی پشت میز پای لپتاپ 😁😅
👍10😁4👎1
✅ هندل کردن Open Redirect Attack توی جنگو با RedirectURLMixin
این Open Redirect Attack چیه؟ کلمه این رو گذاشتم اولش راست چین بشه 😁
وقتی شما کاربر رو به URL بیرونی ریدایرکت میکنید بدون بررسی، یه attacker میتونه ازش سوء استفاده کنه:
https://yoursite.com/login/?next=https://hack.com
کاربر فکر میکنه داره به سایت شما میره، ولی بعد از login به سایت مهاجم هدایت میشه. این میتونه phishing یا سرقت اطلاعات session کاربر رو ممکن کنه. (من بلد نیستم چطوری میتونه، خودتون سرچ کنید)
میکسین ع RedirectURLMixin توی جنگو (django.contrib.auth.views) جلوی این حرکت رو می گیره. (یکی از کارهاش اینه)
چی کار میکنه؟
با میکسین ع RedirectURLMixin می تونیم بررسی کنیم که این URL جزو hostهای مجاز هست.
یه مثال ساده براش:
اون get_redirect_url یکی از متدهای این میکسین ع
حالا من اگه آدرس رو اینجوری بدم:
https://127.0.0.1:8000/profiles/aaa/?next=https://djangolearn.ir/
ریدارکت میشه به صفحه اصلی سایت خودتون نه سایت جنگولرن 😁
راستی از نسخه 4.1 به بعد این میکسین جایگزین SuccessURLAllowedHostsMixin شده:
The undocumented django.contrib.auth.views.SuccessURLAllowedHostsMixin mixin is replaced by RedirectURLMixin.
لایک نداشت این پست؟
این Open Redirect Attack چیه؟ کلمه این رو گذاشتم اولش راست چین بشه 😁
وقتی شما کاربر رو به URL بیرونی ریدایرکت میکنید بدون بررسی، یه attacker میتونه ازش سوء استفاده کنه:
https://yoursite.com/login/?next=https://hack.com
کاربر فکر میکنه داره به سایت شما میره، ولی بعد از login به سایت مهاجم هدایت میشه. این میتونه phishing یا سرقت اطلاعات session کاربر رو ممکن کنه. (من بلد نیستم چطوری میتونه، خودتون سرچ کنید)
میکسین ع RedirectURLMixin توی جنگو (django.contrib.auth.views) جلوی این حرکت رو می گیره. (یکی از کارهاش اینه)
چی کار میکنه؟
با میکسین ع RedirectURLMixin می تونیم بررسی کنیم که این URL جزو hostهای مجاز هست.
یه مثال ساده براش:
class AAA(RedirectURLMixin, View):
redirect_field_name = "next"
def get(self, request, *args, **kwargs):
url = self.get_redirect_url()
if url:
return redirect(url)
return redirect("/")
اون get_redirect_url یکی از متدهای این میکسین ع
حالا من اگه آدرس رو اینجوری بدم:
https://127.0.0.1:8000/profiles/aaa/?next=https://djangolearn.ir/
ریدارکت میشه به صفحه اصلی سایت خودتون نه سایت جنگولرن 😁
راستی از نسخه 4.1 به بعد این میکسین جایگزین SuccessURLAllowedHostsMixin شده:
The undocumented django.contrib.auth.views.SuccessURLAllowedHostsMixin mixin is replaced by RedirectURLMixin.
لایک نداشت این پست؟
❤32👍11😁1
سوال:
شما اسلایدر برای سایت تون چطوری می سازید؟
این پیشنهاد chatgpt بود:
اگه میخوای اسلایدرت خیلی انعطافپذیر باشه، میتونی از GenericForeignKey استفاده کنی که به هر مدل وصل بشه (محصول، مقاله، دستهبندی و …).
مزایا:
نهایت انعطافپذیری: میتونی هر چیزی رو توی اسلایدر بذاری.
آیندهنگر و تمیز.
معایب:
کار باهاش پیچیدهتره.
برای خیلی از پروژههای معمولی زیادی Over-Engineering محسوب میشه.
شما اسلایدر برای سایت تون چطوری می سازید؟
این پیشنهاد chatgpt بود:
اگه میخوای اسلایدرت خیلی انعطافپذیر باشه، میتونی از GenericForeignKey استفاده کنی که به هر مدل وصل بشه (محصول، مقاله، دستهبندی و …).
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
class Slider(models.Model):
title = models.CharField(max_length=255, blank=True)
image = models.ImageField(upload_to="sliders/")
url = models.URLField(blank=True, null=True)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, null=True, blank=True)
object_id = models.PositiveIntegerField(null=True, blank=True)
content_object = GenericForeignKey('content_type', 'object_id')
order = models.PositiveIntegerField(default=0)
is_active = models.BooleanField(default=True)
مزایا:
نهایت انعطافپذیری: میتونی هر چیزی رو توی اسلایدر بذاری.
آیندهنگر و تمیز.
معایب:
کار باهاش پیچیدهتره.
برای خیلی از پروژههای معمولی زیادی Over-Engineering محسوب میشه.
❤9👍1🤔1