السماح بمقتطفات التعليمات البرمجية في إدخال النموذج أثناء منع هجمات حقن XSS و SQL

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

سؤال

كيف يمكن للمرء أن يسمح بإدخال قصاصات التعليمات البرمجية في محرر (كما يفعل StackOverflow) مثل FCKEditor أو أي محرر آخر مع منع XSS ، حقن SQL ، والهجمات ذات الصلة.

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

المحلول

جزء من المشكلة هنا هو أنك تريد السماح بأنواع معينة من HTML ، أليس كذلك؟ روابط على سبيل المثال. لكنك تحتاج إلى تعقيم علامات HTML التي قد تحتوي على هجمات XSS مثل علامات البرنامج النصي أو حتى سمات معالج الأحداث أو السمة الأخرى أو السمة الأخرى التي تبدأ بـ "JavaScript:". وبالتالي ، يجب أن تكون الإجابة الكاملة على سؤالك أكثر تطوراً من "استبدال الشخصيات الخاصة" لأن ذلك لن يسمح بالروابط.

قد يكون منع حقن SQL يعتمد إلى حد ما على اختيار النظام الأساسي الخاص بك. يحتوي منصة الويب المفضلة لدي على بناء جملة مدمجة لتصوير الاستعلامات التي من شأنها أن تمنع في الغالب حقن SQL (تسمى Cfqueryparam). إذا كنت تستخدم PHP و MySQL ، فهناك وظيفة MySQL_escape () أصلية مماثلة. (لست متأكدًا من أن وظيفة PHP تنشئ تقنيًا استعلامًا محددًا ، لكنه عمل جيدًا بالنسبة لي في منع محاولات حقن SQL حتى الآن منذ أن رأيت عددًا قليلًا تم تخزينه بأمان في DB.)

في حماية XSS ، اعتدت استخدام التعبيرات المنتظمة لتطهير المدخلات لهذا النوع من السبب ، لكنني ابتعدت منذ ذلك الحين من هذه الطريقة بسبب الصعوبة التي ينطوي عليها السماح بأشياء مثل الروابط مع إزالة الكود الخطير أيضًا. ما انتقلت إليه كبديل هو XSLT. مرة أخرى ، قد تختلف كيفية تنفيذ تحويل XSL مع المعتمد على النظام الأساسي الخاص بك. كتبت مقال لمجلة مطور Coldfusion منذ فترة حول كيفية القيام بذلك ، والتي تشمل كلا أ ورقة الغلاية XSL يمكنك استخدام وتوضح كيفية جعلها تعمل مع CF باستخدام وظيفة XMLTransform () الأصلية.

السبب الذي جعلني اخترت الانتقال إلى XSLT لهذا هو أضعاف.

أولاً ، فإن التحقق من صحة الإدخال يتم تشكيله بشكل جيد يزيل إمكانية هجوم XSS باستخدام بعض الحيل المسلحة.

ثانياً ، من الأسهل معالجة حزمة XHTML باستخدام محددات XSL و XPATH مما هي عليه مع تعبيرات منتظمة لأنها مصممة خصيصًا للعمل مع مستند XML منظم ، مقارنةً بالتعبيرات العادية التي تم تصميمها للمعالجة الأساسية. لذا ، فهي أكثر نظافة وأسهل ، فأنا أقل عرضة لارتكاب أخطاء ، وإذا وجدت أنني ارتكبت خطأ ، فمن الأسهل إصلاحه.

أيضًا عندما اختبرتها ، وجدت أن محرري WysiWyg مثل Ckeditor (قام بإزالة F) الحفاظ على XML المكون جيدًا ، لذلك لا يجب أن تقلق بشأن ذلك كمسألة محتملة.

نصائح أخرى

تنطبق نفس القواعد على الحماية: مرشح إدخال ، إخراج الهروب.

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

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

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

لا أفهم لماذا يقول الناس "استخدم الإجراءات المخزنة!" Procs المخزنة لا تعطي أي حماية خاصة ضد حقن SQL. إذا قمت باستراحة القيم غير المقيدة في سلاسل SQL وتنفيذ النتيجة ، فهذا عرضة لحقن SQL. لا يهم إذا كنت تفعل ذلك في رمز التطبيق مقابل Proc المخزنة.

عند الإخراج إلى عرض الويب ، excape HTML-special أحرف ، تمامًا كما تفعل مع أي نص.

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

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

أود أن أقول يمكن للمرء أن يحل محل الكل <، وما إلى ذلك (باستخدام htmlentities على PHP ، على سبيل المثال) ، ثم اختيار العلامات الآمنة مع نوع من القائمة البيضاء. المشكلة هي أن القائمة البيضاء قد تكون صارمة بعض الشيء.

هنا مثال PHP

$code = getTheCodeSnippet();
$code = htmlentities($code);
$code = str_ireplace("&lt;br&gt;", "<br>", $code); //example to whitelist <br> tags
//One could also use Regular expressions for these tags

لمنع حقن SQL ، يمكنك استبدال كل "و chars بواسطة" Innofensive "، مثل 'و ، بحيث يكون الخط C التالي

#include <stdio.h>//'); Some SQL command--

لن يكون لها أي نتائج سلبية في قاعدة البيانات.

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