FreeToGenerate.com

إضافةُ بصمةٍ ثانيةٍ أقوى ليست احتياطًا مضاعفًا. المتصفح يستعمل أقواها وحدها ويطرح الباقي.

23 بايت

هذه لا تستطيع جلبَ مسارٍ نيابةً عنك: فالمتصفح لا يُسمح له بقراءة ملفٍ من أصلٍ آخر بلا CORS، وهي القاعدةُ نفسُها التي تجعل crossorigin واجبًا على الوسم. فاختر الملفَّ المحلي أو ألصق محتواه.

وضعُ خوارزميتين ليس احتياطًا مضاعفًا. فالمتصفح لا يستعمل إلا أقواها حضورًا ويطرح الباقي، فـsha256 صحيحٌ إلى جانب sha512 خاطئٍ يفشل.

متوفر أيضًا بلغات أخرى: English · Español · Português · Français

مولّد بصمة SRI

قيم integrity تُحسب داخل متصفحك، مع الوسم كاملًا وفيه الخاصّية التي ينساها الجميع، وفاحصٌ للخاصّية التي عندك أصلًا.

ما نزاهة الموارد الفرعية؟

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

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

شكل الخاصّية هو ‏sha384-‏ يتبعه نصٌّ بترميز base64. وهذه الصفحة تحسب ذلك النص من ملفٍ تختاره أو نصٍّ تلصقه، وتعطيك الوسم كاملًا لتنسخه، وفي الوضع الآخر تأخذ خاصّيةً عندك أصلًا وتخبرك أيقبلها المتصفح أم لا.

كيف تستعمله

  1. أعطه بايتات الملف بالضبط. اختر الملف المحلي أو ألصق محتواه. فالبصمة للبايتات كما تُقدَّم، حتى سطرٌ فارغٌ زائدٌ في آخر الملف يغيّر الجواب — ولذلك التوليد من نسخةٍ أعاد محرّرك تنسيقها لن يطابق.
  2. اختر الخوارزمية وانسخ الوسم كلَّه لا القيمة وحدها. ‏sha384 هو المعتاد وهو ما تستعمله أمثلة المعيار نفسه. والوسم المولَّد يتضمن crossorigin، وهو ليس اختياريًّا لملفٍ من أصلٍ آخر.
  3. أو انتقل إلى الفحص لتجرّب خاصّيةً عندك. ألصق خاصّية integrity إلى جانب الملف فتحصل على حكمٍ، وعلى الخوارزمية التي سيرجع إليها المتصفح فعلًا، وعلى قائمةٍ بما أُهمل من التعابير.

الخوارزمية الثانية تحلّ محلّ الأولى ولا تسندها

هذه هي القاعدة التي بُنيت عليها الصفحة، ولا يكاد يعرفها أحد. فحين تُدرج خاصّية integrity عدّةَ تعابيرِ بصمة، لا يفحصها المتصفح كلَّها ولا يقبل تطابقًا مع أيٍّ منها. يقول المعيار إنه يختار أقوى دالّة تلبيدٍ في القائمة ويستعملها وحدها، طارحًا كلَّ أضعفَ منها قبل أيّ مقارنة. والترتيب ثابت: sha256 أضعف من sha384، وهذا أضعف من sha512.

والنتيجة حادّة. فإن أدرجتَ sha256 صحيحًا و‏sha512 مكتوبًا خطأً، حُجب ملفك — إذ طُرحت البصمة الصحيحة دون أن تُقرأ. وإن أدرجتَ sha256 خاطئًا و‏sha384 صحيحًا، حُمّل ملفك على أتمّ وجه ولم تعنِ البصمةُ المكسورة شيئًا. فإضافة خوارزميةٍ ثانية تبدو دفاعًا متعمّقًا وليست كذلك البتة؛ إنها استبدال، وتنقل ثقتك كلَّها في صمتٍ إلى الأقوى أيًّا كان.

وثمّة حالةٌ تعني فيها البصماتُ المتعددة أيًّا من هذه فعلًا، وهي الحالة النافعة: عدّة تعابيرَ بالخوارزمية نفسها. هكذا تسمح بنسختين مقبولتين من ملفٍ أثناء إطلاقٍ تدريجي، وسيقبل المتصفح تطابقًا مع أيٍّ منهما. فـ‏sha384-A sha384-B خيارٌ بين أمرين حقًّا، أما sha256-A sha512-B فلا.

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

أمران آخران يكسرانه في صمت

الأول غياب crossorigin. فالطلبات إلى أصلٍ آخر المحميّة بـintegrity ملزَمةٌ باستعمال CORS، ومن ثمّ فوسم script يشير إلى شبكة توزيعٍ بخاصّية integrity وبلا crossorigin لا يُحمَّل إطلاقًا — والعطل يبدو تمامًا كبصمةٍ خاطئة، فينصرف الناس إلى إعادة حساب قيمةٍ كانت صحيحةً من البداية. وكلُّ وسمٍ تولّده هذه الصفحة يتضمن crossorigin="anonymous". ويعني هذا أيضًا أن على شبكة التوزيع نفسها أن ترسل ترويسات CORS متساهلة؛ فإن لم تفعل تعذّر عليك استعمال SRI معها.

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

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

حدودٌ صريحة

هذه الصفحة لا تستطيع جلب مسارٍ نيابةً عنك. فالمتصفح لا يُسمح له بقراءة ملفٍ من أصلٍ آخر من داخل سكربت ما لم يأذن ذلك الخادم عبر CORS — وهي القاعدة نفسها التي تجعل crossorigin واجبًا على الوسم. فأنت تختار الملف المحلي أو تلصق المحتوى، وأيّ أداةٍ تبدو وكأنها تجلب المسار عنك إنما تفعل ذلك على خادم، ومعنى هذا أن تأتمنه على ذلك الجلب. والقيام به محليًّا هو الخيار الصريح والخصوصي معًا.

والبصمة تغطّي البايتات ولا شيء سواها. فهي لا تخبرك أن الملف آمنٌ ولا محكم الكتابة ولا أنه ممّن تظن — بل أنه لم يتغيّر منذ أخذتَ البصمة فحسب. وإن لبّدتَ ملفًا مخترقًا ضمنت لك SRI بأمانةٍ الملفَّ المخترق.

وهي تربطك كذلك بإصدارٍ واحد. فأيّ تحديثٍ للملف، بما فيه إصلاحٌ أمنيٌّ ينشره المزوّد، سيُسقط الفحص حتى تعيد توليد القيمة. تلك مقايضة SRI، ولهذا تناسب المسارات المرقّمة بإصدارات أكثر بكثيرٍ من مسارٍ عائمٍ باسم latest.

وأخيرًا، تنطبق integrity على السكربتات وأوراق الأنماط. وليست آليةً عامةً للصور أو الخطوط أو طلبات fetch، فالوسم المولَّد هنا موضعه عنصر script أو link ولا موضع له سواه.

لماذا هي مجانية؟

لأن تشغيلها لا يكلّف شيئًا. فالتلبيد يجري في متصفحك عبر واجهة Web Crypto الموجودة أصلًا؛ والملف الذي تختاره لا يغادر جهازك، ولا يُرفع شيء، ولا يراه أيّ خادم.

لا حساب ولا تسجيل ولا شيء محجوز. والقواعد مأخوذةٌ من معيار نزاهة الموارد الفرعية نفسه، والفحوص التي تتحقق منها تستعمل بصمات المثال التي ينشرها المعيار، مقابَلةً بتطبيقٍ منفصل.