أفضل طريقة للتعامل مع الأمن وتجنب XSS مع المستخدم إدخال عناوين url

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

سؤال

لدينا عالية ، نحن نريد أن تسمح للمستخدمين إدخال عناوين url الأخرى المستخدمين سوف نرى.

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

ما هي أفضل الممارسات في التعامل مع هذا ؟ أي أمن البيضاء أو الهروب نمط وحدها كافية ؟

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

هل هناك حجة لعدم دعم المستخدم دخل الروابط في كل شيء ؟


التوضيح:

أساسا المستخدمين ترغب في إدخال:

stackoverflow.com

و قد خرج إلى مستخدم آخر:

<a href="http://stackoverflow.com">stackoverflow.com</a>

ما أنا قلق حقا هو لهم باستخدام هذا في XSS هاك.أولا-هاء.أنها الإدخال:

alert('اخترق!');

حتى المستخدمين الآخرين على هذا الرابط:

<a href="alert('hacked!');">stackoverflow.com</a>

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

سوف يكون لكم عن دهشتها كيف العديد من المواقع يمكنك كسر مع هذه الخدعة - HTML هو أسوأ من ذلك.إذا كانوا يعرفون التعامل مع الارتباطات وهم يعرفون أيضا أن sanitise <iframe>, <img> وذكي CSS المراجع ؟

أنا أعمل في البيئة الأمنية - واحد XSS هاك يمكن أن يؤدي عالية جدا الخسائر بالنسبة لنا.أنا سعيد لأنني يمكن أن تنتج باستخدام التعابير المنطقية (أو استخدام واحدة من الاقتراحات الممتازة حتى الآن) التي يمكن أن تستبعد كل ما كنت أفكر فيه, ولكن هل سيكون هذا كافيا ؟

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

المحلول

إذا كنت تعتقد عناوين لا يمكن أن يحتوي الرمز، اعتقد مرة أخرى!

https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet

وقراءة ذلك، وبكاء.

وهنا كيف لنا أن نفعل ذلك على تجاوز المكدس:

/// <summary>
/// returns "safe" URL, stripping anything outside normal charsets for URL
/// </summary>
public static string SanitizeUrl(string url)
{
    return Regex.Replace(url, @"[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]", "");
}

نصائح أخرى

عملية التقديم على الرابط "آمنة" يجب أن تذهب من خلال ثلاث أو أربع خطوات:

  • Unescape/إعادة ترميز سلسلة كنت قد أعطيت (RSnake توثيق عدد من الحيل في http://ha.ckers.org/xss.html أن استخدام الهرب UTF ترميزات).
  • تنظيف رابط:Regexes بداية جيدة - تأكد من اقتطاع السلسلة أو رميها بعيدا إذا كان يحتوي على " (أو مهما كنت تستخدم لإغلاق الصفات في الإخراج) ؛ إذا كنت تفعل الروابط فقط إشارات إلى معلومات أخرى يمكنك أيضا قوة البروتوكول في نهاية هذه العملية - إذا كان جزء قبل أول القولون ليست 'http' أو 'https' ثم إلحاق 'http://' إلى البداية.هذا يسمح لك لخلق صالحة للاستعمال الروابط غير مكتملة من مدخلات المستخدم اكتب في المتصفح ويعطيك الطلقة الأخيرة في التعثر مهما كان الأذى شخص حاول التسلل.
  • تحقق من أن النتيجة هي تشكيل جيدا URL (البروتوكول://host.المجال[:بورت][/مسار][/[ملف]][?queryField=queryValue][#مرساة]).
  • ربما تحقق النتيجة ضد الموقع القائمة السوداء أو محاولة جلب ذلك من خلال نوع من البرمجيات الخبيثة المدقق.

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

استخدام المكتبة ، مثل OWASP-ESAPI API:

قراءة ما يلي:

على سبيل المثال:

$url = "http://stackoverflow.com"; // e.g., $_GET["user-homepage"];
$esapi = new ESAPI( "/etc/php5/esapi/ESAPI.xml" ); // Modified copy of ESAPI.xml
$sanitizer = ESAPI::getSanitizer();
$sanitized_url = $sanitizer->getSanitizedURL( "user-homepage", $url );

مثال آخر هو استخدام المدمج في وظيفة.PHP filter_var وظيفة مثال:

$url = "http://stackoverflow.com"; // e.g., $_GET["user-homepage"];
$sanitized_url = filter_var($url, FILTER_SANITIZE_URL);

باستخدام filter_var يسمح جافا سكريبت المكالمات و فلاتر المخططات التي لا http ولا https.باستخدام OWASP ESAPI المطهر هو على الأرجح أفضل خيار.

وهناك مثال آخر هو رمز من وورد:

بالإضافة إلى ذلك, لأنه ليس هناك أي وسيلة لمعرفة أين الروابط URL (أي أنه قد يكون عنوان URL صالح ، ولكن محتويات عنوان URL يمكن أن يكون مؤذ), جوجل لديها التصفح الآمن API يمكنك الاتصال على:

المتداول الخاصة بك regex الصرف الصحي إشكالية لعدة أسباب:

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

قضايا أخرى للنظر في:

  • ما خطط هل تصريح (هي file:/// و telnet:// مقبولة)?
  • ما القيود هل تريد أن تضع على محتوى الرابط (هي البرمجيات الخبيثة عناوين مقبولة)?

وفقط HTMLEncode الروابط عند الناتج منها. تأكد من أنك لا تسمح الروابط javascript:. (فمن الأفضل أن يكون البيضاء من البروتوكولات التي تم قبولها، على سبيل المثال، HTTP و HTTPS، وميلتو).

وأنت لم تحدد لغة التطبيق الخاص بك، وأنا أفترض ثم ASP.NET، ولهذا يمكنك استخدامها في مكافحة الكتابة عبر الموقع مكتبة مايكروسوفت

فمن السهل جدا للاستخدام، كل ما تحتاجه هو التضمين وهذا هو عليه:)

وبينما كنت في هذا الموضوع، لماذا لا تعطى للقراءة على التصميم مبادئ توجيهية لتطبيقات الويب الآمنة

إذا أي لغة أخرى .... إذا كان هناك مكتبة للASP.NET، يجب أن تكون متاحة كذلك لنوع آخر من لغة (PHP، بيثون، ROR، الخ)

وماذا عن عدم عرضها كحلقة وصل؟ مجرد استخدام النص.

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

<قوية> إضافة - يمكنك انظر أيضا وأود أن تطهير HTML الترميز لCMS استضافت؟ لمناقشة التعقيم إدخال المستخدم

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

 url.match(/^((https?|ftp):\/\/|\.{0,2}\/)/)

والقيد الوحيد هو أن تحتاج إلى وضع ./ أمام لملفات في نفس الدليل ولكن أعتقد أنني أستطيع العيش مع ذلك.

لPythonistas، في محاولة Scrapy في w3lib .

OWASP ESAPI قبل مواعيد بيثون 2.7 و أرشفة على في مدونة جوجل المنحل .

هل يمكن استخدام رمز عرافة لتحويل URL كامل وإرساله إلى الخادم الخاص بك. وبهذه الطريقة فإن العميل لا يفهم محتوى في أول وهلة. بعد قراءة المحتوى، هل يمكن فك شفرة URL = المحتوى؟ وإرساله إلى المتصفح.

والسماح لURL والسماح للجافا سكريبت ل2 أشياء مختلفة.

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