तपाईंले प्रयोग भने स्ट्रिपचार प्रयोगकर्ता इनपुट सफा गर्न, तपाईं एक्लो हुनुहुन्न। धेरै विकासकर्ताहरू यस प्रकारको इनपुट सेनिटाइजेसन इंजेक्शन प्रयासहरू रोक्न। पहिलो नजरमा, यो तार्किक देखिन्छ, खतरनाक क्यारेक्टरहरू हटाउनुहोस्, र पेलोड गायब हुन्छ। यद्यपि, यो दृष्टिकोणले सुरक्षाको गलत भावना दिन्छ। वास्तवमा, आक्रमणकारीहरूले साधारण फिल्टरहरू जस्तै बाइपास गर्न सक्छन् स्ट्रिपचार प्रयोग अस्पष्ट पेलोडहरू, एन्कोडिङहरू, वा चलाख सन्दर्भ स्विचिङ। त्यसैले स्मार्ट विकासकर्ताहरू त्यहाँ रोकिँदैनन्। बरु, तिनीहरू प्रयोग गर्छन् प्यारामिटराइज्ड क्वेरीहरू, जसले जरामा इंजेक्शन आक्रमणलाई रोक्छ।
यस पोस्टमा, तपाईंले किन सिक्नुहुनेछ स्ट्रिपचार वास्तविक-विश्व परिदृश्यहरूमा असफलता, आक्रमणकारीहरूले यी फिल्टरहरूको दुरुपयोग कसरी गर्छन्, र वास्तवमा कुन सुरक्षित विकल्पहरूले काम गर्छन्। हामी कोड उदाहरणहरू हेर्नेछौं, सामान्य बाइपास प्रविधिहरू देखाउँछौं, र कसरी व्याख्या गर्नेछौं इनपुट सेनिटाइजेसन सधैं संरचनात्मक सुरक्षाहरूसँग जोडिएको हुनुपर्छ जस्तै प्यारामिटराइज्ड क्वेरीहरू, नत्र तपाईं कमजोर रहनुहुनेछ।
के स्ट्रिपचार वास्तवमा गर्छ (र गर्दैन)
धेरै विकासकर्ताहरूले प्रयोग गर्छन् stripchar वा प्रयोगकर्ता इनपुटबाट असुरक्षित वर्णहरू हटाउन समान प्रकार्यहरू। सामान्यतया, यसले विराम चिह्न, विशेष प्रतीकहरू, वा अल्फान्यूमेरिक बाहेकका केहि पनि हटाउँछ। सुरुमा, त्यो जस्तो लाग्छ इनपुट सेनिटाइजेसन, तर यो वास्तविक सुरक्षा होइन।
यसलाई बिच्छेद गरौं। यस्तो प्रकार्य:
function stripchar(input) {
return input.replace(/[^\w\s]/gi, '');
}
जस्ता क्यारेक्टरहरू हटाउँछ ', "वा ;। त्यसैले, यदि तपाईंले प्रविष्ट गर्नुभयो भने:
'; DROP TABLE users; --
यो बन्छ:
DROP TABLE users
प्रयोगकर्ताको इनपुट सफा देखिए पनि, आक्रमणकारीहरूले अझै पनि तर्क प्रयोग गरेर SQL पेलोडहरू इन्जेक्ट गर्न सक्छन्, विशेष गरी जब अनुप्रयोगले स्ट्रिङ कन्केटेनेसन मार्फत प्रश्नहरू निर्माण गर्दछ। साँच्चै SQL इंजेक्शन रोक्नको लागि, तपाईंले प्यारामिटराइज्ड क्वेरीहरू र सन्दर्भ-सचेत इनपुट ह्यान्डलिङ प्रयोग गर्नुपर्छ। क्यारेक्टर फिल्टरहरू जस्तै stripchar() पर्याप्त छैनन्।
पक्कै पनि, स्ट्रिप गरिएको इनपुट एक नजरमा सुरक्षित देखिन सक्छ। यद्यपि, यो दृष्टिकोणले दुर्भावनापूर्ण तर्कलाई बेअसर गर्दैन, यसले यसलाई लेख्ने तरिका मात्र परिवर्तन गर्छ। वास्तवमा, आक्रमणकारीहरूले प्रायः पेलोडहरू एन्कोड गरेर, ह्वाइटस्पेस घुसाएर, वा हटाइएका क्यारेक्टरहरू प्रयोग गरेर तपाईंको फिल्टरलाई पूर्ण रूपमा बाइपास गरेर यसको फाइदा उठाउँछन्।
यसबाहेक, स्ट्रिपचार महत्वपूर्ण सन्दर्भको अभाव छ। यसलाई थाहा छैन कि इनपुट डाटाबेस, शेल, वा ब्राउजरमा जाँदैछ कि छैन। यसको मतलब यो सही एस्केपिङ वा एन्कोडिङ लागू गर्न सक्दैन। गन्तव्य थाहा नपाई इनपुटलाई सेनिटाइज गर्नु भनेको HTML बाट भाग्नु जस्तै हो जबकि वास्तविक खतरा SQLi.
अन्तमा, स्ट्रिपचार कुनै पनि कुराको व्याख्या वा सुरक्षा गर्दैन, यसले केवल स्ट्रिङहरू सम्पादन गर्दछ। र सम्पादन सुरक्षा होइन। यदि तपाईं वास्तविक सुरक्षा चाहनुहुन्छ भने, संरचित, मान्य, र प्यारामिटराइज्ड क्वेरीहरू प्रयोग गर्नुहोस्। पूर्णविराम।
भिन्नतालाई स्पष्ट पार्न, स्ट्रिपचारले प्यारामिटराइज्ड क्वेरीहरूसँग कसरी तुलना गर्छ भनेर यहाँ दिइएको छ:
स्ट्रिपचार बनाम प्यारामिटराइज्ड क्वेरीहरू: कुनले वास्तवमा तपाईंको कोडलाई सुरक्षित गर्छ?
| फिचर | stripchar() | प्यारामिटराइज्ड प्रश्नहरू |
|---|---|---|
| सुरक्षा स्तर | आधारभूत स्ट्रिङ सफाई। एन्कोडिङ वा तर्क युक्तिहरू प्रयोग गरेर सजिलै बाइपास गर्न सकिन्छ। | सबै प्रकारका SQL इंजेक्शन विरुद्ध बलियो सुरक्षा। |
| सन्दर्भ जागरूकता | सन्दर्भमा अन्धो (SQL, HTML, शेल, आदि)। सबैतिर समान नियम लागू हुन्छ। | पूर्ण रूपमा सन्दर्भ-सचेत। प्रत्येक वातावरणको लागि उचित एस्केपिङ प्रयोग गर्दछ। |
| विकासकर्ता प्रयास | कार्यान्वयन गर्न छिटो तर दीर्घकालीन प्रयोगको लागि अविश्वसनीय। | सही एकीकरण आवश्यक छ, तर बलियो र भविष्य-प्रमाण। |
| बाइपास प्रतिरोध | कम — आक्रमणकारीहरूले ह्वाइटस्पेस, इन्कोडिङ, वा तर्क प्रयोग गरेर सजिलै अनुकूलन गर्छन्। | उच्च — ले कोडलाई डेटाबाट अलग गर्छ र भरपर्दो रूपमा इन्जेक्सनलाई रोक्छ। |
| सुरक्षा विश्वास | सुरक्षाको गलत भावना - समस्या समाधान नगरी लुकाउन सक्छ। | विश्वसनीय उद्योग standard सुरक्षित क्वेरी कार्यान्वयनको लागि। |
आक्रमणकारीहरूले इनपुट सेनिटाइजेसनलाई कसरी बाइपास गर्छन्
विकासकर्ताहरूले भर पर्दा सामान्य कमजोर प्रवाह यसरी देखिन्छ स्ट्रिपचार इनपुट सेनिटाइजेसनको लागि:
आक्रमणकारीहरूले तपाईंको फिल्टरहरू तोड्नु पर्दैन, तिनीहरूलाई केवल तिनीहरूको वरिपरि जानुहोस्। जब विकासकर्ताहरू भर पर्छन् स्ट्रिपचार इनपुट सेनिटाइजेसनको लागि, तिनीहरू प्रायः मान्छन् कि उद्धरण वा अर्धविराम जस्ता वर्णहरू हटाउनाले इंजेक्शन प्रयासहरूलाई रोक्नेछ। यद्यपि, आक्रमणकारीहरू चाँडै अनुकूल हुन्छन्। तिनीहरूले अस्पष्ट पेलोडहरू जुन रेजेक्स-आधारित फिल्टरहरूबाट चिप्लिन्छन्, विशेष गरी जब ती फिल्टरहरूमा सन्दर्भको अभाव हुन्छ।
उदाहरणका लागि, मानौं तपाईंले यसरी इनपुटलाई सेनिटाइज गर्ने प्रयास गर्नुभयो:
const input = stripchar(userInput);
// safe to use? maybe not.
db.query("SELECT * FROM users WHERE name = '" + input + "'");
प्रयोगकर्ताले क्लासिक पेश गर्न नसके पनि ' OR 1=1 --, तिनीहरूले युनिकोड ट्रिक्स, स्ट्रिङ कन्केटेनेसन, वा अझै पनि चल्ने टुटेको वाक्य रचना प्रयोग गर्न सक्छन्। यस्ता पेलोडहरूले प्रायः काम गर्छन्:
0x27206F7220313D31--
वा:
'+UNION+SELECT+null,null,null--
यदि तपाईंको प्रकार्यले शब्द नभएका वर्णहरू हटाउँछ भने, तपाईंले गल्तिले वैध SQL आदेश पुनर्निर्माण गर्नुहोस्। अझ नराम्रो कुरा, आक्रमणकारीहरूले मानहरूलाई तपाईंको फिल्टर पास गर्ने तर लक्षित प्रणालीद्वारा डिकोड हुने तरिकाले इन्कोड गर्न सक्छन्।
SQL इंजेक्शनको अतिरिक्त, स्ट्रिपचार अन्य सन्दर्भहरूमा पनि असफल हुन्छ, जस्तै शेल कमाण्डहरू, फाइल मार्गहरू, वा जाभास्क्रिप्ट कार्यान्वयन। इनपुट कहाँ प्रयोग गरिनेछ भन्ने बारे कुनै जानकारीको अभाव भएकोले, यसले उचित एस्केपिङ वा प्रमाणीकरण लागू गर्न सक्दैन।
फलस्वरूप, इनपुट सेनिटाइजेसन संग स्ट्रिपचार बाइपास गर्न सजिलो छ। वास्तविक सुरक्षा यहाँबाट आउँछ सन्दर्भ-सचेत नियन्त्रणहरू, विशेष गरी प्यारामिटराइज्ड क्वेरीहरू जसले तर्क इंजेक्शनलाई पूर्ण रूपमा रोक्छ।
किन तपाईंले प्यारामिटराइज्ड प्रश्नहरू प्रयोग गर्नुपर्छ
यदि तपाईं इंजेक्शन आक्रमणहरू साँच्चै रोक्न चाहनुहुन्छ भने, तपाईंले स्ट्रिङहरू प्रयोग गरेर प्रश्नहरू निर्माण गर्न रोक्नुहोस्। त्यहीँ हो प्यारामिटराइज्ड क्वेरीहरू भित्र आउनुहोस्। विपरीत स्ट्रिपचार, तिनीहरूले फिल्टर गर्दैनन्, तिनीहरूले डेटाबाट कोड अलग गर्नुहोस् इन्जिन स्तरमा।
टुटेको प्रश्नलाई फेरि हेरौं:
const input = stripchar(userInput);
const query = "SELECT * FROM users WHERE name = '" + input + "'";
यो खतरनाक छ किनकि इनपुट सिधै SQL मा इन्जेक्ट हुन्छ। क्यारेक्टर स्ट्रिपिङको साथ पनि, तपाईं अझै पनि एक स्ट्रिङ निर्माण गर्दै हुनुहुन्छ जुन दुरुपयोग हुन सक्छ। बरु, यो जस्तै प्यारामिटराइज्ड क्वेरी प्रयोग गर्नुहोस्:
const query = "SELECT * FROM users WHERE name = ?";
db.execute(query, [userInput]);
यहाँ, डाटाबेस ड्राइभरलाई थाहा छ कि userInput तथ्याङ्क हो, कार्यान्वयनयोग्य कोड होइन। इनपुटमा उद्धरण, अर्धविराम, वा हेक्स-इन्कोडेड पेलोडहरू भए पनि यसले स्वचालित रूपमा यसलाई छोड्छ र इंजेक्शनलाई रोक्छ।
पाइथनमा:
cursor.execute("SELECT * FROM users WHERE name = %s", (user_input,))
PDO सहितको PHP मा:
$stmt = $pdo->prepare("SELECT * FROM users WHERE name = :name");
$stmt->execute(['name' => $input]);
यी सबै उदाहरणहरूमा, प्यारामिटराइज्ड क्वेरीहरू कुन क्यारेक्टरहरू खतरनाक हुन सक्छन् भनेर अनुमान नगरीकन इंजेक्शन रोक्नुहोस्। तपाईंलाई आवश्यक छैन स्ट्रिपचार, तपाईंलाई संरचित, सन्दर्भ-सचेत क्वेरी निर्माण चाहिन्छ।
थप रूपमा, यो प्रविधिले अस्पष्ट पेलोडहरू, युनिकोड ट्रिक्सहरू, र एन्कोडिङ बाइपासहरूलाई रोक्छ, जुन उही अपहेलना ढाँचाहरूमा पाइन्छ। XSS कमजोरीहरू। Xygeni जस्ता उपकरणहरूले यी खतराहरूलाई चाँडै नै समात्छन् SAST विश्लेषण.
छोटकरीमा भन्नुपर्दा, वास्तविक प्रतिरक्षाहरू फिल्टरहरूमा भर पर्दैनन्। तिनीहरू प्रोटोकलहरू, विश्वसनीय API हरू, र पूर्ण सन्दर्भमा भर पर्छन्। यदि तपाईं फ्रेमवर्क वा गतिशील सेवा इन्जेक्सन प्रयोग गर्नुहुन्छ भने, इनपुटहरू तपाईंको कोडबेस मार्फत कसरी प्रचार हुन्छन् भन्ने बारे सचेत रहनुहोस्। सुरक्षित निर्भरता इंजेक्शन जटिल प्रवाहहरूले पनि नयाँ आक्रमण सतहहरू नखोल्ने कुरा सुनिश्चित गर्दछ।
भर नपर्नुहोस् स्ट्रिपचारवास्तविक प्रतिरक्षा बलियो बनाउन Xygeni प्रयोग गर्नुहोस्।
प्रयोग गरे पनि प्यारामिटराइज्ड क्वेरीहरू, तपाईंको सम्पूर्ण कोडबेसले उही पछ्याउँछ भन्ने कुनै ग्यारेन्टी छैन standard। लिगेसी लजिक, तेस्रो-पक्ष स्क्रिप्टहरू, वा PR मा बेवास्ता गरिएका लाइनहरूले अझै पनि इंजेक्शन जोखिमहरू प्रस्तुत गर्न सक्छन्। ठ्याक्कै त्यहीं हो जहाँ Xygeni ले मद्दत गर्छ।
Xygeni ले तपाईंको स्रोत कोड स्क्यान गर्छ, pull requests, र CI pipelineसमात्नको लागि:
- क्वेरी स्ट्रिङहरू जसले कन्केटेनेसनको साथ SQL निर्माण गर्दछ
- कमजोर वा घरेलु फिल्टरहरू जस्तै स्ट्रिपचार
- ज्ञात अस्पष्ट पेलोडहरूसँग मेल खाने शंकास्पद तर्क
तपाईंले हरेक लाइनमा कंघी गर्नु पर्दैन। Xygeni ले असुरक्षित ढाँचाहरूलाई चाँडै नै फ्ल्याग गर्छ, लागू हुन्छ। स्वतः समाधान सम्भव भएसम्म, र अनुकूलन योग्यसँग जोखिमपूर्ण मर्जहरूलाई रोक्न सक्छ Guardrails.
छोटकरीमा, Xygeni ले प्यारामिटराइज्ड क्वेरीहरू केवल एक उत्तम अभ्यास मात्र होइनन्, तिनीहरू व्यापक रूपमा लागू हुन्छन् भनी सुनिश्चित गर्दछ। अब कुनै अनुमान लगाउनु पर्दैन। छुटेका फिल्टरहरू छैनन्। केवल वास्तविक सुरक्षा।f
तपाईंको कोडमा Xygeni ले असुरक्षित प्रश्नहरू कसरी फेला पार्छ भनेर हेर्न चाहनुहुन्छ?
मुख्य कुराहरू: के कुरा सम्झनु पर्छ स्ट्रिपचार र इंजेक्शन जोखिमहरू
- स्ट्रिपचार यो सुरक्षा कार्य होइन — यसले पात्रहरूलाई हटाउँछ, जोखिम होइन।
- इनपुट सेनिटाइजेसन पर्याप्त छैन जब तपाईं स्ट्रिङ कन्केटेनेसनको साथ क्वेरीहरू निर्माण गर्दै हुनुहुन्छ।
- प्यारामिटराइज्ड क्वेरीहरू सही प्रतिरक्षा हुन्, र हरेक आधुनिक भाषा वा रूपरेखाले तिनीहरूलाई समर्थन गर्दछ।
- अस्पष्ट पेलोडहरू फिल्टरहरूबाट चिप्लन सक्छन्, विशेष गरी यदि एन्कोडिङ ट्रिक्सहरू समावेश छन् भने।
- स्थिर विश्लेषण (SAST) मानिसहरूले गुमाएको कुरा उपकरणहरूले समात्छन्, लेगेसी कोडमा लुकेका असुरक्षित ढाँचाहरू सहित।
- Xygeni ले पत्ता लगाउने, प्राथमिकीकरण गर्ने, र उपचार गर्ने कामलाई पनि स्वचालित बनाउँछ ताकि तपाईंको टोलीले कमजोरीहरूको पछि नलागी, सुविधाहरू लेखनमा ध्यान केन्द्रित गर्न सकोस्।
निष्कर्ष: फिल्टरहरूमा विश्वास नगर्नुहोस्। डिजाइनद्वारा सुरक्षित।
जस्ता कार्यहरूमा भर पर्दै स्ट्रिपचार द्रुत समाधान जस्तो लाग्न सक्छ, तर तिनीहरूले सुरक्षाको गलत भावना सिर्जना गर्छन्। आक्रमणकारीहरू स्ट्रिङ फिल्टरहरू भन्दा छिटो विकसित हुन्छन्। इंजेक्शन आक्रमणहरू रोक्ने एक मात्र भरपर्दो तरिका भनेको डिजाइनद्वारा सुरक्षित कोड लेख्नु र त्यो डिजाइनलाई सबैतिर लागू गर्नु हो।
Xygeni जस्ता उपकरणहरूले तपाईंलाई त्यो स्वचालित रूपमा गर्न मद्दत गर्छन्। बाट pull request लाई pipeline, तिनीहरूले तपाईंको फिल्टरले नबुझेको कुरा समात्छन्, र उत्पादनमा पुग्नु अघि नै यसलाई ठीक गर्छन्।







