2012-01-09 14 views
18

मैं असेंबली के रूप में "सुरक्षित" के रूप में कैसे चिह्नित करूं?सुरक्षित रूप से .net असेंबली को कैसे चिह्नित करें?

वैकल्पिक रूप से, मेरे पास विजुअल स्टूडियो मुझे कैसे बता सकता है जब मेरी असेंबली में कुछ "सुरक्षित" नहीं है?


कभी कभी आप एक विधानसभा उपयोग नहीं कर सकते जब तक कि यह "सुरक्षित" (from SQL Server उदा) है।

मैं अपनी असेंबली को सुरक्षित के रूप में चिह्नित करना चाहता हूं। अगर मेरी असेंबली को सुरक्षित के रूप में चिह्नित नहीं किया जा सकता है क्योंकि यह सुरक्षित नहीं है, तो मैं जानना चाहता हूं कि मैं कैसे जान सकता हूं कि मेरी असेंबली सुरक्षित नहीं है।


वहाँ दृश्य स्टूडियो में कुछ अवधारणाओं कि सुरक्षित सत्ता से संबंधित प्रतीत, या एक विधानसभा जा रहा है "सुरक्षित" से कोई लेना देना नहीं हो सकता है कर सकती हैं:

  1. असुरक्षित अनुमति दें कोड विधानसभा विकल्प:

    enter image description here

    • यदि मैं को असुरक्षित कोड विकल्प की अनुमति देता हूं तो क्या अनुमति है?
    • अगर मैं अनचेक करता हूं तो असुरक्षित कोड विकल्प को अनचेक करने की अनुमति नहीं है?
    • क्या संबंध है, यदि कोई है, तो "असुरक्षित कोड" को असेंबली के साथ "सुरक्षित" करना है?

      (मैं पूछना क्योंकि मेरे विधानसभा नहीं "असुरक्षित कोड को अनुमति दें" करता है, लेकिन अनुमति देता है पी/आह्वान कॉल - जो मैंने सोचा "असुरक्षित" की परिभाषा था)

  2. ClsCompliant विधानसभा विकल्प :

    [assembly: CLSCompliant(true)] 
    namespace MyApplication 
    
    • क्या, संबंध है यदि कोई हो, "cls शिकायत" कोड एक विधानसभा जा रहा है "सुरक्षित" के साथ क्या करना है?
  3. असुरक्षित कोड ब्लॉक:

    int error; 
    unsafe 
    { 
        error = 0x80004005; 
    }  
    

    कोड unsafe ब्लॉक के अंदर "असुरक्षित" है

  4. UnsafeNativeMathods

    माइक्रोसॉफ्ट एक वर्ग UnsafeNativeMethods कहा जाता है कि असुरक्षित होते हैं बनाने की सिफारिश की प्रबंधित कोड:

    [SuppressUnmanagedCodeSecurity] 
    internal static class UnsafeNativeMethods 
    { 
        ...   
    } 
    

    यह SafeNativeMethods के विपरीत है:

    [SuppressUnmanagedCodeSecurity] 
    internal static class SafeNativeMethods 
    { 
        ...   
    } 
    

    कि सुरक्षित देशी तरीकों शामिल है, और NativeMethods:

    internal static class SafeNativeMethods 
    { 
        ...   
    } 
    

    कि देशी पद्धतियां हैं।

मैं असेंबली के रूप में "सुरक्षित" के रूप में कैसे चिह्नित करूं?

एसक्यूएल कैसे जानता है कि असेंबली "सुरक्षित नहीं है"?

+0

इस मामले में 'सुरक्षित' असेंबली सीएएस स्तर के संबंध में है। एमएसडीएन पर एक बहुत अच्छा लेख है जो [SQL सर्वर के लिए असेंबली डिजाइनिंग] (http://msdn.microsoft.com/en-us/library/ms189566.aspx) के बारे में बात करता है और आपकी असेंबली की 'सुरक्षित' पर विस्तार करता है । –

उत्तर

12
  • this से पढ़ रहा है के लिए एक MSDN सूचक है, एसक्यूएल सर्वर के लिए "सुरक्षित" एक है:

सुरक्षित सबसे प्रतिबंधात्मक अनुमति सेट है। कोड सुरक्षित अनुमतियों के साथ एक विधानसभा द्वारा निष्पादित ऐसी फ़ाइलों, नेटवर्क, पर्यावरण चर, या रजिस्ट्री

तो एसक्यूएल सर्वर कोड डोमेन के अंदर सेट अपने के बारे में कोड निष्पादन की अनुमति के रूप में बाहरी सिस्टम संसाधन उपयोग नहीं कर सकते

वी.एस. से
  • Unsafe झंडा करने के लिए, मूल रूप से, कोड निष्पादन सुरक्षा के साथ कुछ भी नहीं है, लेकिन गैर कामयाब कोड निष्पादन सक्षम बनाता है। तो प्रबंधित कोड आधार

  • CLS Compilant विशेषता में इस के बारे में गैर प्रबंधित कोड एकीकरण परिभाषित here रूप कोड विधानसभा एक कोड है कि सीएसएल (आम भाषा विशिष्टता) दिशानिर्देश इस प्रकार की तरह उस विशेषता के साथ चिह्नित की को परिभाषित करने के बारे में है।तो यह संकलन और कोड आर्किटेक्चर के बारे में है।

कैसे मैं "सुरक्षित" के रूप में के रूप में विधानसभा को चिह्नित करते हैं?

यह इस उत्तर के पहले लिंक में परिभाषित किया गया है और SQL सर्वर एकीकरण के साथ संबंध है।

एसक्यूएल कैसे जानता है कि असेंबली "सुरक्षित नहीं है"?

ध्यान में रखते हुए प्रदान की विवरण: metadata पर, एसक्यूएल सर्वर रिले "को प्रबंधित आवेदन मॉड्यूल वर्ग मेटाडेटा और SQL सर्वर का एक उदाहरण में एक वस्तु के रूप में कोड में कामयाब बनाता है", यह है कि कुछ क्षेत्रों में इस तथ्य के बारे में एक जानकारी प्रदान करता है अगर यह "सुरक्षित" है या नहीं।

+2

यह भी ध्यान रखना अच्छा होगा कि आप असेंबली बनाते समय एक असेंबली 'Permission_Set' सेट कर सकते हैं। 'CREATE एस्सेबली 'से [दस्तावेज़ीकरण] (http://msdn.microsoft.com/en-us/library/ms189524.aspx): PERMISSION_SET {SAFE | EXTERNAL_ACCESS | UNSAFE} –

0

आपके मतलब पर निर्भर करता है, लेकिन यदि आप एक असेंबली आयात करते हैं (यानी .dll) उस .dll फ़ाइल के गुणों में "अनब्लॉक" विकल्प होता है। यह आपको संदर्भ के रूप में डीएलएल का उपयोग करने की अनुमति देगा।

2

इस मामले में एसक्यूएल उस कोड की तलाश में है जिसे आपने "असुरक्षित" ब्लॉक में लपेट लिया है। यहाँ असुरक्षित कीवर्ड

http://msdn.microsoft.com/en-us/library/chfa2zb8.aspx

25

मैं असेंबली के रूप में "सुरक्षित" के रूप में कैसे चिह्नित करूं?

आप इस गलत तरीके से सोच रहे हैं।

कोई भी जो आपको लगता है कि आपको मारना चाहता है, आपको बोतल देता है और कहता है "इसे पीएं"। आप कहते हैं "क्या यह पीने के लिए सुरक्षित है?" लड़का कहता है "बोतल पढ़ें"। तुम करो। यह कहता है "उस पर डूबने के लिए सुरक्षित"।

क्या आप इसे पीते हैं?

चाहे तरल पीने के लिए सुरक्षित है या बोतल के लेबल के साथ क्या कुछ भी नहीं करना है! "सुरक्षित करने के लिए सुरक्षित" चिह्नित एक बोतल में गैसोलीन डालना पूरी तरह से संभव है।

आप SQL सर्वर पर संदिग्ध तरल से भरा बोतल सौंपने वाले व्यक्ति हैं, और SQL सर्वर का कहना है, "मुझे इस असेंबली पर आपके द्वारा डाले जाने वाले किसी भी लेबल पर भरोसा नहीं है"। इसके बजाय, यह विधानसभा क्या कर सकती है प्रतिबंधित करने के द्वारा असेंबली को "सुरक्षित" बनाने जा रही है। यह उस चीज़ पर अनुमतियों को बंद कर देता है ताकि SQL सर्वर का लाभ उठाने के लिए आपकी असेंबली द्वारा किए गए किसी भी प्रयास के परिणामस्वरूप अपवाद के माध्यम से इसकी समाप्ति हो जाएगी।

मुझे कैसे पता चलेगा कि मेरी असेंबली में कुछ "सुरक्षित" नहीं है?

इसे कम विश्वास में चलाने का प्रयास करें। क्या यह एक सुरक्षा अपवाद के साथ दुर्घटनाग्रस्त हो गया और मर गया? अगर उत्तर हाँ है, तो यह विश्वसनीय स्तर सुरक्षित ट्रस्ट स्तर के अनुसार सुरक्षित नहीं था। विभिन्न ट्रस्ट स्तर अनुमतियों के विभिन्न स्तर प्रदान करते हैं। आपके द्वारा अपनी मशीन पर स्थापित कोड आम तौर पर पूरी तरह से भरोसेमंद है, आपके कॉर्पोरेट नेटवर्क से चलाए जाने वाले कोड कम भरोसेमंद हैं, इंटरनेट से चलाए जाने वाले कोड को शायद ही कभी भरोसा है। SQL सर्वर में चलाए गए कोड को सभी का विश्वास कम से कम स्तर मिलता है; ऐसा लगता है कि लगभग सबकुछ असुरक्षित है।

यदि मैं असुरक्षित कोड विकल्प की अनुमति देता हूं तो क्या अनुमति है?

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

क्या संबंध है, यदि कोई हो, "cls शिकायत" कोड एक विधानसभा जा रहा है "सुरक्षित" के साथ क्या करना है?

कोई भी नहीं, इस तथ्य के अलावा कि सीएलएस अनुपालन कोड कच्चे सूचक प्रकार लेने वाले एपीआई की अनुमति नहीं देता है।

सीएलएस सामान्य भाषा सबसेट है - सुविधाओं का सेट जो सभी अनुपालन .NET भाषाओं में मौजूद होना आवश्यक है। इस तरह आपको खुद से पूछना नहीं है "अरे, अगर मैं इस विधि को लिखता हूं जो एक int लेता है और सी # में एक स्ट्रिंग देता है, तो क्या मैं इसे एफ # से कॉल कर सकता हूं?" यदि आप स्वयं को सीएलएस के नियमों का पालन करने के लिए प्रतिबंधित करते हैं तो आप जानते हैं कि कोई भी सीएलएस भाषा आपकी लाइब्रेरी का उपयोग कर सकती है, और आप सीएलएस-अनुपालन पुस्तकालयों का उपयोग कर सकते हैं इससे कोई फर्क नहीं पड़ता कि वे किस भाषा में लिखे गए थे। इसमें सुरक्षा के साथ कुछ भी नहीं है।

कोड असुरक्षित ब्लॉक के अंदर "असुरक्षित"

असुरक्षित ब्लॉक के अंदर कोड प्रक्रिया में मनमाने ढंग से भ्रष्ट स्मृति अगर यह बुरी तरह से लिखा जाता है कर सकते हैं। हम आपको "असुरक्षित" जैसे कोड को चिह्नित करते हैं ताकि आप जान सकें कि आपके कोड समीक्षा प्रयासों पर ध्यान केंद्रित करना है। एक असुरक्षित ब्लॉक में आप, सी # भाषा, प्रकार और मेमोरी सुरक्षा सुनिश्चित करने के लिए ज़िम्मेदार हैं।

एक सवाल आप से पूछना नहीं किया:

क्या "आंशिक रूप से भरोसा फोन करने वाले के लिए सुरक्षित" मतलब के रूप में एक विधानसभा अंकन करता है?

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

हमने एपीटीसीए का आविष्कार किया क्योंकि दिन में, पीटर टोर और मैंने पाया कि शत्रुतापूर्ण कॉलर्स के लिए एक रास्ता था, जिसने जेस्क्रिप्ट.NET कोड को चालित करने के लिए कम विश्वास किया था - जो कि डिफ़ॉल्ट रूप से उच्च विश्वास था - ऐसे में जिस तरह से कम ट्रस्ट कोड JScript.NET कोड को उपयोगकर्ता की तरफ से हमला करने का कारण बन सकता है। (इसे आमतौर पर "लुभावना हमला" कहा जाता है क्योंकि लो-ट्रस्ट कोड हाई-ट्रस्ट कोड को इसके गंदे काम करने में "लूरेस" करता है।)

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

नया पारदर्शिता आधारित सुरक्षा मॉडल एपीटीसीए की सौभाग्य से बहुत अधिक जरूरतों को रोकता है।

यदि एपीटीसीए किसी असेंबली पर मौजूद नहीं है तो एक "लिंक मांग" यह सुनिश्चित करेगी कि आपके असेंबली को आमंत्रित करने वाला कोड पूरी तरह भरोसेमंद है।ध्यान दें कि यह लिंक मांग है, पूर्ण मांग नहीं है।

+0

* मुझे कैसे पता चलेगा कि मेरी असेंबली में कुछ "सुरक्षित" नहीं है? * SQL सर्वर यह जानने में सक्षम है कि सभी असेंबली कोड निष्पादित किए बिना असेंबली असुरक्षित है या नहीं। मैं कैसे जान सकता हूं कि सभी असेंबली कोड निष्पादित किए बिना असेंबली असुरक्षित है? यदि SQL सर्वर यह निर्धारित कर सकता है कि कोड चलाने के बिना कोई असेंबली असुरक्षित है, तो संभवतः विजुअल स्टूडियो यह भी निर्धारित कर सकता है कि कोड चलाने के साथ असेंबली असुरक्षित है या नहीं। मैं कैसे निर्धारित कर सकता हूं कि मेरी असेंबली असुरक्षित है (सभी कोड चलाने के बिना (सभी संभावित पैरामीटर (सभी संभावित कोड पथों के साथ)) –

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