2015-12-14 10 views
6

मैंने HTML5 + जावास्क्रिप्ट में कुछ कोड लिखा है, जब कोई उपयोगकर्ता उपयोगकर्ता में अपना नाम दर्ज करता है, तो यह "Hello <user>" जैसा दिखाई देता है। अब यह स्क्रिप्ट XSS (क्रॉस साइट स्क्रिप्टिंग) के लिए कमजोर है।निम्नलिखित कोड में एक्सएसएस को कैसे रोकें?

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="utf-8"/> 
<title>Forms Welcome</title> 

<script> 
function write_name(){ 

    var welcome_parra = document.getElementById('welcome'); 
    var name = document.getElementById('name'); 
    welcome_parra.innerHTML = "welcome " + name.value; 
} 
</script> 
</head> 

<body> 
    <p id="welcome"></p> 
    <form> 
     Username: <input type="text" name="username" maxlength="20" id="name"/> 
     <input type="button" value="done"onclick="write_name();"> 
    </form> 
/body> 

</title> 

अब, जब मैं पेलोड "><img src=x onerror=prompt(404)> दर्ज करते हैं, मैं XSS के शीघ्र मिलती है:

यहाँ मेरी कोड है। तो मैं इसे कैसे सुधार सकता हूं?

क्या कोई भी मेजबान की जांच कर सकता है, कोशिश कर सकता है और बग पैच कर सकता है और मुझे कारण बता सकता है?

+0

हाय! Stackoverflow में आपका स्वागत है! मैंने आपका प्रश्न संपादित कर लिया है, आपको बाहरी प्रश्न के बजाय कोड को अपने प्रश्न में रखना चाहिए: डी – Zorgatone

+0

यह xSS के लिए _really_ कमजोर नहीं है क्योंकि कोई भी टेक्स्ट दर्ज नहीं कर सकता है और उपयोगकर्ता से अलग बटन पर क्लिक कर सकता है। यह एक तरह का ["स्वयं एक्सएसएस"] (https://en.wikipedia.org/wiki/Self-XSS) मुझे लगता है, लेकिन फिर वे डेवलपर टूल के माध्यम से ऐसा कर सकते हैं। – SilverlightFox

+0

हां, यह संग्रहीत एक्सएसएस के लिए कमजोर नहीं है, लेकिन स्वयं एक्सएसएस। लेकिन एक डेवलपर के रूप में, हमें भी इसे रोकने की ज़रूरत है :) @ सिल्वरलाइटफॉक्स –

उत्तर

4

आप की कोशिश कर सकते हैं:

function checkInput(string) { 
    var regex = /^[^0-9*\\\^\/<>_#']+$/; 
    if(regex.test(string)) { 
     return true; 
    } else { 
     return false; 
    } 
} 

इस प्रकार आप पता पत्र XSS हमलों के लिए इस्तेमाल किया जाता है या नहीं और फिर, बस प्रपत्र

ऊपर के बजाय भेज मैं भी इस का उपयोग न फॉर्मों के सत्यापन के लिए कार्य:

checkField:function(string, type) { 
    var regex; 
    switch (type) { 
     case "number": 
      regex = /^[\d]+$/; 
      break; 
     case "string": 
      regex = /^[^0-9*\\\^\/<>_#']+$/; 
      break; 
     case "email": 
      regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,7})+$/; 
      break; 
    } 
    if (regex.test(string)) { 
     return true; 
    } 
    return false; 
}, 

जहां आप जितना चाहें उतने मामलों को जोड़ सकते हैं और इसकी आवश्यकता है। मुझे आशा है कि यह किसी भी तरह

में तुम्हारी मदद कर सकता लेकिन XSS हमलों की 100% सुरक्षित होने के लिए आपको सर्वर पर प्रपत्र मान्य करने के लिए है, इसलिए मैं 2 सरल नियमों का पालन करें:
नियम नंबर एक: कभी नहीं प्रपत्र data' का उपयोग अनचेक
नियम संख्या दो: स्क्रिप्ट या कोड को <%>/\ और

पर

पर कभी भी फॉर्म डेटा का उपयोग न करें, क्योंकि मैं आपके फॉर्म को कॉपी कर सकता हूं और इसे सटीक पते पर भेज सकता हूं, मैं बाईपास करूंगा एक क्लाइंट साइड चेक/सत्यापन लेकिन आपके मामले के लिए, क्योंकि आप कहीं और फॉर्म नहीं भेजते हैं, इसलिए कोड दर्ज करने की रोकथाम पर्याप्त होनी चाहिए

यूपी तिथि:

जावास्क्रिप्ट सिर्फ उदाहरण

(+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+([][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[[+!+[]]+[!+[]+!+[]+!+[]+!+[]]]+[+!+[]]+([][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]])() 

जो चेतावनी विंडो में 1 बाहर दे देंगे के लिए, brainfuck आधार पर कुछ फैंसी XSS हमलों को संकलित करता है ...

उन उपयोग किए गए अक्षरों में अच्छी तरह से जाँच की जानी चाहिए

+0

धन्यवाद @ टीटाइम। हां, फॉर्म की सत्यापन में भी मदद मिली। मैंने एचटीएमएल - एन्कोड भी कोशिश की जो ठीक काम करता है। –

6

आप इसे एक्सएसएस-सुरक्षित बनाने के लिए इनपुट को HTML-एन्कोड कर सकते हैं।

function escapeInput(input) { 
    return String(input) 
      .replace(/&/g, '&amp;') 
      .replace(/"/g, '&quot;') 
      .replace(/'/g, '&#39;') 
      .replace(/</g, '&lt;') 
      .replace(/>/g, '&gt;'); 
} 

और उपयोगकर्ता एनकोड इनपुट: जोड़ें कार्य

<script> 
function write_name(){ 

    var welcome_parra = document.getElementById('welcome'); 
    var name = document.getElementById('name'); 
    welcome_parra.innerHTML = "welcome " + escapeInput(name.value); 
} 
</script> 
+0

ग्रेट। इसे आजमाया मदद के लिए बहुत बहुत धन्यवाद Pavel Morshenyuk :) –

0

यह बहुत आसान है, बस innerText बजाय innerHtml को आवंटित।

welcome_parra.innerText = "welcome " + name.value; 
संबंधित मुद्दे