منع XSS في نماذج HTML من موقع الطرف الثالث

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

  •  05-07-2019
  •  | 
  •  

سؤال

أساسيات:

  • لدي نموذج اتصال يستخدم PHP للتحقق من صحة النماذج.(بالإضافة إلى جانب العميل) يمكن القيام بذلك بأي لغة من جانب الخادم.
  • يسمح جانب الخادم فقط AZ 0-9 لبعض الحقول (من المقبول التحقق من صحة هذا الحقل إلى اللغة الإنجليزية فقط مع هذا النطاق المحدود للغاية)
  • إذا كان النموذج يحتوي على أخطاء، أقوم بإعادة ملء الحقول حتى لا يضطر المستخدم إلى إعادة الكتابة قبل الإرسال مرة أخرى
  • أنا على استعداد لعدم السماح للمواقع الأخرى بالنشر في النموذج الخاص بي، حتى لو كان من الممكن العثور على استخدام مشروع هناك.

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

لدي انطباع بأن المتسللين المخصصين يمكنهم التأثير على ملفات تعريف الارتباط وجلسات php وبالطبع من السهل انتحال الحقول المخفية مع المُحيلين وما شابه.كيف يمكنني منع مواقع الطرف الثالث من النشر على صفحتي؟

لا تتردد في مساعدتي جوجل لهذا أيضا.مصطلحات البحث الخاصة بي ضعيفة وأساليب البحث التي أعرفها ستفشل.

ماذا لو أرسل شخص ما "d03boy يأكل القطط" عبر نموذج على موقعه وجعل الأشخاص ينقرون على الرابط الذي يرسله إلى النموذج الخاص بي؟(اعترف بأن هذا ممكن، ولا يمكن لشركتي قبول أي مخاطرة) ثم عندما ينقر المستخدم على الرابط الذي يراه داخل حقل "الاسم" "d03boy يأكل القطط" ويشعر بالإهانة الشديدة ويتصل بـ PETA بشأن محتوى موقعنا.لا يمكننا أن نشرح للمستخدم ما حدث.صحيح أنه لم يحدث شيء، لكن إزعاج مستخدم واحد أمر غير مقبول لدى صاحب العمل.

الحل الحالي لدينا هو عدم الإبلاغ عن أي مدخلات من المستخدم، وهو ما يمثل في رأيي مشكلة كبيرة في قابلية الاستخدام.

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

المحلول

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

ضع المحتوى الذي أرسله المستخدم في قائمة الانتظار واطلب من المشرفين مراجعة المحتوى والموافقة عليه.ولتخفيف العبء، يمكنك تعيين المستخدمين الموثوق بهم على "موافق عليهم مسبقًا"، ولكنك قلت إن عميلك لا يمكنه قبول أي مخاطر.

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

نصائح أخرى

لست متأكدًا من أنني أفهم سؤالك تمامًا ولكني سأبذل قصارى جهدي لإعطائك إجابة أساسية.

تحدث البرمجة النصية عبر المواقع (XSS) بشكل عام عندما يقوم شخص آخر بإدخال HTML في النماذج الخاصة بك.يسمح موقع الويب الخاص بك بحدوث ذلك لأنه لا يتخطى HTML بشكل صحيح.إذا كنت تستخدم PHP فربما تريد الاستفادة من وظيفة htmlentities($str, ENT_QUOTES).

htmlentities($str, ENT_QUOTES)

PHP htmlentities

محاولتي

...
<?
$form_token = "";
$token = "";
$encoded_token = "";
$salt = "ThiséèÞ....$ÖyiìeéèÞ";  //it is 70 characters long
...
...
$blnGoodToken = false;
...
...
//Check for the encoded token
session_start();
$encoded_token = GetSuper('POST', 'TOKEN');
if (isset($_SESSION['TOKEN'])) {
    if (sha1($_SESSION['TOKEN'] + $salt) === $encoded_token) {
        $blnGoodToken = true;
        //echo "Good Token";
        }
    else {
        //echo "Bad Token";
        $blnGoodToken = false;
        unset($_SESSION);
        session_unset();
        session_destroy();
        session_start();
        }
    }
else {
    $blnDoit = false;
    echo "No Token, possible no session";
    }

$token = uniqid(rand(), TRUE);
$_SESSION['TOKEN'] = $token;
$form_token = sha1($token + $salt);
...
...
?>
...
...
<form action="request.php?doit=y" method="post">
    <input type="text" name="TOKEN" id="TOKEN" value="<?=$form_token?>" />
    <!--
    form stuff
    -->
    <input type="reset"  value="Clear" />
    <input type="submit" value="Submit" />
</form>

وبما أنني لا أستخدم الجلسات في أي مكان آخر على الموقع، فلا أعتقد أننا نتعرض كثيرًا لاختطاف الجلسات.يغير الرمز المميز كل عملية تحميل، ولكي تحصل على الرمز المميز ليتوافق مع الجلسة، يجب أن تعرفه

  1. أنا أستخدم شا.تخمين سهل صنعه على رمز PHP الخاص بي
  2. أحتفظ بها في الجلسة.أفترض أن الجلسة قابلة
  3. ملح بلدي.أعتقد أن هذا سر جيد.إذا كانوا يعرفون الملح الخاص بي ، فإنهم يمتلكون بالفعل خادمي
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top