يجب أن ينتج عميل المتصفح وخدمة Node.js نفس Base64 لنفس البايتات. لا يحتاجون إلى استخدام نفس API للقيام بذلك. الاتفاق المهم هو تمثيل البايت للنص والأبجدية ومعالجة الحشو والإدخال غير الصالح.
المتصفح: اجعل الخطوة UTF-8 صريحة
تعمل وظائف المتصفح التقليدية على سلاسل البايت. تحويل نص Unicode مع TextEncoder، ثم قم بتشفير تلك البايتات. في مسار الإرجاع، أعد بناء مصفوفة بايت وفك تشفير UTF-8 بشكل صريح. يستخدم هذا المثال حلقة لتجنب توسيع مصفوفة كبيرة إلى وسائط دالة، على الرغم من أن برنامج تشفير ملف الإنتاج يجب أن يستمر في استخدام القطع المقيدة أو البايت المناسب API.
const text = '中文😊';
const bytes = new TextEncoder().encode(text);
let binary = '';
for (const byte of bytes) binary += String.fromCharCode(byte);
const encoded = btoa(binary);
console.log(encoded); // 5Lit5paH8J+Yig==
const decodedBytes = Uint8Array.from(atob(encoded), c => c.charCodeAt(0));
const decoded = new TextDecoder('utf-8', { fatal: true }).decode(decodedBytes);
console.log(decoded); // 中文😊
Node.js: احتفظ بـ Buffer عند حدود البايت
Buffer.from(text, 'utf8') يجعل ترميز النص مرئيًا. الاتصال toString('base64') ثم يمثل تلك البايتات. يؤدي فك التشفير إلى Buffer إلى الحفاظ على البيانات الثنائية؛ يعد التحويل فورًا إلى سلسلة UTF-8 مناسبًا فقط عندما تكون الحمولة معروفة بأنها نص.
import { Buffer } from 'node:buffer';
const encoded = Buffer.from('中文😊', 'utf8').toString('base64');
console.log(encoded); // 5Lit5paH8J+Yig==
const bytes = Buffer.from(encoded, 'base64');
console.log(new TextDecoder('utf-8', { fatal: true }).decode(bytes)); // 中文😊
الخطأ الفادح TextDecoder في المثال متعمد. يمكن لتحويل السلسلة Buffer UTF-8 العادي إدراج أحرف بديلة للإدخال غير الصالح. سيؤدي عرض النص الناجح بعد ذلك إلى إخفاء عدم إمكانية تمثيل البايتات الأصلية بأمانة.
الاتفاق على التحقق من الصحة بشكل منفصل
يقبل جهاز فك التشفير Base64 الخاص بالعقدة بعض نماذج الإدخال التي قد يرفضها تطبيق أكثر صرامة. لا تستخدم تحويل Buffer ناجح كدليل على أنه تم توفير التمثيل القانوني للبروتوكول. إذا كان بناء الجملة الدقيق مهمًا للتوقيعات أو مفاتيح التخزين المؤقت أو التسلسل القابل للتشغيل البيني، فتحقق منه قبل فك التشفير.
بالنسبة لاختبار الانحدار المشترك، قم بتضمين ASCII والصينية والرموز التعبيرية والبايت صفر والبايت FF وجميع الأطوال حول حد ثلاثي البايت. قارن البايتات عبر أوقات التشغيل. قم أيضًا باختبار الإخراج الآمن URL باستخدام أداة تحتوي فعليًا على الأحرف المستبدلة؛ لا يمكن للمدخل الذي يكون إخراجه عبارة عن أحرف فقط إثبات أن خيار المتغير يعمل.
عند قراءة الملفات في Node، احتفظ بالملف الذي تم إرجاعه Buffer بدلاً من تطبيق ترميز نصي على الملف المقروء. في المتصفح استخدم File.arrayBuffer(). تتجنب هذه الاختيارات الحدودية الصغيرة معظم حالات الفساد العرضي. انظر Node.js Buffer لسلوك العقدة و MDN: بتوا () لعقد سلسلة البايت للمتصفح.