يقوم مُنقي HTML بأكل الأحرف الخاصة بشكل انتقائي

StackOverflow https://stackoverflow.com/questions/864644

  •  21-08-2019
  •  | 
  •  

سؤال

استخدام PHP ضد قاعدة بيانات متوافقة مع UTF-8.وإليك كيفية إدخال الإدخال.

  1. يقوم المستخدم بأنواع الإدخال في منطقة النص
  2. منطقة نصية مشفرة باستخدام جافا سكريبت الهروب ()
  3. مرت عبر آخر HTTP
  4. تم فك التشفير باستخدام PHP Rawurldecode()
  5. تم تمريره عبر HTMLPurifier بالإعدادات الافتراضية
  6. هرب إلى MySQL وتخزينه في قاعدة البيانات

ويخرج بالطريقة المعتادة وأقوم بتشغيل unescape() عند تحميل الصفحة.هذا هو السماح للأشخاص، على سبيل المثال، بالنسخ واللصق مباشرةً من مستند Word وإظهار علامات الاقتباس الذكية.

لكن يبدو أن HTMLPurifier يتفوق على الأحرف الخاصة غير UTF-8، تلك التي تهرب() إلى تعبير % بسيط، مثل Ö، الذي يهرب إلى %D6، بينما تهرب علامات الاقتباس الذكية إلى %u2024 أو شيء من هذا القبيل وتنتقل إلى قاعدة البيانات بهذه الطريقة.إنه يزيل كلاً من الشخصية الخاصة والشخصية التي تليها مباشرة.

أحتاج إلى تغيير شيء ما في هذه العملية.ربما أحتاج إلى تغيير أشياء متعددة.

ما الذي يمكنني فعله حتى لا يتم تحطيم الشخصيات الخاصة؟

هل كانت مفيدة؟

المحلول

  1. منطقة نصية مشفرة باستخدام جافا سكريبت الهروب ()

escape ليست آمنة لغير ascii.يستخدم escapeURIComponent

  1. مرت عبر آخر HTTP

أفترض أنك تستخدم XmlHttpRequest؟إذا لم يكن الأمر كذلك، فتأكد من أن الصفحة التي تحتوي على النموذج يتم تقديمها كـ utf-8.

  1. تم فك التشفير باستخدام PHP Rawurldecode()

إذا قمت بالوصول إلى القيمة من خلال $_POST, ، لا ينبغي عليك فك تشفيره، حيث تم ذلك بالفعل.سيؤدي القيام بذلك إلى إفساد البيانات.

  1. هرب إلى MySQL وتخزينه في قاعدة البيانات

تأكد من عدم وجودك magic quotes تشغيل.تأكد من أن قاعدة البيانات تخزن الجداول بتنسيق utf-8 (ملف الترميز و يجب أن يكون الترتيب على حد سواء utf-8).تأكد من أن الاتصال بين php وMySql هو utf-8 (استخدم set names utf8, ، إذا كنت لا تستخدم PDO).

وأخيرًا، تأكد من أن الصفحة يتم تقديمها كـ utf-8 عند إخراج السلسلة مرة أخرى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top