سؤال

أريد أن أسمح للمستخدمين بالصق <embed> و <object> شظايا HTML (مشغلات الفيديو) عبر نموذج HTML. رمز جانب الخادم هو PHP. كيف يمكنني الحماية من الكود الصافي الخبيث ، JavaScript ، إلخ؟ كان بإمكاني تحليل الكود المليء بلس ، لكنني لست متأكدًا من أنه يمكنني حساب جميع الاختلافات. هل هناك طريقة أفضل؟

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

المحلول

لست متأكدًا حقًا ما هي المعلمات EMBED و OBJECT خذ كما لم أتعامل مع وضع الوسائط على صفحة (وهو في الواقع نوع من الصدمة للتفكير فيه) لكنني سأتبع نهج رمز BB وفعل شيء مثل [embed url="http://www.whatever.com/myvideo.whatever" ...] وبعد ذلك يمكنك تحليل عنوان URL وأي شيء آخر ، تأكد من أنها شرعية وصنع خاصتك <EMBED> بطاقة شعار.

تعديل: حسنًا ، يجب أن يكون شيء من هذا القبيل على ما يرام:

$youtube = '<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"></param> </param><embed src="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object>';

$blip = '<embed src="http://blip.tv/play/AZ_iEoaIfA" type="application/x-shockwave-flash" width="640" height="510" allowscriptaccess="always" allowfullscreen="true"></embed>';

preg_match_all("/([A-Za-z]*)\=\"(.+?)\"/", $youtube, $matches1);
preg_match_all("/([A-Za-z]*)\=\"(.+?)\"/", $blip, $matches2);
print '<pre>' . print_r($matches1, true). '</pre>';
print '<pre>' . print_r($matches2, true). '</pre>';

هذا سوف يخرج:

Array
(
[0] => Array
    (
        [0] => width="425"
        [1] => height="344"
        [2] => name="movie"
        [3] => value="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"
        [4] => src="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"
        [5] => type="application/x-shockwave-flash"
        [6] => allowfullscreen="true"
        [7] => width="425"
        [8] => height="344"
    )

[1] => Array
    (
        [0] => width
        [1] => height
        [2] => name
        [3] => value
        [4] => src
        [5] => type
        [6] => allowfullscreen
        [7] => width
        [8] => height
    )

[2] => Array
    (
        [0] => 425
        [1] => 344
        [2] => movie
        [3] => http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1
        [4] => http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1
        [5] => application/x-shockwave-flash
        [6] => true
        [7] => 425
        [8] => 344
    )
)

Array
(
[0] => Array
    (
        [0] => src="http://blip.tv/play/AZ_iEoaIfA"
        [1] => type="application/x-shockwave-flash"
        [2] => width="640"
        [3] => height="510"
        [4] => allowscriptaccess="always"
        [5] => allowfullscreen="true"
    )

[1] => Array
    (
        [0] => src
        [1] => type
        [2] => width
        [3] => height
        [4] => allowscriptaccess
        [5] => allowfullscreen
    )

[2] => Array
    (
        [0] => http://blip.tv/play/AZ_iEoaIfA
        [1] => application/x-shockwave-flash
        [2] => 640
        [3] => 510
        [4] => always
        [5] => true
    )
)

ومنذ ذلك الحين فهي مستقيمة إلى الأمام. لأشياء مثل العرض/الارتفاع يمكنك التحقق منها is_numeric ومع الباقي يمكنك تشغيل القيم من خلال htmlentities وبناء خاصتك <embed> علامة من المعلومات. أنا متأكد من أن هذا سيكون آمنًا. يمكنك حتى صنع الكامل <object> واحد مثل YouTube (الذي أفترض أنه يعمل في المزيد من الأماكن) مع روابط من blip.tv ، حيث سيكون لديك جميع البيانات المطلوبة.

أنا متأكد من أنك قد ترى بعض المراوغات مع روابط من مواقع الويب الأخرى لمشاركة الفيديو ، لكن هذا نأمل أن تبدأ. حظا طيبا وفقك الله.

نصائح أخرى

فرصك في اكتشاف التعليمات البرمجية الضارة بشكل موثوق عن طريق مسح HTML المسحّب حول NIL. هناك العديد من الطرق الممكنة لحقن البرنامج النصي (بما في ذلك HTML المشوهة الخاصة بالمتصفح) ، لن تتمكن من اختيارها جميعًا. إذا ما زال مقدمو بريد الويب الكبار بعد سنوات العثور على مآثر جديدة ، فلا توجد فرصة لتتمكن من القيام بذلك.

القائمة البيضاء أفضل من القائمة السوداء. لذلك يمكنك بدلاً من ذلك أن تتطلب من الإدخال أن يكون XHTML ، وتحليله باستخدام محلل XML قياسي. ثم قم بالسير عبر DOM وتحقق من أن كل عنصر من العناصر والسمات معروفة جيدة ، وإذا كان كل شيء على ما يرام ، فلا ينبغي تشويه كل شيء على ما يرام إلى XHTML ، والذي لا ينبغي تشويهه من DOM معروف. يجب أن يقوم محلل XML المناسب بدعم Unicode أيضًا بتصفية "تسلسل UTF-8 Overlong" (ثقب أمان يؤثر على IE6 والأوبرا القديمة) مجانًا.

ومع ذلك ... إذا سمحت بتضمين/كائنات من أي مجال ، فأنت تسمح بالفعل بالوصول الكامل للنصوص إلى صفحتك من مجالات خارجية ، لذا فإن حقن HTML هو أقل مخاوفك. من المحتمل أن تكون المكونات الإضافية مثل Flash قادرة على تنفيذ JavaScript دون ضرورة أي نوع من الخداع.

لذلك يجب أن تقصر مصدر الكائنات على المجالات المعروفة المحددة مسبقًا. وإذا كنت تفعل ذلك بالفعل ، فمن المحتمل أن تسمح للمستخدم فقط باختيار مزود فيديو ومعرف مقطع ، ثم تحويل ذلك إلى رمز التضمين المناسب المعروف لهذا المزود. على سبيل المثال ، إذا كنت تستخدم علامة تشبه BBCode ، فإن الطريقة التقليدية للسماح للمستخدمين بتضمين مقطع YouTube ستكون شيئًا [YouTube] DTZS7DSH [/youtube].

فيما يلي مثال على الشفرة التي تم لصقها من blip.tv:

<embed src="http://blip.tv/play/AZ_iEoaIfA" type="application/x-shockwave-flash"    
  width="640" height="510" allowscriptaccess="always" allowfullscreen="true"></embed>

إليك مثال على ما قد تحصل عليه من YouTube:

<object width="425" height="344">
  <param name="movie" value="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"></param>
  <param name="allowFullScreen" value="true"></param>
    <embed src="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"
      type="application/x-shockwave-flash" allowfullscreen="true"
      width="425" height="344"></embed>
</object>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top