<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های shayeste_farhadi</title><link>https://virgool.ir/feed/@shayeste_farhadi</link><description></description><language>fa</language><pubDate>2026-11-12 10:52:38</pubDate><image><url>https://virgool.ir/images/default-avatar.jpg</url><title>shayeste_farhadi</title><link>https://virgool.ir/@shayeste_farhadi</link></image><item><title>10 تا از جدید ترین و پرطرفدارترین حملات در وب</title><link>https://virgool.ir/@shayeste_farhadi/10-تا-از-جدید-ترین-و-پرطرفدارترین-حملات-در-وب-itaafgeznrpv</link><description>حملات زیادی در وب وجود دارد که در این مقاله قرار است به 10 تا از پرطرفدارترین و جدید ترین آن ها که در سال 2019 گزارش شده اند بپردازیم.حمله ی اول: Broken Authentication and Session Managementاین زمینه شامل کلیه جنبه های رسیدگی به احراز هویت کاربر و مدیریت نشست های فعال می باشد. احراز هویت جنبه اساسی این فرایند است ، اما حتی مکانیسم های تأیید اعتبار قوی می توانند توسط عملکردهای معتبر مدیریت اعتبار ، از جمله تغییر گذرواژه ، رمز عبورم را فراموش کرده ام ، رمز عبور من ، به روزرسانی حساب و سایر عملکردهای مرتبط را تضعیف کنند. از آنجا که حملات &#34;walk by&#34; برای بسیاری از برنامه های وب احتمالاً وجود دارد ، باید تمام عملکردهای مدیریت حساب نیاز به تأیید اعتبار مجدد داشته باشند حتی اگر کاربر شناسه نشست معتبری داشته باشد.تأیید هویت کاربر در وب به طور معمول شامل استفاده از یک userid و رمز عبور است. روش های قوی تر تأیید اعتبار بصورت تجاری از جمله نرم افزارها و نشانه های رمزنگاری مبتنی بر سخت افزار یا بیومتریک موجود است ، اما چنین مکانیزم هایی برای اکثر برنامه های وب هزینه برانگیز است. طیف گسترده ای از نقص های مدیریت حساب و نشست می تواند منجر به اختلال حسابهای کاربری یا سیستم مدیریت شود. تیم های توسعه غالباً پیچیدگی های طراحی یک برنامه تأیید اعتبار و نشست مدیریت را که به اندازه کافی از اعتبار در تمام ابعاد سایت محافظت می کند ، دست کم می گیرند. برنامه های وب برای پیگیری جریان درخواست های هر کاربر باید نشست هایی ایجاد کنند. HTTP این قابلیت را ارائه نمی دهد ، بنابراین برنامه های وب باید خود آن را ایجاد کنند. بیشتر اوقات ، محیط برنامه وب امکان ساخت token های نشست را فراهم می کند ، اما بسیاری از توسعه دهندگان ترجیح می دهند آن را خود ایجاد کنند. در هر صورت ، اگر token های نشست به درستی محافظت نشوند ، یک مهاجم می تواند یک نشست فعال را ربوده و هویت کاربر را در دست بگیرد. ایجاد یک طرح برای ایجاد token های قوی نشست و محافظت از آنها در طول چرخه عمر خود ، برای بسیاری از توسعه دهندگان گریزان بوده است. مگر اینکه اعتبارنامه تأیید اعتبار و شناسه نشست ها در هر زمان با SSL محافظت شود.راه های جلوگیری از این حمله: محدودیت رمز عبور-کلمه عبور باید محدودیت هایی داشته باشد که حداقل به اندازه و پیچیدگی لازم برای رمز عبور نیاز داشته باشد. پیچیدگی به طور معمول نیاز به استفاده از حداقل ترکیبات حروف الفبا ، عددی و یا غیر الفبایی در رمزعبور کاربر (برای مثال حداقل یکی از آنها) دارد. کاربران باید ملزم به تغییر رمز عبور خود باشند. از استفاده مجدد از رمزهای عبور قبلی باید جلوگیری شود.استفاده از رمز عبور - کاربران باید به تعداد مشخصی از تلاشهای ورود به سیستم در هر واحد محدود شوند و تلاشهای مكرر ورود به سیستم باید بررسی شوند. گذرواژه‌های ارائه شده در حین تلاش برای ورود به سیستم ناموفق نباید ثبت شوند ، زیرا این امر ممکن است رمز عبور کاربر را برای هر کسی که بتواند به این ورود دسترسی پیدا کند ، قرار دهد. در صورت عدم موفقیت یک ورود به سیستم ، سیستم نباید نشان دهد که آیا نام کاربری یا رمز عبور اشتباه بوده است. کاربران باید از تاریخ / زمان آخرین ورود موفق خود و تعداد تلاشهای دسترسی ناموفق به حساب خود از آن زمان مطلع شوند.کنترل تغییر رمز عبور - یک مکانیزم تغییر رمز عبور باید در هر جایی که کاربران مجاز به تغییر رمزعبور باشند ، صرف نظر از شرایط ، مورد استفاده قرار گیرد. کاربران همیشه باید هنگام تغییر رمز عبور خود (مانند همه اطلاعات حساب) رمزعبور قدیمی و جدید خود را ارائه دهند. اگر گذرواژه‌های فراموش شده به کاربران ایمیل شود ، سیستم باید از کاربر درخواست کند که هر زمان کاربر آدرس ایمیل خود را تغییر داد ، مجدداً تأیید اعتبار کند ، در غیر این صورت مهاجمی که به طور موقت به جلسه خود دسترسی دارد به سادگی می توانید آدرس پست الکترونیکی خود را تغییر داده و درخواست کنید یک رمز عبور &#34;فراموش شده&#34; برای آنها ارسال شود.ذخیره سازی گذرواژه - تمام رمزهای عبور باید به صورت هش شده یا رمزگذاری شده ذخیره شوند تا از قرار گرفتن در معرض حمله کننده ها ، بدون در نظر گرفتن محل نگهداری آنها ، محافظت شوند. فرم Hash شده ترجیح داده می شود زیرا برگشت پذیر نیست.  گذرواژه‌ها را هرگز نباید در هیچ source code کدگذاری کنید. key های رمزگشایی باید به شدت محافظت شوند تا اطمینان حاصل شود که نمی توان آنها را گرفت و از رمزگشایی رمز عبور استفاده کرد.محافظت از اعتبار در انتقال - تنها تکنیک مؤثر رمزگذاری کل تراکنش ورود به سیستم با استفاده از چیزی مانند SSL است. روش هایی مانند هشدار دادن به client قبل از انتقال ، امنیت کمی دارند زیرا نسخه hash شده به سادگی قابل رهگیری و ارسال مجدد است حتی اگر رمز عبور واقعی متن مشخص نباشد.لیست حساب ها- سیستم ها باید طوری طراحی شوند که از دسترسی کاربران به لیستی از نام های حساب در سایت جلوگیری کند. اگر لیست های کاربران ارائه می شود ، توصیه می شود به جای آن ، نوعی نام مستعار (نام صفحه) که به حساب واقعی اشاره می کند، وارد شود. به این ترتیب ، نمی توان از نام مستعار در طی تلاش برای ورود به سیستم یا هک دیگری استفاده کرد.حمله ی دوم: حملات Broken Access Controlکنترل دسترسی ، که گاهی اوقات به عنوان مجوز خوانده می شود ، به این صورت است که یک برنامه وب دسترسی به محتوا و کارکردهای برخی کاربران و نه همه را اعطا می کند. این بررسی ها پس از تأیید اعتبار انجام می شود و آنچه را که کاربران مجاز به انجام آن هستند انجام می دهد. کنترل دسترسی به نظر می رسد مانند یک مشکل ساده است ، اما اجرای صحیح آن بسیار دشوار است.توسعه دهندگان غالباً دشوار بودن اجرای مکانیسم کنترل قابل اعتماد دسترسی را دست کم می گیرند. بسیاری از این طرح ها عمداً طراحی نشده اند ، اما به سادگی در کنار وب سایت تکامل یافته اند. در این موارد ، قوانین کنترل دسترسی در نقاط مختلف در سراسر کد درج شده است. با نزدیک شدن سایت به تاسیس ، مجموعه قوانین آن آنقدر بی پروا می شود که درک آن تقریبا غیرممکن است.کشف بسیاری از این طرح های کنترل دسترسی دشوار نیست. غالباً ، همه آنچه لازم است این است که لیست توابعی را که عملکرها و یا محتواهایی که مفروض نیستند را شامل می شود، تهیه کنید. پس از کشف نقص ، عواقب یک طرح کنترل دسترسی ناقص می تواند ویران کننده باشد. علاوه بر مشاهده محتوای غیرمجاز ، یک مهاجم می تواند محتوا را تغییر داده یا حذف کند ، عملکردهای غیرمجاز را انجام دهد یا حتی مدیریت سایت را نیز به عهده بگیرد.یک نوع خاص از مشکل کنترل دسترسی رابط های اداری است که به مدیران سایت اجازه می دهد یک سایت را از طریق اینترنت مدیریت کنند. چنین ویژگی هایی اغلب استفاده می شود تا به مدیران سایت اجازه دهند تا کاربران ، داده ها و محتوا را در سایت خود مدیریت کنند. در بسیاری از موارد ، سایتها از نقشهای مختلف مدیریتی پشتیبانی می كنند تا کارهای مدیریت سایت را دقیق تر انجام دهند. با توجه به قدرت آنها ، این واسط ها اغلب اهداف اصلی حمله توسط افراد خارجی و خودی هستند.مهمترین مرحله این است که به طریق الزامات کنترل دسترسی یک برنامه فکر کنید و آن را در یک خط مشی امنیتی برنامه وب در نظر بگیرید. به شدت استفاده از ماتریس کنترل دسترسی  برای تعریف قوانین کنترل دسترسی توصیه می شود. بدون مستند کردن خط مشی امنیتی ، تعریفی از امنیت آن سایت برای شما مشخص نشده است. این خط مشی باید مشخص کند که چه نوع از کاربران می توانند به سیستم دسترسی پیدا کنند ، و دسترسی به چه نوع کاربری و محتوایی به هر یک از این نوع کاربران امکان پذیر است. مکانیسم کنترل دسترسی باید به طور گسترده آزمایش شود تا اطمینان حاصل شود که هیچ راهی برای دور زدن آن وجود ندارد. این آزمایش نیاز به چندین حساب متفاوت و تلاش گسترده برای دسترسی به مطالب یا کارکردهای غیرمجاز دارد.برخی از موارد کنترل دسترسی  شامل موارد زیر است:شناسه های ناامن - بیشتر وب سایت ها از نوعی شناسه ، کلید یا فهرست به عنوان روشی برای استفاده کاربران ، نقش ها ، محتوا ، اشیاء یا عملکردها استفاده می کنند. اگر یک مهاجم بتواند این شناسه ها را حدس بزند ، و اگر کاربر مقادیر را وارد نماید و اطمینان از مجاز بودن کاربر فعلی ، تأیید نشود ، مهاجم می تواند طرح کنترل دسترسی را آزادانه اعمال کند تا ببیند به چه چیزی می تواند دسترسی پیدا کند. برنامه های وب نباید به محرمانه بودن هر شناسه برای محافظت اعتماد کنند.بررسی های اجباری کنترل دسترسی گذشته - بسیاری از سایت ها قبل از دسترسی به URL های خاص که معمولاً در عمق سایت قرار دارند ، به برخی کاربران نیاز دارند تا چک های خاصی را انجام دهند. این بررسی ها نباید توسط کاربرانی انجام شود كه با بررسی امنیتی به سادگی از صفحه عبور كرده اند.Path Traversal - این حمله شامل ارائه اطلاعات مربوط به مسیر (به عنوان مثال ، &#34;../../target_dir/target_file&#34;) به عنوان بخشی از درخواست اطلاعات است. چنین حملاتی سعی می کند به پرونده هایی دسترسی پیدا کند که به طور عادی توسط کسی قابل دسترسی نیست ، یا در صورت درخواست مستقیم رد می شود. چنین حملاتی را می توان به آدرس های اینترنتی و همچنین هر ورودی دیگری که در نهایت به یک فایل دسترسی پیدا کنید (به عنوان مثال ، تماس های سیستم و دستورات پوسته) ارسال کرد.مجوزهای فایل- بسیاری از سرورهای وب و برنامه ها به لیست های کنترل دسترسی ارائه شده توسط سیستم فایل سیستم عامل اصلی تکیه می کنند. حتی اگر تقریباً تمام داده ها روی سرورهای باطن ذخیره شده باشد ، همیشه فایلهایی که بصورت محلی در وب سرور و برنامه ها ذخیره می شوند وجود ندارد که نباید در دسترس عموم باشند ، به خصوص فایل های پیکربندی ، پرونده های پیش فرض و اسکریپت هایی که در اکثر وب سرورها و برنامه ها نصب شده اند. فقط فایل هایی که به طور خاص برای کاربران وب ارائه شده اند باید با استفاده از مکانیسم مجوز سیستم عامل قابل خواندن باشند.این برنامه در یک تماس SQL که به اطلاعات حساب دسترسی دارد از داده های تایید نشده استفاده می کند:pstmt.setString(1, request.getParameter(&#34;acct&#34;));&#xA;ResultSet results = pstmt.executeQuery( );یک مهاجم پارامتر &#34;acct&#34; را در مرورگر اصلاح می کند تا شماره حساب مورد نظر خود را ارسال کند. اگر به درستی تأیید نشود ، مهاجم می تواند به هر حساب کاربری دسترسی پیدا کند.http://example.com/app/accountInfo?acct=notmyacctیک مهاجم به سادگی مرورگر را مجبور می کند تا URL ها را هدف قرار دهد. برای دسترسی به صفحه مدیریت، راستی آزمایی مدیر لازم است.http://example.com/app/getappInfo&#xA;http://example.com/app/admin_getappInfoاگر یک کاربر غیرمجاز بتواند به هر صفحه دسترسی داشته باشد ، این یک نقص است. همچنین اگر یک مدیر غیرمستقیم بتواند به صفحه مدیر دسترسی پیدا کند ، این یک عیب است.حمله ی سوم: Security Misconfigurationیکی از مسایل بسیار رایج در سامانه‎های آنلاین استفاده از تنظیمات ناامن و به‌ویژه تنظیمات پیش‌فرض است. در برخی موقعیت‌ها این تنظیمات بسیار خطرناک است و می‌توانند منجر به دسترسی مهاجم به سیستم شوند. تنظیمات ناامن محدود به بخش خاصی از سامانه نیست و می‎توانند در تمامی قسمت‎های برنامه اتفاق بیفتد. این نوع از حملات سایت زمانی رخ می‌دهد که پیکربندی نادرست و ناصحیحی برای برنامه‌های کاربردی وب، قالب سایت، وب سرورها، بانک‌های اطلاعاتی و یا سیستم‌عامل‌ها تعریف‌شده باشد. ازآنجایی‌که تنظیمات پیش‌فرض ممکن است در امنیت سایت شما اختلال ایجاد نماید، باید به این مهم توجه داشته باشید که همیشه پیاده‌سازی و نگهداری تنظیمات به‌صورت سفارشی باعث کیفیت امنیت سایت خواهد بود؛ بنابراین همیشه سعی بر سفارشی‌سازی تنظیمات و همچنین به‌روزرسانی آن‌ها داشته باشید. همچنین اسکنرهای خودکار راهکار خوبی برای کشف این نوع آسیب‎پذیری هستند. مدیر سامانه باید از نصب هرگونه سرویس زاید اجتناب و به‎طور مرتب سرویس‎های لازم را به‎روزرسانی کند، هم‌چنین با تنظیمات امنیتی آن‌ها آشنا باشد.حمله ی چهارم: (Cross-Frame Scriptting (XFSاین حملات هنگام انجام می شود که قربانی فریب داده شود و از طریق مرورگر خود به یک صفحه وب مخرب دسترسی پیدا کند. مهاجم مخرب که کنترل این صفحه را  در دست دارد ، یک صفحه ثالثی را در قاب HTML بارگذاری می کند. یک keylogger مخرب JavaScript که ورودی های صفحه کلید قربانی را ضبط می کند و آنها را به سرور مهاجم ارسال می کنداین حملات، که با نام iFrame Injections نیز شناخته می شود ، خطرناک تر از تکنیک های سنتی فیشینگ است زیرا iFrame مورد استفاده کاملاً مشابه وب سایت هدف مورد استفاده برای فریب قربانی است. در حالی که این حملات به مهاجم مخرب و با تجربه نیاز دارد تا از باگ های بسیار خاص مرورگر سوء استفاده کند ، اما اثربخشی آنها بسیار زیاد است.CxSAST در مورد تمام صفحاتی که می توانند در یک iFrame نمایش داده شوند ، شناسایی و هشدار می دهند ولی حاوی راه حل های محافظت XFS در محل نیستند.حملات XFS با جلوگیری از frame شدن صفحه وب شخص ثالث ممکن است انکار شوند. تکنیک های استفاده شده برای انجام این کار همان روش هایی است که برای Clickjacking Protection برای Java EE استفاده می شود.حمله ی پنجم: (Cross-site Scripting (XSSحملات اسکریپت کراس سایت (XSS) نوعی تزریق است که در آن اسکریپت های مخرب به وب سایت های قابل اعتماد تزریق می شوند. حملات XSS هنگامی رخ می دهد که یک مهاجم از یک برنامه وب برای ارسال کد مخرب ، به طور کلی به شکل اسکریپت سمت مرورگر ، برای کاربر نهایی استفاده کند. نقص هایی که باعث موفقیت این حملات می شوند کاملاً گسترده هستند و در هر جایی که یک برنامه وب از ورودی توسط کاربر در خروجی تولید شده خود استفاده کند ، بدون تأیید یا اعتبار سنجی آن ، رخ می دهد.یک مهاجم می تواند از XSS برای ارسال اسکریپت مخرب به یک کاربر استفاده کند. مرورگر کاربر نهایی راهی ندارد که بفهمد اسکریپت قابل اعتماد نیست و اسکریپت را اجرا می کند. اسکریپت مخرب می تواند به همه کوکی ها ، نشانه های نشست یا سایر اطلاعات حساس که توسط مرورگر حفظ شده و از آن سایت استفاده می کند ، دسترسی پیدا کند. این اسکریپت ها حتی می توانند محتوای صفحه HTML را بازنویسی کنند.این آسیب‎پذیری قدیمی، حاصل تفسیر قسمتی از کدهای ورودی کاربر توسط مرورگر، بدون اعتبارسنجی مناسب است. در این حمله، مهاجم اسکریپت مخرب خود را با روش‌های مختلفی مانند ارسال یک URL با استفاده از ایمیل، بارگذاری در بخش‌های آسیب‌پذیر وب‌سایت و… برای کاربری دیگر  ارسال می‌کند و به ‌این ‌ترتیب می‌تواند کنترل مرورگر کاربر قربانی را در اختیار گیرد. حملات اسکریپت کراس سایت (XSS) زمانی اتفاق می افتد که:داده ها از طریق یک منبع غیرقابل اعتماد ، اغلب یک درخواست وب وارد یک برنامه وب می شوند.داده ها در محتوای پویا وجود دارد که بدون تأیید برای محتوای مخرب به کاربر وب ارسال می شود.محتوای مخرب ارسال شده به مرورگر وب اغلب به صورت بخشی از JavaScript می باشد اما ممکن است شامل HTML ، Flash یا هر نوع کد دیگری باشد که مرورگر ممکن است آن را اجرا کند. انواع حملات مبتنی بر XSS تقریبا بی حد است ، اما آنها معمولاً شامل انتقال داده های شخصی مانند کوکی ها یا سایر اطلاعات نشست به مهاجم ، هدایت قربانی به محتوای وب کنترل شده توسط مهاجم یا انجام سایر اقدامات مخرب در دستگاه کاربر می شوند(تحت پوشش سایت آسیب پذیر)   ابزارهای تست خودکار و بررسی کد منبع از بهترین روش‎های کشف این آسیب‎پذیری هستند. این نوع آسیب‎پذیری برای از بین بردن مراقبت‎های آسیب‎پذیری‎های CSRF نیز استفاده می‎شود. پیاده‎سازی امن و حساس، نمایش داده‎های پویا در  چارچوب‎ها (Framework) و ساخت نرم‎افزارهای تحت وب از بهترین راه‎های جلوگیری از این نوع آسیب‎پذیری است. فعال‎سازی خط‎مشی امن محتوا Content Security Policy (یا همان CSP) نیز از دیگر روش‎های جلوگیری از این نوع آسیب‎پذیری است.حمله ی ششم:Insecure Direct Object Referencesهنگامی که یک برنامه دسترسی مستقیمی به اشیاء مبتنی بر ورودی کاربر فراهم می کند ، رخ می دهد. به عنوان یک نتیجه از این آسیب پذیری ، مهاجمان می توانند مجوزها و دسترسی به منابع را در سیستم بطور مستقیم ، مثلاً سوابق یا پرونده های پایگاه داده ، دور بزنند.این حمله به مهاجمان اجازه می دهد تا با تغییر مقدار پارامتر مورد استفاده برای اشاره مستقیم به یک شی ، مجوزها و دسترسی به منابع را مستقیماً دور بزنند. این منابع می توانند ورودی بانک اطلاعاتی متعلق به سایر کاربران ، پرونده های موجود در سیستم و موارد دیگر باشند. این اتفاق ناشی از این واقعیت است که برنامه ورودی کاربر را تأمین می کند و از آن برای بازیابی یک شی بدون انجام بررسی های مجوز کافی استفاده می کند.برای جلوگیری از این روش باید یک تست را انجام داد: تست کننده برنامه ابتدا باید نقشه جایگاه های موجود در برنامه را که در آن از ورودی کاربر برای ارجاع مستقیم اشیاء استفاده می شود ، مشخص کند. به عنوان مثال ، مکانهایی که از ورودی کاربر برای دسترسی به ردیف بانک اطلاعاتی ، پرونده ، صفحات برنامه و موارد دیگر استفاده می شود. در مرحله بعد تستر باید مقدار پارامتر مورد استفاده در ارجاع اشیاء را تغییر دهد و ارزیابی کند که آیا امکان بازیابی اشیاء متعلق به سایر کاربران وجود دارد یا خیر که در غیر این صورت مجوز را دور می زند.بهترین روش برای ارجاع به منابع مستقیم با استفاده از حداقل دو کاربر (اغلب بیشتر) برای پوشاندن اشیاء و توابع مختلف است. به عنوان مثال ، دو کاربر هر کدام به اشیاء مختلف (مانند اطلاعات خرید ، پیامهای خصوصی و غیره) دسترسی دارند و (در صورت لزوم) کاربران با امتیازهای مختلف (به عنوان مثال کاربران admin) برای دیدن اینکه آیا منابع مستقیمی به عملکرد برنامه وجود دارد یا خیر به کار برده می شوند. تستر با در اختیار داشتن چندین کاربر ، در زمان آزمایش برای حدس زدن اسامی اشیاء مختلف صرفه جویی می کند زیرا می تواند برای دسترسی به اشیاء متعلق به کاربر دیگر تلاش کند و سیستم را به صورت کامل تست نماید.حمله ی هفتم: HTTP Verb Tampering حمله ای است که از آسیب پذیری های  HTTP verb یا همان HTTP method و مکانیسم های کنترل دسترسی استفاده می کند. بسیاری از مکانیسم های تأیید اعتبار فقط دسترسی به متدهای متداول HTTP را محدود می کنند ، بنابراین دسترسی غیرمجاز به منابع محدود شده توسط سایر روشهای HTTP امکان پذیر است.چنین مکانیسم های امنیتی شامل قوانین کنترل دسترسی برای درخواست هایی با روش های خاص HTTP است. به عنوان مثال ، یک مدیر می تواند یک سرور وب را پیکربندی کند تا با استفاده از درخواست های HTTP GET دسترسی نامحدود به یک صفحه وب امکان پذیر باشد ، اما POST ها را فقط برای administrator ها محدود می کند. با این حال ، بسیاری از پیاده سازی های مکانیسم های امنیتی مبتنی بر verb، قوانین امنیتی را به شیوه ای ناامن اجرا می کنند ، و با استفاده از روش های جایگزین HTTP (مانند HEAD) یا حتی رشته های کاراکتر های دلخواه ، دسترسی به منابع محدود را امکان پذیر می سازند.به عنوان مثال ، Java Platform Enterprise Edition  تأیید هویت مبتنی بر verb و کنترل دسترسی را از طریق فایل web.xmlconfiguration پشتیبانی می کند.راه های جلوگیری از این نوع حمله:حملات دستکاری لفظی از نقص تنظیمات در مکانیسم کنترل دسترسی یا آسیب پذیری در کد گیرندگان درخواست سوء استفاده می کنند. همانطور که در مثال بالا آورده شده است ، مسدود کردن درخواست هایی که از روشهای HTTP غیر استاندارد استفاده می کنند کافی نیست زیرا در بسیاری موارد مهاجم می تواند از روش HTTP قانونی مانند HEAD استفاده کند.در ابتدا Imperva SecureSphere برای شناسایی و متوقف کردن حملات دستکاری verb، دو روش کاهش دهنده را ترکیب می کند. در وهله اول ، SecureSphere می آموزد که کدام روش برای هر URL مجاز است. هر تلاشی برای استفاده از روشهای HTTP که جزئی از استفاده عادی برنامه نیستند ، شناسایی و مسدود می شود. روش دوم روشهای غیر استاندارد HTTP را تشخیص داده و با استفاده از چنین روشهایی درخواستها را مسدود می کند. در مواردی که برنامه به طور عادی از روشهای غیر استاندارد استفاده می کند ، این مکانیسم با روشهای مجاز به راحتی قابل استفاده است.حمله ی هشتم: Using Components with Known Vulnerabilitiesاستفاده از اجزای (Component) ناامن در سامانه‎های آنلاین امری شایع است. اگر یکی از اجزای مورد استفاده دارای آسیب‎پذیری گزارش شده باشد، مهاجم به‌سادگی می‎تواند با استفاده از آن آسیب‎پذیری به سامانه حمله کند. بررسی و به‎روزرسانی اجزای استفاده شده در برنامه و تعریف این بررسی به‌عنوان یک فرآیند تکرارشونده، یکی از راه‎حل‎های جلوگیری از این آسیب‎پذیری است. استفاده از اسکنرهای خودکار به‎روز شده نیز روش مناسبی برای کشف این آسیب‎پذیری به‌شمار می‌آید.حمله ی نهم: Information Leakage and Improper Error Handlingبرنامه‎های تحت وب می‎توانند در حالت‌های مختلف اطلاعاتی از برنامه را نشت دهند که ممکن است برای حمله‎کننده مفید باشد. برنامه می‎بایست حداقل اطلاعات لازم را در اختیار کاربر قرار دهد. در برخی اوقات نیز با استفاده از ترکیبی از این نوع آسیب‎پذیری، آسیب‎پذیری‎های جدی‎تری هم‌چون تزریق پرس‎وجوی ساختارمند برمبنای اشکال، ایجاد می‌شوند. برای جلوگیری از این آسیب‎پذیری تنظیمات سیستم باید به‌گونه‌ای انجام شوند که اشکالات به‌شکل کلی در اختیار کاربر قرار گیرد و از ارایه‎ی جزییات صرف نظر شود.حمله ی دهم: (Cross Site Request Forgery (CSRF نوعی حمله است که وقتی یک وب سایت مخرب  ایمیل ، وبلاگ ، پیام فوری یا برنامه مخرب ایجاد می کند باعث می شود مرورگر وب کاربر هنگام احراز هویت کاربر اقدام به انجام یک عمل ناخواسته در سایت مورد نظر کند. حمله CSRF به این دلیل اتفاق میفتد که درخواست های مرورگر بطور خودکار هرگونه اعتبار مرتبط با سایت را شامل می شود ، از جمله کوکی نشست کاربر ، آدرس IP و غیره ، بنابراین ، در صورت احراز هویت کاربر به سایت ، سایت نمی تواند تفاوت بین درخواست جعلی یا قانونی را تشخیص دهد.  به یک شناسه نیاز داریم که در دسترس مهاجمان نباشد و با درخواست های جعلی که مهاجم از آنها استفاده می کند ، ارسال نشود (مانند کوکی ها). این آسیب‎پذیری سبب می‎شود تا حمله‎کننده بتواند فعالیتی ناخواسته را -به‎ویژه انجام فعالیتی که منجر به تغییر حالت سیستم شود- توسط قربانی (کاربر مجاز سیستم) انجام دهد. از بهترین روش‎های جلوگیری از این دسته ازآسیب‎پذیری‌ها، ایجاد توکن‎های موقت که نمی‌توان حدس زد و ذخیره‌ی آن‌ها در نشست (session) برای درخواست‎های کاربر مجاز و گذاشتن شرط انجام درخواست کاربر به صحت توکن است. برای یافتن این آسیب‎پذیری باید تمامی فعالیت‎های کاربرِ مجاز به این توکن‎ها مجهز باشند وگرنه، سامانه در برابر این تهدید آسیب‎پذیر خواهد بود.</description><category>shayeste_farhadi</category><author>shayeste_farhadi</author><pubDate>Sat, 04 Jan 2020 14:09:11 +0330</pubDate></item><item><title>جلوگیری از حملات DHCP Snooping</title><link>https://virgool.ir/@shayeste_farhadi/جلوگیری-از-حملات-dhcp-snooping-kd6jpndqr94n</link><description>در این نوشته به حملات DHCP Spoofing می پردازیم DHCP Spoofing حمله ای است که عملکرد سرویس  DHCP (اختصاص IP به صورت اتومات) را مختل می کند.برای ارتباط کامپیوتر خود که خود یک Client است با اجزای دیگر شبکه احتیاج به یک IP خواهیم داشت.این IP از طریق DHCP  که به صورت خودکار IP را اختصاص می دهد قابل دریافت است. به هر سیستمی که پروتکل DHCP بر روی آن راه اندازی شده باشد، DHCP سرور می گویند. این Client برای دریافت IP ابتدا یک درخواست به سمت DHCP Server برای گرفتن IP ارسال می کند؛ سپس DHCP Server یک Packet که حاوی یک IP خاص، DNS ،Subnet شبکه و default gateway می باشد را به Client به مورد نظر ارسال می کند و آن Client می تواند به این صورت با دیگر اجزای شبکه ارتباط برقرار کند.اما هکرهایی هستند که می خواهند اطلاعات مربوط به آن شبکه یا آن Client را به دست آورده و یا شبکه ی مورد نظر را دچار اختلال کنند. آنها با قرار دادن DHCP سرور های تقلبی می توانند به Client ها دسترسی داشته باشند. زمانی که Client ها از سرورهای اصلی درخواست‌ IP می کنند، ممکن است در واقع به DHCP Server تقلبی این درخواست را ارسال کرده باشند؛ بنابراین Server تقلبی یک IP به Client می دهد که با دستکاری هایی که بر روی این IP می کند، قصد اختلال و از کار انداختن شبکه را دارد.یکی از این راه ها تغییر دادن IP است. فرض کنید شما یک Client هستید و یک درخواست برای گرفتن IP از DHCP Server می دهید. در اینجا DHCP server تقلبی وارد عمل می شود و با دادن یک IP تقلبی به جای IP اصلی آن Client را دچار مشکل می کند؛ به عنوان مثال به جای دادن آدرس 192.168.1.0/24 به شما آدرس 172.168.16.0/30 را می دهد و باعث تداخل آن Client شده و در واقع آن Client را در شبکه از کار می اندازند.روش های متفاوت دیگری برای این حمله وجود دارد که به بررسی آن ها نمی پردازیم.یک روش جلوگیری از اینگونه حملات DHCP Snooping می باشد که در ادامه با آن آشنا می شویم.به طور خلاصه می توان DHCP Snooping را به این گونه شرح داد که مانند یک Firewall میان DHCP Sever و Host های نا معتبر و غیرقابل اطمینان است و روش کار آن به این گونه است که :الف) DHCP Snooping پیام های که از طرف Host های نامعتبر و دستگاهای نا معتبر (دستگاهای که به عنوان مثال در یک سازمان وجود ندارند و بیرون از سازمان قرار دارند) به DHCP Server ارسال می شود را فیلتر می کند.ب) کار DHCP Snooping ساخت یک جدول و یا یک پایگاه داده است که اطلاعات این جدول شامل IP ها، DNS ها و… تخصیص داده شده به Host ها است.ج) استفاده از همان جدول به منظور شناسایی پیام های بعدی که از سمت Host های نامعتبر در دفعات بعدی می رسد.یک روش حالت Trust می باشد. حالت Trust به حالتی می گویند که Host های معتبر اجازه دسترسی و ارسال بسته به DHCP Server را دارند؛ در واقع به پورت هایی که به DHCP Server اجازه دسترسی دارند را پورت Trust و به پورت ها و Host هایی که اجازه دسترسی به DHCP Server را ندارند Untrust می گویند.روش دیگر Limit Rate می باشد. این روش به این گونه است که در بازه زمانی مشخصی تنها می توان تعداد خاصی درخواست به DHCP Server ارسال کرد و به این ترتیب از حمله به DHCP Server و خالی کردن لیست IP آن جلوگیری کرد.قابلیت DHCP Snooping در سوئیچ های لایه 2 موجود می باشد که می توان آن را فعال کرد.</description><category>shayeste_farhadi</category><author>shayeste_farhadi</author><pubDate>Sat, 21 Dec 2019 10:10:28 +0330</pubDate></item><item><title>کار کردن پروتکل های DHCP و DNS بر مبنای ساختار داده ی باینری</title><link>https://virgool.ir/@shayeste_farhadi/کار-کردن-پروتکل-های-dhcp-و-dns-بر-مبنای-ساختار-داده-ی-باینری-luqiswgqailz</link><description>در این نوشته ابتدا به نحوه کار دو پروتکل DHCP و DNS می پردازیم تا در نهایت به یک نتیجه کلی برسیم.سرور DHCP یک رنج آی‌پی در اختیار دارد که می‌تواند از بین آن‌ها اقدام به تخصیص آدرس آی‌پی به کلاینت‌های موجود در شبکه کند، به عنوان مثال رنج آدرس ۱ تا ۲۵ در اختیار DHCP قرار می‌گیرد حال دستگاهی در شبکه روشن می‌شود که به یک آدرس آی‌پی احتیاج دارد، این دستگاه از وجود سرور DHCP در این شبکه بی‌خبر است، به همین علت یک بسته تحت عنوان (Discovery) را به صورت Broadcast روی شبکه ارسال می‌کند در مرحله‌ی بعد سرور DHCP به عنوان پاسخ بسته‌ی (Offer) را ارسال می‌کند، این بسته شامل IP و Default Gateway خواهد بود و به دست ماشین اول (دستگاهی که IP درخواست کرده بود) می‌رسد.سپس ماشین اول با دریافت این بسته اقدام به بررسی آن می‌کند و درصورتی که امکان استفاده از آن IP را داشت یک بسته تحت عنوان (Request) برای سرور دی‌اچ‌سی‌پی ارسال می‌کند و در نهایت سرور نیز با ارسال یک تاییدیه (ACK) به ماشین اول این آی‌پی را به آن تخصیص می‌دهد.یک نمای بسیار ساده از نحوه‌ی تخصیص آدرس آی‌پی توسط DHCPساده‌ترین تعریف برای اینکه بگوییم DNS چگونه کار می‌کند این است که بگوییم کار اصلی DNS تبدیل یا ترجمه یک نام دامنه مانند www.example.com به یک آدرس IP مانند ۱۹۲٫۱۶۸٫۱٫۱ است. از آنجایی که برای انسان‌ها به خاطر سپردن رشته‌های اعداد آدرس IP مشکل است و راه حل ساده برای آنها به خاطر سپردن نام دامنه می‌باشد و از طرف دیگر درک اعداد برای کامپیوترها ساده تر می‌باشد، باید از سیستم واسطه‌ای که نام دامنه و آدرس IP را به یکدیگر تبدیل و ترجمه کند استفاده کرد. این سیستم همان DNS یا سیستم نام دامنه است.نحوه کار کردن DNS به طور کلیهر دوی این پروتکل ها نیازمند این هستند که فقط دیتای باینری رد و بدل کنند و اگر از ساختار اسکی استفاده کنیم بی معنی خواهد شد چرا که همانطور که دیدیم هر دوی این پروتکل ها تعداد request ها زیادی خواهند داشت از طرفی هر دوی این پروتکل ها دیتای رد و بدل شده ی خیلی کمی دارند با توجه به تعداد بسیار زیاد درخواست ها برای اتصال و با توجه به میزان کم داده ی رد و بدل شده، در صورت استفاده از تکست برای این درخواست ها حجم زیادی در شبکه گرفته خواهد شد پس در شبکه فقط در جاهایی که دیتای رد و بدل شده زیاد است از تکست استفاده میکنیم و در این دو پروتکل نیازی به استفاده از ساختار اسکی نخواهیم داشت.</description><category>shayeste_farhadi</category><author>shayeste_farhadi</author><pubDate>Sat, 21 Dec 2019 09:38:11 +0330</pubDate></item><item><title>الگوریتم  Weighted Edit Distance و نحوه پیاده سازی آن  در Python</title><link>https://virgool.ir/@shayeste_farhadi/الگوریتم-weighted-edit-distance-و-نحوه-پیاده-سازی-آن-در-python-y9mkgwgeco3o</link><description>در مورد الگوریتم edit distance می توانیم این را بیان کنیم که این الگوریتم برای محاسبه ی میزان تفاوت میان دو رشته است. این اختلاف را می توان با عملیاتی همانند حذف یک کاراکتر، اضافه کردن یک کاراکتر و یا تغییر دو کاراکتر با یکدیگر انجام داد. در واقع بین هر کدام از این عملیات ها باید زیر مجموعه ای را انتخاب کنیم که کمترین عضو را داشته باشد. بایک مثال ادامه میدهیم:form→ fromدر مثال فوق، می توانیم عملیات بسیار زیادی روی رشته ی مبدا یعنی &#34;form&#34; را انجام دهیم ولی مجموعه ای از عملیات بالا که کمترین عضو را داشته باشد مجموعه ی جابه جایی دو کاراکتر &#34;o&#34; و &#34;r&#34; خواهد بود که در این صورت با با هزینه ی فقط یک عملیات می توانیم به نتیجه مورد نظر برسیم و دیگر نیازی به جابه جایی کاراکترها نخواهد بود.عملکرد الگوریتم weighted edit distance همانند الگوریتم edit distance است با این تفاوت که در این الگوریتم، برنامه نویس با توجه به اهمیت و هزینه ی مورد نظر می تواند به هر کدام از عملیاتی که در بالا اشاره شد یک وزن مشخص دهد و هزینه هر کدام از عملیات را خود، مشخص کند.برای مثال، در مثالی که بالا زده شد، فرض کنیم هزینه ی جابه جایی عملیات جابه جایی کاراکترها &#34;3&#34; باشد و همچنین هزینه ی درج و حذف کاراکتر هر دو &#34;1&#34; باشد. در این صورت خواهیم داشت:form→ frm       هزینه =1&#xA;                                                     →    هزینه کل =2&#xA;form→ from     هزینه =1با هزینه ی &#34;2&#34; توانستیم به کلمه ی مورد نظر برسیم اما اگر همانند الگوریتم  edit distance عمل میکردیم، هزینه ی عملیاتی که باید انجام می دادیم تا به کلمه ی هدف برسیم، &#34;3&#34; می بود این در حالی است که ما هزینه ی بیشتری باید صرف می کردیم.حالا که در مورد این الگوریتم صحبت شد، قدم به قدم برای پیاده سازی این الگوریتم پیش خواهیم رفت:import sys&#xA;import string&#xA;import queue&#xA;import collections&#xA;input_file = open(&#34;input.txt&#34;, &#34;r&#34;)&#xA;&#xA;first_line = [int(i) for i in input_file.readline().strip().split()]&#xA;cost_count = len(first_line)&#xA;&#xA;add_cost, delete_cost, change_cost, anagram_cost = [int(i) for i in first_line]&#xA;&#xA;dict_file = open(&#34;words.txt&#34;, &#34;r&#34;)&#xA;word_list = dict_file.read().strip().split()&#xA;dict_file.close()&#xA;&#xA;start_word = input_file.readline().strip().lower()&#xA;end_word = input_file.readline().strip().lower()&#xA;&#xA;input_file.close()ورودی برنامه یک فایل تکست خواهد بود به نام &#34;input.txt&#34; در خط اول این تکست، 4 هزینه خواهد داشت:add_cost: هزینه ی اضافه کردن کاراکترdelete_cost: هزینه ی حذف کردن کاراکترchange_cost: هزینه ی جابه جایی دو کاراکترanagram_cost: هزینه ی ساخت یک کلمه با حروف کلمه ی قبلیهمچنین در این فایل دو خط دیگر وجود دارند که خط دوم این فایل متنی کلمه ی ابتدایی که کاربر وارد کرده است می باشد و در خط سوم نیز کلمه ای که هدف و مورد نظر بوده است وارد خواهد شد که این دو کلمه در برنامه در دو متغیر start_word و end_word  مقداردهی شده اند.همچنین قطعه کد زیر به این دلیل تعریف شده اند که اگر کلمه مورد نظر در داکیومنت پیدا نشد، پیغام خطایی را به کاربر اعلام کند.if start_word not in word_list:&#xA;  sys.exit(&#34;ERROR: Starting word is not in the dictionary.&#34;)&#xA;if end_word not in word_list:&#xA;  sys.exit(&#34;ERROR: Ending word is not in the dictionary.&#34;)در قطعه کد زیر نیز دو مقدار solution و min_cost را تعریف می کنیم و مقدار دهی می کنیم تا در مواقع نیاز عموما در توابعی که در ادامه تعریف خواهیم کرد، مقدار آنها را تغییر دهیم(متغیر Global).solution = False&#xA;min_cost = -1در ادامه یک صف اولیت به نام word_queue  و همچنین یک دیکشنری به نام word_costs که هزینه ی کلمه ها در آن ذخیره خواهد شد و یک متغیر به نام  alphabet که حروف کوچک را به صورت کاراکترهای اسکی ذخیره میکند و یک مغیر به نام end_len که طول کلمه ی نهایی که قصد رسیدن به آن کلمه را داریم و یک متغیر به نام change_estimate که کمترین مقدار بین change_cost و  add_cost + delete_cost را ذخیره می کند را تعریف میکنیم چرا که میخواهیم ببینیم اگر دو کاراکتر را با یکدیگر تغییر بدهیم کم هزینه تر است یا اگر یک کاراکتر را حذف و دیگری اضافه شود کم هزینه تر خواهد بود داریم:word_queue = queue.PriorityQueue()&#xA;word_costs = {}&#xA;&#xA;&#xA;alphabet = string.ascii_lowercase&#xA;end_len = len(end_word)&#xA;change_estimate = min(change_cost, add_cost + delete_cost) در مجموعه فایلی که برای دانلود قرار داده شده است مقدار change_estimate  به صورت زیر خواهد بود:change_cost=1add_cost =1delete_cost=3change_estimate = min(change_cost, add_cost + delete_cost)change_estimate = min(1, 4)=1برای هر کدام از عملیاتی که در بالا به آن اشاره شد توابعی را تعریف می کنیم:def add_op(word, cost):                      #عملیات درج کاراکتر&#xA;  for i in range(len(word) + 1):             #در طول کلمه باید جستجو را انجام دهیم&#xA;    for letter in alphabet:                      #به ازای تمام حروف کاراکتری که به صورت اسکی تعریف کردیم&#xA;      if check_word(word[:i] + letter + word[i:], cost):   # check_word فراخوانی تابع &#xA;#&#xA;#h+&#39;یکی از حروف اسکی&#39;+lp             help  برای کلمه ی&#xA;        return&#xA;&#xA;def delete_op(word, cost):                 #عملیات حذف کاراکتر&#xA;  for i in range(len(word)):                 #در طول کلمه باید جستجو را انجام دهیم&#xA;    if check_word(word[:i] + word[i+1:], cost):&#xA;#(i=1)کلمه  به صورت زیر خواهد بود:    &#xA;#h+&#39;e حذف حرف &#39;+lp             help  برای کلمه ی            &#xA;      return&#xA;&#xA;def change_op(word, cost):               #عملیات تغییر دو کاراکتر&#xA;  for i in range(len(word)):                 #در طول کلمه باید جستجو را انجام دهیم&#xA;    for letter in alphabet:                    #به ازای تمام حروف کاراکتری که به صورت اسکی تعریف کردیم&#xA;      if check_word(word[:i] + letter + word[i+1:], cost):&#xA;#(i=1)کلمه  به صورت زیر خواهد بود:    &#xA;#h+&#39;یکی از حروف اسکی &#39;+p             help  برای کلمه ی&#xA;        return&#xA;&#xA;def anagram_op(word, cost):           #عملیات پیدا کردن کلمه ی مشابه&#xA;  for real_word in word_list:              #جستجو در تمامی کلمات موجود در داکیومنت کلمات&#xA;    if collections.Counter(real_word) == collections.Counter(word):&#xA;      check_word(real_word, cost, True)برای تابع add_op برای تابع anagram_op میخواهیم دو کلمه ای که تعداد حروف آن ها همانند هم هستند را پیدا کنیم برای این کار از کتابخانه یcollections ،collections.Counter را فراخوانی میکنیم. برای کلمه ی &#34;help&#34; خواهیم داشت:Counter({&#39;h&#39;: 1, &#39;e&#39;: 1, &#39;l&#39;: 1, &#39;p&#39;: 1})کلماتی را پیدا خواهیم کرد که این حروف با این تعداد را داشته باشندو آن ها را به تابع check_word برای بررسی خواهیم فرستاد.در ادامه به بررسی تابع check_word می پردازیم:def check_word(word, cost, bypass=False):&#xA;  global solution, min_cost&#xA;  if (word == end_word) and ((not solution) or (cost &lt; min_cost)):   #کلمه ای مشابه با عملیات کم &#xA;  # هزینه پبدا کردیم&#xA;    solution = True&#xA;    min_cost = cost&#xA;    print(word)       #چاپ کلمه مشابه پیدا شده با هزینه کمتر &#xA;    print(cost)        #چاپ هزینه عملیات انجام شده روی کلمه&#xA;    return True&#xA;  elif bypass or (word in word_list):&#xA;    if (word not in word_costs) or \    # در صورتی که کلمه فعلی هزینه عملیاتی بیشتری داشته باشد&#xA;      (word_costs[word] &gt; cost):&#xA;      new_cost = cost + heuristic(word) &#xA;      if (not solution) or (new_cost &lt; min_cost):# در صورتی که هزینه ای که پیدا کرده ایم از کمترین &#xA;   #هزینه ی سابق کمتر باشد  &#xA;        word_queue.put((new_cost, word))        #به صف کلمات کلمه ی با عملیات هزینه ی کم را به &#xA;   #همراه هزینه ی آن وارد می کنیم&#xA;        word_costs[word] = cost&#xA;    return Falseدر تابع بالا تابع هیرستیک برای پیدا کردن بهترین کلمه با کمترین هزینه در واقع پیدا کردن هزینه عملیات فراخوانی شده است.این تابع را در ادامه توضیح می دهیم:def heuristic(word):&#xA;  bias = 0&#xA;  len_dif = len(word) - end_len &#xA;  if len_dif &gt; 0:&#xA;    bias += len_dif * delete_cost&#xA;  else:&#xA;    bias -= len_dif * add_cost &#xA;&#xA;  bias += max(0,&#xA;    max(&#xA;    len([x for x in word if x not in end_word]) - len_dif, &#xA;    len([x for x in end_word if x not in word]) + len_dif)&#xA;    ) * change_estimate&#xA;  return biasاین تابع کلمه مورد نظر را دریافت می کند سپس طول کلمه دریافت شده را با طول کلمه هدف پیدا می کند اگر بزرگتر از صفر بود(یعنی طول آن از کلمه ی هدف بزرگتر بود)، باید حداکثر یک واحد عملیاتی حذف کاراکتر روی آن اتفاق بیفتد ازین رو به ازای تعداد کاراکتر های اضافی(اختلاف موجود) باید هزینه را متقبل شویم که این هزینه در خط پنجم برنامه ی بالا در متغیر bias ریخته شده است.در غیر این صورت در صورتی که اختلاف کوچکتر از صفر شود، یعنی طول کلمه کمتر از طول کلمه هدف می باشد و باید به ازای هر کلمه ای که باید اضافه شود هزینه محاسباتی اضافه کردن کاراکتر را حساب کنیم که این مقدار مقداری منفی خواهد بود (به دلیل انجام محاسبات در خط سوم قطعه کد بالا) برای اینکه این مقدار را مثبت کنیم مقدار پایه bias را منهای این مقدار میکنیم و چون مقدار اولیه bias صفر می باشد تاثیری در مقدار هزینه نخواهد داشت.در آخر نیز بیشترین مقدار بین 0 (جهت اینکه عددی منفی انتخاب نشود)، تعداد حروفی که در کلمه ی هدف وجود ندارند ولی در کلمه ی فعلی وجود دارند منهای len_dif و طول تعداد حروفی که در کلمه ی هدف وجود دارند ولی در کلمه فعلی وجود ندارند به علاوه ی len_dif به دست خواهد آمد و این مقدار در  change_estimate ضرب خواهد شد و متغیر bias برگردانده خواهد شد.در آخر نیز فراخوانی های نهایی برنامه را انجام می دهیم:word_queue.put((0, start_word)) #در خانه ی 0ام صف مقدار کلمه شروع را می گذاریم&#xA;word_costs[start_word] = 0 #مقدار هزینه ی این کلمه را برابر صفر می گذاریم&#xA;while not word_queue.empty(): #تا زمانی که صف خالی نشده است حلقه را ادامه می دهیم&#xA;  target = word_queue.get()[1]#هدف مان خانه ی 1ام صف خواهد بود&#xA;  print(target) #هدف مورد نظر را چاپ میکنیم&#xA;  old_cost = word_costs[target] #هزینه قدیمی در ابتدا برابر با هزینه ی هدف خواهد بود&#xA;  if (old_cost &gt; min_cost) and solution: &#xA;    break&#xA;  if (not solution) or (old_cost + add_cost &lt; min_cost): &#xA;    add_op(target, old_cost+add_cost)&#xA;  if ((not solution) or (old_cost + delete_cost &lt; min_cost)) and \&#xA;    (len(target) &gt; 3):&#xA;    delete_op(target, old_cost+delete_cost)&#xA;  if (not solution) or (old_cost + change_cost &lt; min_cost):&#xA;    change_op(target, old_cost+change_cost)&#xA;  if (not solution) or (old_cost + anagram_cost &lt; min_cost):&#xA;    anagram_op(target, old_cost+anagram_cost)&#xA;print(min_cost)در صورتی که هزینه ی قبلی به علاوه هزینه اضافه کردن کاراکتر کمتر از کمترین هزینه شد باید تابع اضافه کردن کاراکتر را صدا بزنیم تا چک کنیم آیا این عملیات به صرفه است یا خیر همین شرایط برای توابع دیگر نیز برقرار است.در اخر نیز کمترین هزینه را چاپ می کنیم.تست دیتا برای دو فایل input که لینک های آن ها در ادامه پیوست می شود به صورت زیر است:ورودی Input که شامل کلمه مبدا و کلمه ی هدف و وزن های عملیات ها می باشد:http://s7.picofile.com/d/8378271976/8d5d3896-1412-45e6-99b6-ed145f3f8fee/input.txtورودی فایل کلمات (داکیومنت کلمات):http://s7.picofile.com/d/8378272000/97119817-2619-4726-99b2-8dcb9e94dd85/words.txtنمایش خروجی:healthheathdeathdeashheatsheadsneathbeathhealsheapshearshentshantshands7leathmeathneatsbeachbeadsbeatsdeadsdealsdearsdentsdepthderthfeatshaarsheadyhealdheardhearthheedsheftsherdshestshintshoarshuntskeatsleadsleashmeadsmeatsneapsnearspeatsreadsseatsteatswealthbearsbeatabeatibeethbentsberthcantscentsfearsgearsgentshaetshaftshaltshartshathheapyheartheelsheilsheirshellshelpshempsherlsleapslearsmealsnantspantspealspearsrantsrealsreapsrearsrentssealssearssentstealstearstentsvealsventswantswealswearsyearszealsdash7                                                                                                                                  موفق باشید?</description><category>shayeste_farhadi</category><author>shayeste_farhadi</author><pubDate>Fri, 15 Nov 2019 11:57:59 +0330</pubDate></item></channel></rss>