2010-07-31 7 views
7

.NET या इसकी कई भाषाओं में से अविश्वसनीय डेटा की सफाई को लागू करने के लिए लागू करें या गलत में आकस्मिक चर उपयोग को रोकें स्थानों?"स्वच्छ" डेटा की आवश्यकता वाले कार्यों के खिलाफ उपयोग किए जाने वाले गंदे डेटा को रोकने के लिए विस्तार प्रकार सुरक्षा सुरक्षा

इसका एक उदाहरण यह है कि जब उपयोगकर्ता पोस्ट का डेटा और "कच्चे" प्रतिक्रिया SQL लेनदेन के भीतर उपयोग की जाती है। इससे क्लाइंट-साइड स्क्रिप्टिंग भेद्यता से पूरे सर्वर से समझौता किया जा सकता है।

एक और उदाहरण है जहां मुझे आगे की प्रक्रिया के लिए डेटा को COM ऑब्जेक्ट में पास करना होगा।

सी #, एएसपीनेट, और एसक्यूएल डेवलपर के रूप में मेरे विकल्प क्या हैं यह सुनिश्चित करने के लिए कि मेरे उपयोगकर्ता की गंदे बिट साफ होने से पहले आंतरिक को छूएं? क्या रनटाइम (या कंपाइलर) की एक विशेषता है जो मैं लीवरेज कर सकता हूं?

भाषा वास्तव में इसे लागू करने के लिए छोटा है, शायद मैं अपने आने वाले चरों में _dirty का प्रत्यय जोड़ सकता हूं। क्या यह कुछ है जो आप एक सर्वोत्तम अभ्यास के रूप में सिफारिश करेंगे?

पेशेवर इस समस्या से कैसे संपर्क करते हैं?

अद्यतन

यहाँ वैचारिक दिशा मैं

जा रहा था है यह कुछ हद तक दिए गए अब तक (विशेष रूप से SteveCzetty और Erlend) जवाब

उदाहरण के लिए के आधार पर प्रेरित है:

public Interface ICleanForJavascript { bool IsCleanForJavascript(); }  

public Interface ICleanForXSS { bool IsCleanForJavascript(); } 

public class DirtyData 
{ 
    string Name {get; set;} 
} 

public class CleanData 
{ 
    private CleanData() {} 
    string Name {get; private set;} 


    // Perhaps use casting to support the conversion from Dirty to Clean data 
    // Might use this in an option explicit DirtyData CleanData(object o); command 
    public static CleanData Validate(DirtyData d) 
    { 
     CleanData data = new CleanData(); 
     if (ValidateString(d.Name)) 
     { 
      data.Name = d.Name 
     } 
     else 
     { 
      throw new ValidationException(); 
     } 
     return CleanData; 
    } 
} 

[RequiresCleanedDataAttribute(ICleanForJavascript)] 
public void DoSomething(CleanData data) 
{ 
    //... 
} 

Attribute RequiresCleanedDataAttribute(object arrayOfCleanings[]) 
{ 
    // do some reflection on the method signature and see if the object supports the required interfaces 
} 

उपरोक्त के साथ, तो:

DoSomething(new DirtyData()); // Compiler Error, or runtime error if Attribute validation fails 
DoSomething(CleanData.Validate(new DirtyData())); // Compiles 
+0

मैं किसी भी तकनीक है कि एक संकलक त्रुटि गंदा डेटा गलत जगह पर भेजा जाता है जब फेंक होगा देखना चाहते हैं। – LamonteCristo

+0

अत्यधिक व्यापक प्रश्न –

उत्तर

7

नेट सकते हैं या इसे से एक कई भाषाओं अविश्वसनीय डेटा

हाँ, यह कर सकते हैं, लेकिन नहीं रास्ते में आप के बारे में पूछ रहे हैं की सफाई को लागू है। इसके बजाए, आप सही एसक्यूएल को सही तरीके से पैरामीटर करके सुनिश्चित करते हैं। उदाहरण के लिए:

string sql = "SELECT * FROM [table] WHERE [column] = @value"; 
using (var cn = new SqlConnection("connection string here")) 
using (var cmd = new SqlCommand(sql, cn) 
{ 
    cmd.Parameters.Add("@value").Value = "'';DROP Table Users;--"; 
    cn.Open(); 
    SomeControl.DataSource = cmd.ExecuteReader(); 
    SomeControl.DataBind(); 
} 

यह कोड पूरी तरह से सुरक्षित है, भले ही एक स्पष्ट इंजेक्शन प्रयास हो। कारण यह है कि SqlCommand ऑब्जेक्ट के पैरामीटर संग्रह कभी क्वेरी में प्रतिस्थापित नहीं है। डेटा सर्वर पर भेजा जाता है और कोड से पूरी तरह से अलग किया जाता है, और इसलिए सब कुछ सुरक्षित है, इससे कोई फर्क नहीं पड़ता कि उपयोगकर्ता क्या प्रवेश करता है।

कोई और जो आप करते हैं वह अनुरोध "सैनिटाइज" करने का प्रयास हमेशा क्रैकर्स के साथ एक हथियार दौड़ होगा। इस तरह, सही तरीका, डेटा और कोड अलग रखता है।

+0

संग्रहीत प्रक्रियाओं का उपयोग करने के लिए टिप के लिए धन्यवाद। इससे कुछ विस्तार के लिए एसक्यूएल मुद्दे को संबोधित किया जाएगा, लेकिन मैं अपने टीम-साथी को रोक या नहीं बताऊंगा कि मैं उन्हें साफ या गंदे डेटा भेज रहा हूं। मैं एक प्रकार के [विशेषता] की तर्ज पर और सोच रहा हूं। इस मेटाडाटा का उपयोग पूरे स्थिरता पर प्रकार स्थिरता को लागू करने के लिए किया जाएगा। – LamonteCristo

+1

@ मेकर - इसमें संग्रहीत प्रक्रियाओं के साथ कुछ लेना देना नहीं है। ध्यान दें कि मेरी पोस्ट में एसक्यूएल स्ट्रिंग विज्ञापन है एसक्यूएल। यह एक संग्रहीत प्रक्रिया नहीं है। पैरामीटरेटेड प्रश्न विभिन्न जानवर हैं। –

+0

मैं एंटीटी फ्रेमवर्क के साथ लिंक का उपयोग कर रहा हूं। यह उस स्थिति के लिए काम नहीं कर सकता है जहां मैं डेटाबेस में एक्सएसएस डेटा सहेज रहा हूं और फिर इसे वापस भेज रहा हूं। – LamonteCristo

4

आपको लगता है कि sanitize() डेटा के लिए केवल एक ही तरीका हो सकता है। समस्या यह है कि एक भेद्यता इस बात पर निर्भर करती है कि डेटा का उपयोग कैसे किया जाता है और अभ्यास के लिए यह दृष्टिकोण बहुत मुश्किल है। उदाहरण के लिए एसक्यूएल इंजेक्शन और एक्सएसएस में बहुत कम आम है और उन्हें कभी भी एक ही फ़ंक्शन का उपयोग नहीं करना चाहिए। वास्तव में बहुत कमinjection flaws के बीच समानताएं हैं।

कहा जा रहा है कि Taint checking का सर्वोत्तम कार्यान्वयन ruby's safe mode है। IronRuby आपको rub पर ruby ​​का उपयोग करने देता है। यह स्वच्छता कार्यों की एक सूची रखने के द्वारा काम करता है जो चर को शुद्ध के रूप में चिह्नित करेगा। लेकिन यह सब कुछ रोकने के लिए नहीं जा रहा है, अगर आप owasp top 10 देखते हैं, तो केवल ए 1-इंजेक्शन और ए 2-एक्सएसएस भेद्यताएं दंडित इनपुट के कारण होती हैं, बाकी नहीं, विशेष रूप से सीएसआरएफ।

+0

यह वही दिशा है जिस पर मैं जा रहा था हालांकि मैं अपने डेटा को साफ करने की एक विधि पर ध्यान केंद्रित नहीं कर रहा हूं।मेरे वांछित समाधान के नमूना कार्यान्वयन में मेरे पास ऑब्जेक्ट का आधार वर्ग होता है जिसमें फ्लैग-आधारित एनम होता है जो दर्शाता है कि चर साफ़ किया गया था और किस प्रकार की सफाई के साथ। बेशक यह विधि एक रनटाइम-केवल दृष्टिकोण है। मैं कुछ समय लेगा और आपके द्वारा उल्लेख किए गए लिंक का अध्ययन करूंगा। – LamonteCristo

+2

समस्या यह है कि स्वयं में इनपुट दुर्भावनापूर्ण नहीं हो सकता है। हमलावर को इसे भेजने में दुर्भावनापूर्ण इरादे हो सकते हैं, लेकिन समस्या केवल एक विशिष्ट संदर्भ (जैसा कि रूक उल्लेख किया गया है) दिया जाएगा। तो यदि आप इसे इस्तेमाल करने से पहले इसे संतोषित करना चाहते हैं, तो आप इसे किसके लिए स्वच्छ करते हैं? एसक्यूएल इंजेक्षन? एचटीएमएल में एक्सएसएस? जावास्क्रिप्ट में एक्सएसएस? सीएसएस में एक्सएसएस? वास्तव में कोई अच्छा जवाब नहीं है। क्या होता है यदि डेटा एसक्यूएल इंजेक्शन और एचटीएमएल दोनों के लिए संतोषजनक है? यह शायद दोनों के लिए टूटा हो जाता है, क्योंकि एक संदर्भ में एक वैध चरित्र दूसरे में अवैध है, इस प्रकार यह प्रदर्शन कानूनी संदर्भ में टूट जाएगा। संदर्भ के लिए – Erlend

+0

डेटा को स्वच्छ किया जाना चाहिए। जब डेटा एप्लिकेशन में प्रवेश करता है तो उसे आवेदन के डोमेन के लिए स्वच्छ किया जाना चाहिए।

1

उपयोग Code Contracts...(also in pdf format)

असल में, आप सीएलआर नियंत्रण प्रवाह ग्राफ पर अतिरिक्त बाधा मांग रहे हैं जो किसी भी फ़ंक्शन को साफ़ करने वाले डेटा का उपयोग करने से रोकता है।

दूसरों की तरह कहा है, उपयोगकर्ता इनपुट को स्वच्छ करना छोटा है; यह सुनिश्चित कर रहा है कि केवल स्वच्छता डेटा उपलब्ध है जब प्रोग्रामर पर्यवेक्षण सुरक्षा भेद्यताएं पेश करता है। संहिता अनुबंध प्रभावी रूप से केवल एक ही आश्वासन के साथ केवल संवेदी डेटा (हालांकि आप इसे परिभाषित करते हैं) का उपयोग करने के तरीकों को सीमित करने के लिए संकलक को प्रभावी ढंग से बढ़ाएंगे कि आप एक इंट में स्ट्रिंग नहीं जोड़ सकते हैं।

यह भी देखें: Static Program Analysis:

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

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