
json-sanitizer مع CVE-2020-13973
بما أن المحتوى يشبه JSON، فإن أداة تعقيم JSON تحوّله إلى JSON صالح.
يمكن ربط هذه الأداة بأي من طرفي خط أنابيب البيانات للمساعدة في تحقيق مبدأ بوستل:
كن متحفظًا في ما تفعله، كن متسامحًا في ما تقبله من الآخرين
عند تطبيقها على محتوى يشبه JSON من الآخرين، ستنتج JSON جيدة التكوين ترضي أي محلل تستخدمه.
عند تطبيقها على مخرجاتك قبل إرسالها، ستقوم بتصحيح الأخطاء البسيطة في الترميز وتجعل من السهل تضمين JSON الخاص بك في HTML وXML.

العديد من التطبيقات تحتوي على كميات كبيرة من الأكواد التي تستخدم طرقًا مخصصة لتوليد مخرجات JSON.
غالبًا ما تمر هذه المخرجات عبر كمية صغيرة من كود الإطار قبل إرسالها عبر الشبكة. يمكن لهذه الكمية الصغيرة من كود الإطار استخدام هذه المكتبة للتأكد من أن المخرجات المخصصة تتوافق مع المعايير وآمنة لتمريرها إلى أدوات إزالة التسلسل القوية (أو المفرطة في القوة) مثل عامل eval في JavaScript.
كذلك، غالبًا ما تحتوي التطبيقات على واجهات برمجة تطبيقات خدمات الويب التي تستقبل JSON من مصادر متنوعة. عندما يتم إنشاء هذا JSON باستخدام طرق مخصصة، يمكن لهذه المكتبة تحويله إلى شكل يسهل تحليله.
من خلال ربط هذه المكتبة بالكود الذي يرسل ويستقبل الطلبات والردود، يمكن لهذه المكتبة مساعدة مهندسي البرمجيات في ضمان الأمان والتكوين الجيد على مستوى النظام.
تأخذ أداة التعقيم محتوى يشبه JSON وتفسره كما يفعل eval في JS. تحديدًا، تتعامل مع هذه التركيبات غير القياسية.
تقوم أداة التعقيم بإصلاح علامات الترقيم المفقودة، وعلامات الاقتباس الختامية، والأقواس غير المتطابقة أو المفقودة. إذا كان الإدخال يحتوي فقط على مسافات بيضاء، يتم استبداله بسلسلة JSON الصالحة null.
المخرجات هي JSON جيدة التكوين كما هو معرف بواسطة RFC 4627. كما تحقق المخرجات الخصائص الإضافية التالية:
"</script"، وبالتالي يمكن تضمينها داخل عنصر script في HTML دون تشفير إضافي."]]>"، وبالتالي يمكن تضمينها داخل قسم CDATA في XML دون تشفير إضافي.eval في JavaScript (بعد لفها بين قوسين) أو بواسطة JSON.parse. على وجه التحديد، لن تحتوي المخرجات على أي حرفيات سلسلة تحتوي على أسطر جديدة JS مضمنة (فاصل الفقرة U+2028 أو فاصل السطر U+2029).بما أن المخرجات هي JSON جيدة التكوين، فإن تمريرها إلى eval لن يكون له أي تأثيرات جانبية أو متغيرات حرة، وبالتالي فهي ليست ناقلًا لحقن الأكواد ولا ناقلًا لتسريب الأسرار.
هذه المكتبة تضمن فقط أن مرحلة سلسلة JSON → كائن JavaScript ليس لها تأثيرات جانبية ولا تحل أي متغيرات حرة، ولا يمكنها التحكم في كيفية تفسير الكود من جانب العميل للكائن الناتج لاحقًا. لذلك، إذا أخذ الكود من جانب العميل جزءًا من البيانات المحللة التي يتحكم فيها مهاجم وأعاد تمريرها عبر مفسر قوي مثل eval أو innerHTML، فقد يعاني ذلك الكود من جانب العميل من تأثيرات جانبية غير مقصودة.
var myValue = eval(sanitizedJsonString); // safe
var myEmbeddedValue = eval(myValue.foo); // possibly unsafe
بالإضافة إلى ذلك، لا يمكن لتعقيم JSON حماية تطبيق من هجمات الوكيل المربك
var myValue = JSON.parse(sanitizedJsonString);
addToAdminstratorsGroup(myValue.propertyFromUntrustedSource);
ستعيد طريقة التعقيم سلسلة الإدخال دون تخصيص مخزن مؤقت جديد عندما يكون الإدخال بالفعل JSON صالحًا يحقق الخصائص أعلاه. وبالتالي، إذا تم استخدامها على إدخال عادة ما يكون جيد التكوين، فإنها تستهلك ذاكرة قليلة جدًا.
تستغرق طريقة التعقيم وقتًا من رتبة O(n) حيث n هو طول الإدخال بوحدات الترميز UTF-16.
| التركيب | السياسة |
|---|
'...' | يتم تحويل السلاسل المقتبسة بمفردها إلى سلاسل JSON. |
\xAB | يتم تحويل الترميزات السداسية العشرية إلى ترميزات يونيكود JSON. |
\012 | يتم تحويل الترميزات الثمانية إلى ترميزات يونيكود JSON. |
0xAB | يتم تحويل القيم الصحيحة السداسية العشرية إلى أعداد عشرية JSON. |
012 | يتم تحويل القيم الصحيحة الثمانية إلى أعداد عشرية JSON. |
+.5 | يتم تحويل الأعداد العشرية إلى تنسيق JSON الأكثر صرامة. |
[0,,2] | يتم ملء الفجوات في المصفوفات بـ null. |
[1,2,3,] | يتم إزالة الفواصل الزائدة. |
{foo:"bar"} | يتم اقتباس أسماء الخصائص غير المقتبسة. |
//comments | يتم إزالة التعليقات السطرية والكتلية بنمط JS. |
(...) | يتم إزالة الأقواس التجميعية. |