2009-11-09 16 views
5

से कैसे सुरक्षित रखें मेरे पास एक फॉर्म टेक्स्ट फ़ील्ड है जो यूआरएल स्वीकार करता है। जब फॉर्म सबमिट किया जाता है, तो मैं इस क्षेत्र को उचित एंटी-एसक्यूएल-इंजेक्शन के साथ डेटाबेस में डालता हूं। मेरा सवाल हालांकि xss के बारे में है।इनपुट यूआरएल है, इसे xss

यह इनपुट फ़ील्ड एक यूआरएल है और मुझे इसे पृष्ठ पर फिर से प्रदर्शित करने की आवश्यकता है। मैं इसे डेटाबेस में रास्ते में xss से कैसे सुरक्षित रखूं (मुझे लगता है कि मैंने पहले से ही एसक्यूएल इंजेक्शन का ख्याल रखा है) और डेटाबेस से बाहर की आवश्यकता नहीं है?

आइए दिखाएं कि हमारे पास ऐसा है, मैं इसे सरल बना रहा हूं, और कृपया एसक्यूएल इंजेक्शन के बारे में चिंता न करें। उसके बाद मैं कहां से जाऊं?

$url = $_POST['url']; 

धन्यवाद

+1

सुनिश्चित करें और SQL इंजेक्शन से बचने के लिए तैयार कथन का उपयोग करें। http://php.net/manual/en/pdo.prepared-statements.php –

उत्तर

9

यह मानते हुए (जैसे <body> और </body> या </div> के बीच <div> और के बीच के रूप में) HTML सामग्री में डाल दिया जा रहा है, आप 5 विशेष एक्सएमएल वर्ण (&, < सांकेतिक शब्दों में बदलना करने की जरूरत है, >, ", '), और OWASP स्लैश (/) के साथ-साथ पीएचपी निर्मित, htmlentities() आप के लिए पहले भाग करना होगा, और एक सरल str_replace() स्लेश कर सकते हैं सहित सिफारिश की गई है:।

function makeHTMLSafe($string) { 
    $string = htmlentities($string, ENT_QUOTES, 'UTF-8'); 
    $string = str_replace('/', '&#x2F;', $string); 
    return $string; 
} 

यदि, हालांकि, आप href=<a के खंड को href= क्लॉज जैसे टेंट किए गए मान को डालने जा रहे हैं, तो आपको वर्णों के एक अलग सेट को एन्कोड करने की आवश्यकता होगी ([space]% * + , - /; < =>^और |) और आप दोहरे-उद्धरण अपने HTML गुण होना चाहिए:

function makeHTMLAttributeSafe($string) { 
    $scaryCharacters = array(32, 37, 42, 43, 44, 45, 47, 59, 60, 61, 62, 94, 124); 
    $translationTable = array(); 
    foreach ($scaryCharacters as $num) { 
     $hex = str_pad(dechex($num), 2, '0', STR_PAD_LEFT); 
     $translationTable[chr($num)] = '&#x' . $hex . ';'; 
    } 

    $string = strtr($string, $translationTable); 
    return $string; 
} 

अंतिम चिंता अवैध UTF-8 है वर्ण-जब कुछ ब्राउज़रों के लिए भेजा जाए, तो बीमार का गठन UTF-8 बाइट क्रम एक HTML इकाई से बाहर तोड़ सकते हैं। इस के खिलाफ की रक्षा के लिए, बस सुनिश्चित करें कि सभी UTF-8 वर्ण आपको मिल मान्य हैं:

function assertValidUTF8($string) { 
    if (strlen($string) AND !preg_match('/^.{1}/us', $string)) { 
     die; 
    } 

    return $string; 
} 

कि नियमित अभिव्यक्ति पर u संशोधक यह एक यूनिकोड मिलान regex बनाता है। एक एकल chararchter, . से मिलान करके, हमें आश्वासन दिया जाता है कि पूरी स्ट्रिंग मान्य यूनिकोड है।

चूंकि यह सभी संदर्भ-निर्भर है, इसलिए नवीनतम संभव पल में इस एन्कोडिंग को करने के लिए सबसे अच्छा है-बस उपयोगकर्ता को आउटपुट प्रस्तुत करने से पहले। इस अभ्यास में होने से आपके द्वारा याद किए गए किसी भी स्थान को देखना आसान हो जाता है।

OWASP उनके XSS prevention cheat sheet पर बहुत सारी जानकारी प्रदान करता है।

+0

मैंने कभी भी एचटीएमएल विशेषताओं, कॉन्ट्रैक्ट टेक्स्ट तत्वों के साथ किसी विशेष सावधानी बरतने के बारे में नहीं सुना है। क्या आपके पास इसके लिए कोई संदर्भ/स्पष्टीकरण है? – troelskn

+2

आह .. मेरे अपने प्रश्न का उत्तर देने के लिए, ओडब्ल्यूएएसपी इसकी सिफारिश करता है क्योंकि इसकी आवश्यकता है * यदि गुण उद्धृत नहीं किए गए हैं *। मैं इसके बजाय विशेषताओं को उद्धृत करने की अनुशंसा करता हूं। – troelskn

+0

एचटीएमएल विशेषताओं में शामिल करने के लिए अक्षरों को एन्कोड करने के लिए, ओडब्ल्यूएएसपी कहते हैं (जोर मेरा) "** [स्पेस]% * +, - /; < = >^और |" सहित कई वर्णों के साथ निर्विवाद विशेषताओं को तोड़ दिया जा सकता है। " । तो बस इन एन्कोडिंग पर्याप्त नहीं होना चाहिए? – Lode

1

उपयोगकर्ता को प्रदर्शित करने से पहले आपको htmlspecialchars के साथ इसे एन्कोड करने की आवश्यकता है। आम तौर पर यह < स्क्रिप्ट > टैग और/या HTML टैग विशेषताओं के बाहर डेटा से निपटने के दौरान पर्याप्त है।

1

अपने स्वयं के एक्सएसएस-सुरक्षा को न रोल करें, कुछ ऐसे तरीके हैं जो कुछ हद तक फिसल सकते हैं (मुझे अब एक निश्चित एक्सएसएस-डेमोपेज का लिंक नहीं मिल रहा है, लेकिन संभावनाओं की मात्रा चौंकाने वाली है: टूटा आईएमजी- टैग, अजीब विशेषताएँ आदि)।

मौजूदा लाइब्रेरी का उपयोग करें जैसे sseq-lib या एक स्थापित ढांचे से निकालें।

अद्यतन: यहां the XSS-demopage है।

संबंधित मुद्दे