ما هي أفضل الممارسات من أجل تجنب هجمات xss في موقع PHP

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

  •  09-06-2019
  •  | 
  •  

سؤال

لدي PHP تكوينه بحيث ونقلت السحر على تسجيل جلوبل هي خارج.

أنا أبذل قصارى جهدي دائما الاتصال htmlentities() عن أي شيء أنا outputing مشتق من إدخال المستخدم.

أنا أيضا في بعض الأحيان البحث قاعدة البيانات الخاصة بي الأمور الشائعة المستخدمة في xss تعلق مثل...

<script

ماذا علي أن أفعل و كيف يمكنني التأكد من أن الأشياء التي أحاول فعله دائما القيام به.

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

المحلول

الهروب من المدخلات ليست أفضل ما يمكن القيام به من أجل نجاح XSS الوقاية.أيضا الإخراج يجب أن يكون هرب.إذا كنت تستخدم هندى قالب المحرك ، يمكنك استخدام |escape:'htmlall' التعديل لتحويل جميع الحساسة الشخصيات HTML الكيانات (أنا استخدم الخاصة |e التعديل وهو الاسم المستعار أعلاه).

توجهي إلى الإدخال/الإخراج الأمن:

  • متجر إدخال المستخدم غير معدلة (أي HTML الهروب على المدخلات فقط DB-علم الهروب يتم عن طريق شركة تنمية نفط عمان إعداد البيانات)
  • الهروب على الإخراج ، اعتمادا على ما تنسيق الإخراج الذي تستخدمه (على سبيل المثالHTML سلمان حاجة مختلفة الهروب القواعد)

نصائح أخرى

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

وبعبارة أخرى, يمكنك الهروب فقط في آخر لحظة البيانات هو "ترك" التطبيق الخاص بك:

  • قائمة البند
  • الكتابة إلى ملف XML الهروب XML
  • كتابة DB, escape (على وجه الخصوص ، DBMS)
  • كتابة البريد الإلكتروني ، الهروب لرسائل البريد الإلكتروني
  • الخ

للذهاب قصيرة:

  1. كنت لا تعرف أين هو ذاهب البيانات الخاصة بك
  2. البيانات قد فعلا في نهاية المطاف في أكثر من مكان واحد ، تحتاج مختلفة الهروب الآلية ولكن ليس على حد سواء
  3. البيانات هرب عن الهدف الخاطئ في الحقيقة ليست لطيفة.(E. g.الحصول على البريد الإلكتروني مع موضوع "الذهاب إلى تومي\'s بار".)

Esp #3 سوف تحدث إذا كنت الهروب من البيانات في طبقة الإدخال (أو تحتاج إلى الهروب مرة أخرى ، الخ).

PS:أنا ثاني نصيحة لا تستخدم magic_quotes ، تلك هي شر محض!

هناك الكثير من الطرق للقيام XSS (انظر http://ha.ckers.org/xss.html) و من الصعب جدا للقبض.

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

هذا هو السؤال الكبير.

أولا, لا الهروب نص على المدخلات إلا لجعلها آمنة للتخزين (مثل أن تكون وضعت في قاعدة البيانات).والسبب في ذلك هو أنك تريد أن تبقي ما كان الإدخال حتى تتمكن من السياق الحالي في مختلف الطرق والأماكن.إجراء تغييرات هنا يمكن أن تضر بك في وقت لاحق من العرض.

عندما تذهب لتقديم البيانات الخاصة بك على تصفية ما لا ينبغي أن يكون هناك.على سبيل المثال, إذا لم يكن هناك سبب جافا سكريبت أن يكون هناك ابحث وإزالته.طريقة سهلة للقيام بذلك هو استخدام strip_tags وظيفة هذا فقط علامات html يمكنك السماح.

بعد ما كنت قد وتمرير الفكر htmlentities أو htmlspecialchars إلى تغيير ما هو هناك أحرف ascii.هل هذا على أساس السياق ماذا تريد الخروج.

أود أيضا أقترح إيقاف ونقلت السحر.إنه تم إزالتها من PHP 6 و تعتبر ممارسة سيئة استخدامه.التفاصيل في http://us3.php.net/magic_quotes

لمزيد من التفاصيل راجع http://ha.ckers.org/xss.html

هذه ليست إجابة كاملة ولكن نأمل يكفي لمساعدتك على البدء.

rikh يكتب:

أنا أبذل قصارى جهدي دائما الاتصال htmlentities() عن أي شيء أنا outputing مشتق من إدخال المستخدم.

انظر جويل مقال على مما يجعل نظرة رمز الخطأ للحصول على مساعدة مع هذا

أنا أعتمد على PHPTAL من أجل ذلك.

على عكس هندى و عادي PHP, فإنه يهرب من كافة الإخراج بشكل افتراضي.هذا هو الفوز الكبير الأمن ، لأن موقع الويب الخاص بك لن تصبح vurnelable إذا كنت قد نسيت htmlspecialchars() أو |escape في مكان ما.

XSS هو HTML محددة الهجوم حتى إخراج HTML هو المكان المناسب لمنع ذلك.يجب أن لا محاولة قبل تصفية البيانات في قاعدة البيانات ، لأنك قد تحتاج إلى إخراج البيانات إلى آخر المتوسطة التي لا تقبل HTML ، ولكن قد تنشأ.

مكتبة قالب. أو على الأقل هذا هو ما قالب المكتبات ينبغي القيام به.لمنع XSS كل يجب أن يكون الإخراج المشفرة.هذه ليست مهمة التطبيق الرئيسية / التحكم في المنطق ، يجب فقط أن يتم التعامل معها من خلال أساليب الانتاج.

إذا كنت يرش htmlentities() thorughout التعليمات البرمجية الخاصة بك ، التصميم العام هو الخطأ.و كما تقول, قد يغيب واحد أو اثنين من البقع.لهذا الحل الوحيد هو دقيق ترميز html -> عندما خرج فأر تحصل مكتوب في html/xml تيار.

للأسف, معظم php قالب المكتبات فقط إضافة بهم قالب جملة, ولكن لا تهتم مع إخراج ترميز أو التعريب أو التحقق من صحة html أو أي شيء مهم.ربما شخص آخر يعرف السليم قالب مكتبة php?

الهروب من جميع مدخلات المستخدم هو بما فيه الكفاية بالنسبة لمعظم المواقع.أيضا التأكد من أن الدورة معرفات لا ينتهي في عنوان URL حيث أنها لا يمكن أن تكون مسروقة من Referer رابط إلى موقع آخر.بالإضافة إلى ذلك, إذا كنت تسمح للمستخدمين بتقديم وصلات, تأكد من أن لا javascript: بروتوكول الروابط مسموح بها ؛ هذه تنفيذ السيناريو بمجرد أن ينقر المستخدم على الرابط.

إذا كنت تشعر بالقلق إزاء هجمات XSS, ترميز الإخراج الخاص بك سلاسل HTML هو الحل.إذا كنت تتذكر لترميز كل واحد إخراج الحرف إلى تنسيق HTML ، ليس هناك طريقة لتنفيذ ناجح XSS الهجوم.

اقرأ المزيد:التعقيم بيانات المستخدم:كيف وأين تفعل ذلك

شخصيا, وأود أن تعطيل magic_quotes.في PHP5+ تم تعطيله افتراضيا ومن أفضل إلى رمز كما لو أنه ليس هناك على الإطلاق كما أنه لا الهروب من كل شيء وأنه سيتم إزالتها من PHP6.

المقبل, اعتمادا على ما نوع من المستخدم البيانات التي يتم تصفية ستحدد ماذا تفعل التالي على سبيل المثالإذا كان مجرد النص على سبيل المثالالاسم, ثم strip_tags(trim(stripslashes())); أو للتحقق من نطاقات استخدام التعبيرات العادية.

إذا كنت تتوقع مجموعة معينة من القيم ، إنشاء صفيف من القيم الصالحة و تسمح فقط تلك القيم من خلال (in_array($userData, array(...))).

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

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

إذا كان لديك للتعامل مع HTML ثم عليك أن تنظر في شيء مثل PHP تصفية الإدخال أو HTML Purifier.HTML Purifier أيضا التحقق من صحة HTML المطابقة.أنا لست متأكدا مما إذا كان الإدخال التصفية لا يزال قيد التطوير.كلا سوف تسمح لك لتحديد مجموعة من العلامات التي يمكن استخدامها وما سمات مسموح بها.

كل ما عليك أن تقرر على تذكر دائما أبدا أن أثق بأي شيء يأتي في PHP النصي من المستخدم (بما في ذلك نفسك).

كل هذه الإجابات هي كبيرة ولكن في الأساس الحل XSS وقف توليد وثائق HTML من خلال سلسلة التلاعب.

تصفية الإدخال هو دائما فكرة جيدة لأي تطبيق.

الهروب الإخراج الخاص بك باستخدام htmlentities() والأصدقاء يجب أن تعمل طالما انها تستخدم بشكل صحيح, ولكن هذا هو HTML أي ما يعادل إنشاء استعلام SQL بواسطة وصل السلاسل مع mysql_real_escape_string($var) - يجب أن تعمل ، ولكن أقل ما يمكن التحقق من صحة عملك ، إذا جاز التعبير ، مقارنة مع النهج مثل استخدام استعلامات بمعلمات.

الحل على المدى الطويل يجب أن يكون للتطبيقات لبناء الصفحة داخليا ، ربما باستخدام واجهة قياسية مثل دوم ، ومن ثم استخدام المكتبة (مثل libxml) للتعامل مع التسلسل إلى XHTML/HTML/etc.بالطبع نحن طرق طويلة بعيدا عن كونها شعبية وسريعة بما فيه الكفاية ، ولكن في الوقت نفسه علينا أن نبني لدينا مستندات HTML عبر سلسلة العمليات التي بطبيعتها أكثر خطورة.

أجد أن استخدام هذه الوظيفة يساعد على قطاع بها الكثير من الممكن هجمات xss:http://www.codebelay.com/killxss.phps

"ونقلت السحر" هو مسكن علاج بعض من أسوأ العيوب XSS التي يعمل عن طريق الهروب من كل شيء على إدخال شيء من هذا الخطأ حسب التصميم.الحالة الوحيدة حيث قد ترغب في استخدام هذا هو عندما كنت على الاطلاق ويجب استخدام القائمة PHP التطبيق المعروف أن تكون مكتوبة بلا مبالاة فيما يتعلق XSS.(في هذه الحالة أنت في ورطة خطيرة حتى مع "ونقلت السحر".) عند تطوير التطبيق الخاص بك, يجب عليك تعطيل "ونقلت السحر" واتبع XSS-الممارسات الآمنة بدلا من ذلك.

XSS, عبر موقع البرمجة النصية الضعف ، يحدث عند تطبيق يتضمن سلاسل من مصادر خارجية (إدخال المستخدم ، جلبها من مواقع أخرى ، وما إلى ذلك) في [س]HTML, CSS, ECMAscript أو متصفح آخر-تحليل الإخراج دون الهروب ، على أمل أن أحرف خاصة مثل أقل من (في [س]HTML), علامات الاقتباس المفردة أو المزدوجة (ECMAscript) لن تظهر.الحل السليم هو دائما الهروب السلاسل وفقا لقواعد اللغة الناتج:باستخدام كيانات في [س]HTML, الخطوط المائلة العكسية في ECMAscript.... الخ

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

"Register globals" ، على الرغم من تعطيل هو بالتأكيد فكرة جيدة ، يتعامل مع مشكلة مختلفة تماما من XSS.

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

هذا ليس حلا ، مجرد لبنة أخرى في الجدار

  • لا تثق إدخال المستخدم
  • الهروب مجانا-إخراج النص
  • لا تستخدم magic_quotes;انظر إذا كان هناك DBMS-specfic البديل ، أو استخدام شركة تنمية نفط عمان
  • النظر في استخدام HTTP الكوكيز فقط حيث من الممكن تجنب أي البرامج الخبيثة قادرة على خطف الدورة

يجب على الأقل التحقق من صحة كافة البيانات في قاعدة البيانات.و محاولة التحقق من صحة جميع البيانات ترك قاعدة البيانات أيضا.

mysql_real_escape_string جيدة لمنع حقن SQL, ولكن XSS هو اصعب.يجب أن preg_match, stip_tags ، أو htmlentities حيث ممكن!

أفضل طريقة لمنع XSS في تطبيق PHP HTML Purifier (http://htmlpurifier.org/).هناك عيب واحد هو أنه بدلا مكتبة كبيرة ويتم استخدام أفضل مع المرجع رمز ذاكرة التخزين المؤقت مثل APC.يمكنك استخدام هذا في أي مكان غير موثوق بها محتوى أنتج على الشاشة.فمن أكثر دقة أن htmlentities, htmlspecialchars, filter_input, filter_var, strip_tags ، إلخ.

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

أجد أن أفضل طريقة هي باستخدام الدرجة التي تسمح لك لربط الرمز الخاص بك لذلك كنت لا داعي للقلق حول يدويا الهروب من البيانات الخاصة بك.

فإنه من الصعب تنفيذ شامل حقن sql/xss حقن منع على موقع لا تسبب إنذارات كاذبة.في CMS المستخدم النهائي قد ترغب في استخدام <script> أو <object> التي تربط العناصر من موقع آخر.

أوصي وجود جميع المستخدمين تثبيت فايرفوكس مع NoScript ;-)

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