Defaults.Exposed

Defaults.Exposedالإصلاحات › الحماية من اختطاف النقر (X-Frame-Options)

كيف تُصلح الحماية من اختطاف النقر (X-Frame-Options)

تعليمة من سطر واحد تُخبر المتصفحات ألّا تدع مواقع أخرى تحمّل موقعك سراً داخلها. بدونها، يستطيع محتال إخفاء صفحاتك الحقيقية المسجَّل دخولها خلف صفحة مزيّفة وخداع عملائك للنقر على أشياء لم يقصدوها أبداً — الموافقة على دفعة، أو تغيير كلمة مرور، أو منح وصول.

الخلاصة لعملك: يستطيع محتال أن يلفّ موقعك الحيّ بشكل غير مرئي داخل موقع مزيّف ويسرق المال أو الوصول إلى الحساب من عملائك المسجَّل دخولهم — وبالنسبة للعميل يبدو أن موقعك من فعل ذلك. الإصلاح مجاني ويستغرق من مطوّر نحو 15 دقيقة؛ وتركه مُطفأً ثغرة معروفة يستطيع المجرمون والمشترون الحذرون اكتشافها في ثوانٍ.

ماذا قد يكلّفك هذا

لماذا يهمّ. هذا إعداد مجاني من سطر واحد يستغرق دقائق لإضافته، وهو يُغلق فئة كاملة من الخداع الموجَّه إلى عملائك المسجَّل دخولهم. وفي تقييمنا هو فحص أمن ويب يستحق نقاطاً حقيقية ومصنَّف عالي الخطورة، لأن ترويسة مفقودة تترك ثقباً معروفاً سهل الفحص يؤتمته المجرمون ويبحث عنه المشترون.

ما هذا، بكلمات بسيطة

حين يزور أحدهم موقعك، يمكن أيضاً أن يُطلَب من متصفحه تحميل موقعك داخل موقع آخر — مثل نافذة صغيرة مضمَّنة داخل صفحة أكبر. يبدو ذلك غير ضار، وأحياناً يكون كذلك. لكنه الآلية الكامنة وراء هجوم يُسمّى اختطاف النقر (clickjacking).

إليك الخدعة. يبني محتال صفحته الخاصة ويحمّل بهدوء موقعك الحقيقي داخلها — بشكل غير مرئي، مجعولاً شفافاً تماماً. ثم يضع محتواه فوقه: زرّاً برّاقاً، أو “شغّل الفيديو”، أو “اطلب جائزتك”. يرى عميلك صفحة المهاجم وينقر على ما يبدو زراً غير ضار. لكن لأن موقعك الحقيقي يجثم بشكل غير مرئي تحت مؤشّره، تقع النقرة فعلاً على صفحتك — مؤكِّدةً دفعة، أو مغيِّرةً كلمة مرور، أو موافِقةً على وصول، أو قابِلةً إذناً. يظن العميل أنه نقر على شيء؛ بينما نقر فعلاً على شيء آخر، على موقع يثق به.

والحماية من اختطاف النقر تعليمة قصيرة غير مرئية يرسلها موقعك لمتصفح كل زائر تقول، في جوهرها:

“لا تدع مواقع أخرى تحمّلني داخلها. إذا حاول أحد، فارفض.”

تطيع المتصفحات الحديثة هذا تلقائياً. ومع تفعيله، لا تنجح الخدعة ببساطة — فالنسخة المضمَّنة من موقعك ترفض التحميل. وبدونه، يكون موقعك هدفاً مشروعاً ليُستخدَم كطبقة مخفية في عملية احتيال، والعميل الذي يقع سيربط الأمر كله بعلامتك أنت، لا بالمهاجم.

ما قد يكلّفك هذا

هذه سيناريوهات واقعية يومية. نحن لا نذكر أبداً نشاطاً تجارياً حقيقياً؛ هذه أمثلة على كيفية استغلال الثغرة.

  1. “التأكيد” غير المرئي. عميل مسجّل الدخول إلى بوابة حسابك في تبويب واحد. يصل إلى صفحة (من إعلان أو بريد أو نتيجة بحث) تعد بشيء مغرٍ وتُظهِر زرّاً كبيراً “متابعة”. ومخفيّ تحت ذلك الزرّ ضابطك الحقيقي “تأكيد التحويل” أو “تغيير البريد”، محمَّلاً من جلسته المسجَّل دخولها. ينقر “متابعة” — ودون علمه يصرّح بتغيير على حسابه الفعلي لديك. وبالنسبة له، ولفريق الدعم لديك، يبدو أنه هو من فعل ذلك على موقعك.

  2. اختطاف الإعدادات. يضع مهاجم صفحة إعدادات حسابك في إطار ويضع فوقها لعبة أو استطلاعاً بريئاً. وبضع نقرات في الأماكن الصحيحة تقلب بصمت إعداداً — مضيفةً بريد المهاجم كعنوان استرداد، أو مانحةً تطبيقاً إذناً، أو معطّلةً تنبيهاً أمنياً. والحساب الآن مخترَق بهدوء، ولم يبدُ شيء خاطئاً وقتها.

  3. الصفقة التي تتعثّر. يرسل لك عميل أكبر استبيانه الأمني المعتاد قبل التوقيع. يسأل سطر واحد عمّا إذا كان موقعك يضبط حماية ضد الإطار (X-Frame-Options / CSP frame-ancestors). يضطر اتصالك التقني للإجابة بـ “لا”، وتتوقف المشتريات بينما تهرع لإصلاح إعداد مجاني من 15 دقيقة يبدو الآن كعلامة خطر أمام مشترٍ.

  4. حملة العلامة-كطُعم. لأن صفحاتك الحقيقية الموثوقة يمكن تضمينها، يستخدم مهاجم تسجيل الدخول أو الدفع لديك كالطبقة المقنعة في حملة تصيّد أوسع. والعملاء الذين يقعون لا يلومون المهاجم الخفي — بل يتذكّرونها كالمرة التي سمح فيها “موقعك” بخداعهم.

  5. علامة التدقيق. يُدرِج مسح شركة تأمين، أو مدقّق يراجع وضع أمنك، الحماية المفقودة من اختطاف النقر بين النتائج. إنه بند نظافة أساسية نموذجي؛ ووجوده مُعلَّماً يشير إلى أن الحمايات السهلة المجانية لم تكن في مكانها — وهو ما يصبغ كيف يُحكَم على بقية أمنك.

الخيط الجامع: يقع الضرر على عميل حقيقي مسجّل الدخول يفعل شيئاً لم يقصده — ويحمل اسمك، لا اسم المهاجم.

ما هو فعلاً

حين يطلب متصفح من موقعك صفحة، يرسل خادمك الصفحة بالإضافة إلى بعض “الترويسات” غير المرئية — تعليمات إضافية يقرؤها المتصفح لكن الزائر لا يراها أبداً. وتُسلَّم الحماية من اختطاف النقر عبر هذه الترويسات. وهناك اثنتان، ويجتاز فحصنا إن وُجِدت أيّ منهما:

1. الترويسة الأقدم — X-Frame-Options:

X-Frame-Options: SAMEORIGIN

هذا الضابط القائم منذ زمن طويل والمدعوم على نطاق واسع. يأخذ إحدى قيمتين عمليتين:

2. الترويسة الحديثة — Content-Security-Policy frame-ancestors:

Content-Security-Policy: frame-ancestors 'self';

هذا الضابط الأحدث الأكثر مرونة والذي تشير إليه المعايير الحالية. يؤدي المهمة نفسها لكنه يتيح لك الدقّة بشأن من يمكنه تضمينك:

كيف يبدو “الجيد”

الإعداد الأقوى يستخدم كليهما: frame-ancestors للمتصفحات الحديثة (ولدقّة تسمية المُضمِّنين المسموح لهم) وX-Frame-Options: SAMEORIGIN كاحتياط للعملاء القدامى. ويُرضي فحصنا أيّ منهما بمفرده — لكن بما أن كليهما مجاني ويستغرقان الدقائق القليلة نفسها، فلا سبب لعدم ضبط كليهما.

تفصيل مهمّ ينبغي لمطوّرك معرفته: ترويسة Content-Security-Policy-Report-Only لا تفرض أي شيء — بل تُبلّغ فقط. فإن أردت أن تأخذ الحماية من اختطاف النقر مفعولها فعلاً، يجب أن تأتي من ترويسة مفروضة (Content-Security-Policy عادية مع frame-ancestors، أو X-Frame-Options)، لا من ترويسة إبلاغ فقط.

كيفية الإصلاح (مجاناً، ~15 دقيقة)

سلّم هذا القسم لمن يدير موقعك — الشخص التقني لديك، أو مطوّر الويب، أو دعم الاستضافة. الإصلاح مجاني. إنه ترويسة أو ترويستا استجابة، أو قاعدة في CDN لديك. لا شيء لشرائه.

يجتاز الفحص حين تُوجَد إمّا ترويسة X-Frame-Options (مضبوطة على DENY أو SAMEORIGIN) أو توجيه CSP frame-ancestors. والإعداد متعدد الطبقات الموصى به يضيف كليهما.

الخطوة 1 — قرّر مدى الصرامة

الخطوة 2 — أضِف الترويسات (اختر منصتك)

Nginx — داخل كتلة server لديك:

add_header X-Frame-Options "SAMEORIGIN" always;
add_header Content-Security-Policy "frame-ancestors 'self';" always;

Apache — تأكد من تفعيل mod_headers، ثم في مضيفك الافتراضي:

Header always set X-Frame-Options "SAMEORIGIN"
Header always set Content-Security-Policy "frame-ancestors 'self';"

Microsoft IIS — في web.config داخل <customHeaders>:

<add name="X-Frame-Options" value="SAMEORIGIN" />
<add name="Content-Security-Policy" value="frame-ancestors 'self';" />

Cloudflare (أو CDN مشابه): اذهب إلى Rules ← Transform Rules ← Modify Response Header، وأضِف قاعدتين تضبطان X-Frame-Options على SAMEORIGIN وContent-Security-Policy على frame-ancestors 'self'; على كل الاستجابات. هذا أسهل طريق إن لم يكن لديك وصول مباشر للخادم.

هل ترسل أصلاً Content-Security-Policy لأسباب أخرى؟ لا تنشئ ترويسة CSP ثانية — أضِف frame-ancestors إلى سياستك الموجودة. ترويستا CSP قد تتعارضان.

منشئو المواقع (Squarespace، Wix، Shopify وما شابه): كثيراً ما تضبط هذه المنصات حماية ضد الإطار لك، فقد تجتاز أصلاً دون فعل شيء. وإذا عُلِّم فحصنا، فالضابط عادة في إعدادات أمن المنصة، أو تضيفه في CDN الجاثم أمام الموقع. (ملاحظة: Google Workspace وMicrosoft 365 يشغّلان بريدك، لا موقعك — فتُضبَط هذه الترويسة حيثما يعيش موقعك العام فعلاً، لا في لوحة إدارة Workspace/365.)

الخطوة 3 — أعِد التحميل وتحقّق

أعِد تحميل خادم الويب أو انشر قاعدة CDN، ثم حمّل موقعك الحيّ وافحص ترويسات الاستجابة — أدوات مطوّر المتصفح ← تبويب Network ← انقر طلب الصفحة ← Response Headers، أو أي أداة فحص ترويسات مجانية. تأكد من ظهور الترويسة (الترويسات) على استجابات صفحات حقيقية، لا الصفحة الرئيسية فقط. ثم أعِد إجراء الفحص.

الأخطاء الشائعة

الأسئلة الشائعة

لستُ شخصاً تقنياً — هل يمكنني التعامل مع هذا بنفسي؟

لستَ بحاجة للقيام بالجزء التقني. إنه إعداد واحد يُضاف إلى خادم موقعك أو CDN لديك، وأي مطوّر ويب أو مزوّد خدمة تقنية يمكنه إضافته في بضع دقائق. سلّمهم قسم 'كيفية الإصلاح' أدناه — فهو يخبرهم بالضبط بما يجب إضافته. الإصلاح مجاني؛ نحن نتقاضى رسوماً فقط إن أردت أن نواصل مراقبة بقائه في مكانه.

هل سيمنع هذا موقعي أنا، أو شركاء مشروعين، من عرض صفحاتي؟

فقط إن ضبطته بصرامة مفرطة. الإعداد الشائع ('SAMEORIGIN'، أو 'frame-ancestors self') لا يزال يتيح لموقعك تضمين صفحاته بشكل طبيعي — إنه يحجب المواقع الخارجية فقط. وإذا احتاج شريك حقيقي لتضمين صفحة محددة واحدة منك، يستطيع مطوّرك السماح بذلك المصدر الواحد بينما لا يزال يحجب الجميع.

نحن نشاط تجاري صغير — هل قد يتعب أحد فعلاً باستهدافنا؟

تُشَنّ هذه الهجمات بالجملة بأدوات آلية، لا بانتقاء يدوي. وتُصاب المواقع الأصغر غالباً تحديداً لأنها التي تفتقد حمايات أساسية كهذه. لا يحتاج المهاجم لمعرفة من أنت — بل يحتاج فقط أن يكون موقعك قابلاً للتضمين. وإغلاق الثغرة لا يكلّفك شيئاً.

كيف يبدو 'الجيد' فعلاً؟

إمّا ترويسة X-Frame-Options مضبوطة على SAMEORIGIN (أو DENY)، أو Content-Security-Policy بتوجيه frame-ancestors — والأفضل كلاهما. يجتاز فحصنا إن وُجِد أيّ منهما. والضابط الحديث الأكثر مرونة هو frame-ancestors؛ وX-Frame-Options هي الترويسة الأقدم التي لا تزال تغطّي بعض المتصفحات القديمة، فالإعداد المُحكَم متعدد الطبقات يستخدم كليهما.

أليس هذا نفس قفل SSL أو HTTPS؟

لا — إنهما يحميان من أشياء مختلفة تماماً. HTTPS يشفّر الاتصال فلا يستطيع أحد قراءته أثناء النقل. والحماية من اختطاف النقر توقف تحميل صفحاتك داخل موقع شخص آخر أصلاً. يمكن أن يكون لديك قفل مثالي وتظلّ مكشوفاً تماماً لاختطاف النقر. إنهما فحصان منفصلان وأنت تريد كليهما.

إن لم نُصلِحه، هل يخفض درجتنا؟

نعم. هذا فحص أمن ويب مُقيَّم، لا للعلم — فترويسة مفقودة تكلّف نقاطاً وتُصنَّف عالية الخطورة، لأنها تُعرّض مباشرة عملاءك المسجَّل دخولهم للاحتيال. وهو أيضاً من أرخص النقاط استرداداً: ترويسة مجانية واحدة، نحو 15 دقيقة من وقت مطوّر.