رشته های الگو در پایتون
یکی دیگر از تکنیکهای قالببندی رشته در پایتون، Template است موارد ممکن است دقیقاً همان چیزی باشد که شما به دنبال آن هستید. بیایید نگاهی به یک مثال ساده تبریک بیاندازیم:>>> from string import Template رشته های. این مکانیسم سادهتر و کمتوانتر است، اما در برخی >>> t.substitute(name=name) >>> t = Template(‘Hey, $name!’) ‘Hey, Bob!’در اینجا مشاهده می کنید که باید کلاس Template را از پایتون وارد کنیم ماژول رشته داخلی رشته های الگو یک ویژگی زبان اصلی نیستند اما توسط یک ماژول در کتابخانه استاندارد عرضه می شوند. تفاوت دیگر این است که رشته های قالب اجازه فرمت های مشخص را نمی دهند. بنابراین برای اینکه مثال رشته خطای ما کار کند، باید این کار را انجام دهیم شماره خطای int خود را به یک رشته هگزا تبدیل کنیم:>>> templ_string = ‘Hey $name, there is a $error error!’ … name=name, error=hex(errno)) >>> Template(templ_string).substitute( ‘Hey Bob, there is a 0xbadc0ffee error!’این عالی کار کرد اما احتمالاً از خود میپرسید که چه زمانی از رشتههای صفحه قالب در برنامههای پایتون خود استفاده میکنید. به نظر من بهترین استفاده مورد رشتههای قالب زمانی است که شما رشتههای قالب تولید شده توسط کاربران برنامه خود را مدیریت میکنید. به دلیل کاهش پیچیدگی آنها، مینی زبانهای قالببندی پیچیدهتر سایر تکنیکهای قالببندی رشتهای ممکن است آسیبپذیریهای امنیتی را به برنامههای شما وارد کند. برای مثال، امکان دسترسی دلخواه به رشتههای قالببندی وجود دارد متغیرهای برنامه شما رشته های قالب انتخاب مطمئن تری هستند. این بدان معناست که اگر یک کاربر مخرب بتواند رشته فرمت را ارائه دهد، می تواند همچنین به طور بالقوه کلیدهای مخفی و سایر اطلاعات معقول را فاش می کند! در اینجا یک اثبات ساده از مفهوم نحوه استفاده از این حمله وجود دارد:>>> class Error: >>> SECRET = ‘this-is-a-secret’ … def __init__(self): >>> err = Error() … pass >>> user_input = ‘{error.__init__.__globals__[SECRET]}’ >>> user_input.format(error=err) # Uh-oh… ‘this-is-a-secret’ببینید مهاجم فرضی چگونه توانست رشته مخفی ما را استخراج کند ترسناکه، ها! رشته های الگو این بردار حمله را می بندند و این باعث می شود اگر از رشته های فرمت تولید شده استفاده می کنید، آنها انتخاب مطمئن تری هستند ورودی کاربر:>>> user_input = ‘${error.__init__.__globals__[SECRET]}’ >>> Template(user_input).substitute(error=err) با دسترسی به فرهنگ لغت globals از رشته قالب؟ “Invalid placeholder in string: line 1, col 1″از کدام روش قالب بندی رشته ای استفاده کنم؟ ValueError: من کاملاً دریافتم که انتخاب زیادی برای نحوه قالب بندی رشته های خود دارم در پایتون می تواند بسیار گیج کننده باشد. این زمان خوبی برای شکستن خواهد بود اما من این کار را نمی کنم. در عوض، من سعی خواهم کرد آن را به صورت خلاصه کنم قانون سرانگشتی ساده ای که هنگام نوشتن پایتون به کار می برم. در اینجا میرویم—شما میتوانید هر زمان که دارید از این قانون کلی استفاده کنید دشواری در تصمیم گیری بسته به اینکه از کدام روش قالب بندی رشته استفاده شود در مورد شرایط: قانون شست قالب بندی رشته پایتون Dan: تعدادی اینفوگرافیک فلوچارت… اگر رشته های قالب شما توسط کاربر ارائه شده است، از Template استفاده کنید رشته هایی برای جلوگیری از مسائل امنیتی در غیر این صورت از Literal استفاده کنید اگر از پایتون 3.6+ استفاده می کنید، درون یابی رشته ای و «جدید Style” قالب بندی رشته ای اگر نیستید.
قوانین ارسال دیدگاه در سایت