القائمة البيضاء ، ومنع XSS مع التحكم في WMD في C#
سؤال
هل هناك أي مشاكل مع ما أفعله هنا؟ هذه هي المرة الأولى التي أتعامل فيها مع شيء من هذا القبيل ، وأريد فقط التأكد من فهم كل المخاطر ، وما إلى ذلك لطرق مختلفة.
أنا أستخدم WMD للحصول على إدخال المستخدم ، وأنا أعرضه مع عنصر تحكم حرفي. نظرًا لأنه غير قابل للدخول بمجرد دخوله ، سأقوم بتخزين HTML وليس التمييز ،
input = Server.HTMLEncode(stringThatComesFromWMDTextArea)
ثم قم بتشغيل شيء مثل ما يلي للعلامات التي أريد أن يتمكن المستخدمون من استخدامه.
// Unescape whitelisted tags.
string output = input.Replace("<b>", "<b>").Replace("</b>", "</b>")
.Replace("<i>", "<i>").Replace("</i>", "</i>");
تعديل هذا ما أفعله حاليًا:
public static string EncodeAndWhitelist(string html)
{
string[] whiteList = { "b", "i", "strong", "img", "ul", "li" };
string encodedHTML = HttpUtility.HtmlEncode(html);
foreach (string wl in whiteList)
encodedHTML = encodedHTML.Replace("<" + wl + ">", "<" + wl + ">").Replace("</" + wl + ">", "</" + wl + ">");
return encodedHTML;
}
- هل سيبقي ما أفعله هنا محميًا من XSS?
- هل هناك أي اعتبارات أخرى يجب تقديمها؟
- هل هناك قائمة جيدة من العلامات العادية إلى القائمة البيضاء؟
المحلول
إذا كانت متطلباتك هي الأساسية حقًا بحيث يمكنك القيام بدائل السلسلة البسيطة ، فهذا "آمن" مقابل XSS. (ومع ذلك ، لا يزال من الممكن تقديم محتوى غير بئر حيث <i>
و <b>
تكون خاطئًا أو غير مغلفة ، والتي يمكن أن تعبث في الصفحة التي ينتهي بها المحتوى.
ولكن هذا نادرا ما يكفي. على سبيل المثال حاليا <a href="...">
أو <img src="..." />
ليست مسموحة. إذا كنت ترغب في السماح لهذه العلامات أو أي علامة أخرى مع قيم السمات ، فسيكون لديك المزيد من العمل للقيام به. يمكنك بعد ذلك التعامل معها مع Regex ، ولكن هذا يمنحك مشاكل لا نهاية لها مع التعشيش العرضي واستبدال المحتوى الذي تم إعادة تكوينه بالفعل ، مع رؤية كيف لا يمكن لـ Regex تحليل HTML ، وذلك.
لحل كلتا المشكلتين ، يتمثل النهج المعتاد في استخدام محلل [X] [HT] ML على المدخلات ، ثم المشي في DOM لإزالة جميع العناصر والسمات المعروفة ، ثم إعادة تخصيصها أخيرًا إلى [X] HTML. ثم يتم ضمان النتيجة بشكل جيد وتحتوي على محتوى آمن فقط.