Forwarded from 🧑💻PythonDev🧑💻
وقتی صحبت از ارسال و دریافت دیتا میشود یکی از مواردی از همون ابتدا به ذهن میرسه انتخاب
درست هست؛ اگر توسعه دهنده وب باشید قطعا همون اول یاد
میوفتید (امن و مناسب) اما گزینههای دیگری هم هست که توی پروژههای مختلف استفاده میشه مثل
مشکل اصلی که با
بصورت دیفالت
اما مشکل اینجاس که
تصویر پیوست شده؛ اگر قرار هست از
GitHub issues
Serializer درست هست؛ اگر توسعه دهنده وب باشید قطعا همون اول یاد
JSON میوفتید (امن و مناسب) اما گزینههای دیگری هم هست که توی پروژههای مختلف استفاده میشه مثل
YAML
که بیشتر دوستان DevOps کار یا برنامهنویسهای اون سمت باهاش کار میکنند؛ و یا مثلا: Pickle
که توی AI و DataScience خیلی طرفدار داره متاسفانه (استفادهاش توی تیم من ممنوع هست)مشکل اصلی که با
YAML, Pickle وجود داره بخصوص Pickle امنیت هست.بصورت دیفالت
YAML, Pickle وقتی باهاش Serialized Data
رو باز میکنید اگر حاوی دستورات سیستمی هم باشه اونهارو بصورت کامل اجرا میکنه برای همین هست که توی PyYaml وقتی کدی قرار هست برای Production استفاده بشه باید از yaml.safe_load
استفاده کنید.اما مشکل اینجاس که
safe_load کلاسهای کاستوم رو نمیشناسه راه حل :تصویر پیوست شده؛ اگر قرار هست از
YAML توی پروژه استفاده کنید حتما از safe_loader استفاده کنید load, full_loader , ... امن نیست و این مورد یک باگ کاملا شناخته شده هست.GitHub issues
Forwarded from 🧑💻PythonDev🧑💻
یک نمونه exploit خیلی ساده برای تست؛ سورس کد رو گذاشتم که خودتون اجرا کنید و مطمئن باشید امن هست.
اما بجای
هیچوقت هیچ فایل
اما بجای
ls میشد هرکار دیگری هم کرد یا خوندن passwd میشد خیلی کارهای دیگهای کرد.هیچوقت هیچ فایل
Pickle ایی رو از کسی قبول نکنید اگر قبول کردید روی سیستم اجرا نکنید.Forwarded from 🧑💻PythonDev🧑💻
این کد که احتمالاً بسیار هم میبینید و استفاده میکنید
۲ تا باگ داره، که ۱ مورد میتونه حتی شمارو توی مصاحبه رد کنه
میتونید باگهارو پیدا کنید ؟
۲ تا باگ داره، که ۱ مورد میتونه حتی شمارو توی مصاحبه رد کنه
میتونید باگهارو پیدا کنید ؟
Forwarded from 🧑💻PythonDev🧑💻
🧑💻PythonDev🧑💻
این کد که احتمالاً بسیار هم میبینید و استفاده میکنید ۲ تا باگ داره، که ۱ مورد میتونه حتی شمارو توی مصاحبه رد کنه میتونید باگهارو پیدا کنید ؟
اول راجب خود
نحوه نمایش پارامترهای ورودی هست که مشخص نیست از چه تایپی هست و شما نمیتونید با کپی کردن خروجی یک object جدید بسازید که خب خود
پس برای رفع این باگ کاری که باید بکنید استفاده از :
repr
بگم برای دوستان تازهکار، در صورتیکه وجود نداشته باشه توی خط 11 و بعد از اجرای کد چیزی که برای شما توی کنسول نمایش داده میشه آدرس حافظه اون object هست مثلاً: <main.Person object at 0x7f894c576650>
که خب اصلا چیز خوبی نیست، به لطفrepr
شما میتونید خروجی بهتری داشته باشید مثلاً توی این تصویر خروجی بصورت زیر هست : Person(name=Mo Abbasi, age=60)
حالا بریم سراغ باگها؛ باگ اول که خب سادهتر هست :نحوه نمایش پارامترهای ورودی هست که مشخص نیست از چه تایپی هست و شما نمیتونید با کپی کردن خروجی یک object جدید بسازید که خب خود
repr رو میبره زیر سوالMo Abbasi
استرینگ نیست اینجا.پس برای رفع این باگ کاری که باید بکنید استفاده از :
!r
هست ینی خط 7 میشه: return f"Person(name={self.name!r}, age={self.age!r})"
اگر تا به حال اینطوری تعریف نمیکردید، تعریف repr شما طبق استاندارد نبوده.