पुराने दिनों में, जब वेब विकास इस तथ्य पर आधारित था कि सर्वर अनुप्रयोग रिलेशनल डेटाबेस के लिए अनुरोध भेजते थे और HTML आउटपुट जारी करते थे, तो यह कोड अक्सर होता है:
या ऐसे:
तब से, हमने सुरक्षित दृष्टिकोणों का उपयोग करना सीख लिया है।
व्यापक रूप से उपयोग किए जाने वाले उपकरण जैसे टेम्पलेट इंजन और पैरामीटर बाइंडिंग हैं। आज यह खतरनाक स्ट्रिंग संघनन खोजने के लिए दुर्लभ है।
इस लेख में, मैं कोड इंजेक्ट करके हमलों पर अपने विचार साझा करना चाहूंगा। जाहिर है, वे अभी भी जावास्क्रिप्ट में एक खतरा हैं।

यह समझने के लिए कि, हम असफल उदाहरणों में से एक को सरल टुकड़ों में तोड़ते हैं। इस तरह:
function f(userInput: A): A { const firstCommand: A = ...; const secondCommand: A = ...; return firstCommand.concat(userInput.concat(secondCommand)); }
जाहिर है,
कोड शुरू करने से हमलों का मूल कारण यह है कि कंप्यूटर के लिए कमांड और उपयोगकर्ता इनपुट के बीच कोई अंतर नहीं है! इसलिए, एक हमलावर डेटा दर्ज कर सकता है जिसे आगे कोड के रूप में संसाधित किया जाएगा।स्वाभाविक रूप से, जैसा कि मैंने कहा, इस तरह के हमलों के खिलाफ प्रसिद्ध बचाव हैं। इसके बजाय:
"SELECT name FROM users WHERE login = \"" + login + "\""
कुछ इस तरह लिखना बेहतर है:
query("SELECT name FROM users WHERE login = :login", {login})
इस प्रकार,
SELECT name FROM users WHERE login =:login
कमांड स्पष्ट रूप से
{login}
डेटा से अलग हो गया है। उसी समय, आंतरिक तंत्र यह सुनिश्चित करता है कि डेटा SQL क्वेरी में उपयोग के लिए तैयार है। उद्धरण से बचना और दुर्भावनापूर्ण कोड को इंजेक्ट करना विफल हो जाएगा।
हालाँकि, वेब अनुप्रयोग विकास फलफूल रहा है। इतना ही नहीं तेजी से पाया जाता है:
{ paramA: "the value of the A parameter", paramB: "the value of the A parameter", }
लेकिन यह भी:
{ paramA: "the value of the A parameter", paramB: {$in: [ "the value of the B parameter", "the value of the C parameter", ]}, }
दो विकल्पों के बीच एक महत्वपूर्ण अंतर यह है कि पैरामीटर मान एक ऑब्जेक्ट है जिसमें एक कमांड शामिल है!
मान लें कि
userInput
से मान पढ़े
userInput
:
{ paramA: userInput.paramA, paramB: {$in: [ userInput.paramB[0], userInput.paramB[1], ]}, }
दुर्भावनापूर्ण स्ट्रिंग प्रदान करने वाले उपयोगकर्ता के बारे में चिंता करने की कोई आवश्यकता नहीं है। सब कुछ सुरक्षित तरीके से संभाला जाएगा।
समस्या यह है कि पैरामीटर मान न केवल
the value of the A parameter
मान की तरह सरल मान हो सकते हैं, बल्कि आदेश भी देते हैं, उदाहरण के लिए
{$in: ["B", "C"]}
। उपयोगकर्ता विभिन्न तरीकों से एक अनुरोध भेज सकता है, जिसके डिक्रिप्शन के बाद एक ऑब्जेक्ट प्राप्त होता है (फॉर्म, JSON या XML), और इसलिए कोड को इंजेक्शन द्वारा हमला किया जा सकता है।
उपयोगकर्ता मान लें कि
userInput.paramA
{$empty: false}
। फिर क्वेरी निम्नानुसार है:
{ paramA: {$empty: false}, paramB: {$in: [ userInput.paramB[0], userInput.paramB[1], ]}, }
फिर, यह पता चला है कि कंप्यूटर के लिए विश्वसनीय कमांड अविश्वसनीय उपयोगकर्ता इनपुट से अप्रभेद्य हैं।
केवल अब यह विश्वसनीय और अविश्वसनीय तार के बारे में नहीं है, बल्कि विश्वसनीय और अविश्वसनीय वस्तुओं के बारे में है।इस समस्या से बचने के लिए, आपको हमेशा कमांड लिखना चाहिए ताकि वे उपयोगकर्ता से प्राप्त न हो सकें। इसे
रिएक्ट और
स्नैबडोम-सिग्नेचर (वर्चुअल डोम में इंजेक्शन के खिलाफ सुरक्षा के लिए एक छोटी सी लाइब्रेरी है) में उपयोग किए गए दृष्टिकोण का उपयोग करते हुए, अन्य चीजों के बीच महसूस किया जा सकता है, अर्थात्, प्रत्येक
Symbol
कमांड ऑब्जेक्ट को चिह्नित करना ताकि इसे नेटवर्क पर नहीं भेजा जा सके।
मैं मानता हूं, मैंने खुद सोचा है कि चूंकि कोई SQL डेटाबेस नहीं है या यदि मैं वर्चुअल डोम का उपयोग करता हूं, तो कोड को इंजेक्ट करके हमले मुझे धमकी नहीं देते हैं। मैं कितना गलत था!
LOOKING.HOUSE - इस परियोजना ने 40 देशों में ग्लास देखने के 150 से अधिक अंक एकत्र किए। आप जल्दी से होस्ट, पिंग, ट्रेसरआउट और एमआरटी कमांड निष्पादित कर सकते हैं।
