सैंडबॉक्स वाला एपीआई (एसएपीआई), Sandbox2 प्रोजेक्ट पर आधारित है. इस पेज पर, SAPI के डिज़ाइन आर्किटेक्चर और मुख्य कॉन्सेप्ट के बारे में बताया गया है.
खास जानकारी
SAPI को इस तरह से डिज़ाइन किया गया है कि यह डेवलपर को सैंडबॉक्सिंग के लिए C/C++ लाइब्रेरी तैयार करने के टूल उपलब्ध कराता है. साथ ही, यह C/C++ लाइब्रेरी के सैंडबॉक्स किए गए वर्शन के साथ कम्यूनिकेट करने के लिए ज़रूरी एपीआई भी उपलब्ध कराता है.
इस डायग्राम में, SAPI सैंडबॉक्स की गई C/C++ लाइब्रेरी का आर्किटेक्चर दिखाया गया है:
SAPI, SAPI लाइब्रेरी और होस्ट कोड के बीच मैन्युअल और अपने-आप (कस्टम पॉइंटर एट्रिब्यूट के आधार पर) मेमोरी सिंक करने के लिए प्रिमिटिव भी उपलब्ध कराता है. जैसे, ऐरे, स्ट्रक्चर.
आखिर में, हाई-लेवल Transactions API, SAPI लाइब्रेरी की निगरानी करने की सुविधा देता है.साथ ही, अगर वे काम नहीं करती हैं, तो उन्हें फिर से शुरू करता है. उदाहरण के लिए, सुरक्षा से जुड़े उल्लंघनों, क्रैश या संसाधनों के खत्म होने की वजह से.
Sandbox2
ओपन-सोर्स प्रोजेक्ट Sandbox2 को Google के सुरक्षा इंजीनियरों ने डेवलप किया है और वे ही इसे मैनेज करते हैं. यह सैंडबॉक्सिंग की मुख्य टेक्नोलॉजी है, जिसका इस्तेमाल SAPI करता है. Sandbox2 में तीन मुख्य कॉम्पोनेंट होते हैं: सैंडबॉक्स पॉलिसी, एक्ज़ीक्यूटर, और Sandboxee.
सैंडबॉक्स से जुड़ी नीति
सैंडबॉक्स नीति, सैंडबॉक्स लाइब्रेरी के लिए प्रतिबंधित एक्ज़ीक्यूशन एनवायरमेंट तय करती है. ऐसा यह साफ़ तौर पर बताकर किया जाता है कि कौनसे सिसकॉल किए जा सकते हैं. SAPI, Sandbox2 की तरह ही काम करता है. सैंडबॉक्स की नीति को डिज़ाइन और तय करने के बारे में ज़्यादा जानने के लिए, सैंडबॉक्स की नीति वाला सेक्शन और Sandbox2 का शुरू करें पेज देखें.
SAPI, डिफ़ॉल्ट नीति का इस्तेमाल करता है. इसके अलावा, सैंडबॉक्स में इसे तय करके, सैंडबॉक्स के लिए खास तौर पर बनाई गई नीति का इस्तेमाल किया जा सकता है. इसके लिए, इसे sandbox.h हेडर फ़ाइल में तय करें और sapi_library बिल्ड रूल में इसे आर्ग्युमेंट के तौर पर पास करें.
सैंडबॉक्स की गई लाइब्रेरी
यह सैंडबॉक्स की गई C/C++ लाइब्रेरी है. इसे Sandbox2 की ओर से उपलब्ध कराए गए प्रतिबंधित सैंडबॉक्स एनवायरमेंट में एक्ज़ीक्यूट किया जाएगा. आखिर में, सैंडबॉक्स की गई लाइब्रेरी, ज़रूरी फ़ंक्शन को उपलब्ध कराती है. इसका इस्तेमाल होस्ट कोड कर सकता है.
Sandboxed Library को sapi_library बिल्ड रूल के साथ बनाया जाता है. इसमें, अपनी पसंद के मुताबिक सैंडबॉक्स नीति तय की जा सकती है. यह नीति, प्रतिबंधित एक्ज़ीक्यूशन एनवायरमेंट के बारे में बताती है. लाइब्रेरी के हिसाब से, आपको रैपर या स्टब कोड लिखना पड़ सकता है. इसके लिए, libcurl देखें. हालांकि, SAPI वर्शन तैयार करते समय, आपको C/C++ लाइब्रेरी के सोर्स कोड में बदलाव करने की ज़रूरत नहीं है.
SAPI ऑब्जेक्ट और आरपीसी स्टब
SAPI ऑब्जेक्ट एक C++ ऑब्जेक्ट है, जो सैंडबॉक्स की गई लाइब्रेरी के एपीआई को दिखाता है. यह Host Code से RPC स्टब को कॉल फ़ॉरवर्ड करता है. यह RPC स्टब, Sandboxed Library के साथ-साथ SAPI Library में भी एम्बेड किया जाता है.
इन दोनों एलिमेंट को बिल्ड सिस्टम, sapi_library()
बिल्ड नियम का इस्तेमाल करके अपने-आप जनरेट करता है. SAPI, दो बिल्ड सिस्टम के साथ काम करता है. ये हैं Google का Bazel और CMake.
होस्ट का कोड
होस्ट कोड, SAPI लाइब्रेरी से मिले लॉजिक को लागू करता है. यह C/C++ लाइब्रेरी के अनसैंडबॉक्स किए गए वर्शन का इस्तेमाल करता है. इसलिए, होस्ट कोड, SAPI लाइब्रेरी से एक्सपोर्ट किए गए फ़ंक्शन को कॉल करता है. साथ ही, सैंडबॉक्स को डेटा भेजता है और उससे डेटा पाता है.
SAPI लाइब्रेरी का इस्तेमाल करने के लिए, होस्ट कोड में बदलाव करना होगा. खास तौर पर, लाइब्रेरी के फ़ंक्शन को कॉल नहीं किया जा सकता, क्योंकि लाइब्रेरी एक अलग सैंडबॉक्स प्रोसेस में मौजूद होती है. इसलिए, SAPI ऐसे टूल उपलब्ध कराता है जो एक SAPI ऑब्जेक्ट बनाते हैं. यह ऑब्जेक्ट, SAPI लाइब्रेरी को कॉल प्रॉक्सी करता है.
कॉन्सेप्ट
Bazel के बिल्ड नियम
SAPI प्रोजेक्ट, C/C++ लाइब्रेरी को सैंडबॉक्स करने के लिए, Bazel के दो बिल्ड रूल उपलब्ध कराता है:
sapi_library()
– यह उन सभी आउटपुट को बनाता है जिनकी ज़रूरत C/C++ लाइब्रेरी को Sandbox2 Sandboxee के तौर पर सैंडबॉक्स करने के लिए होती है. बिल्ड आउटपुट का इस्तेमाल,cc_binary()
नियम के लिए डिपेंडेंसी के तौर पर किया जा सकता है. इस नियम का इस्तेमाल, होस्ट कोड बाइनरी बनाने के लिए किया जाता है.sapi_interface()
– यह हेडर अपने-आप जनरेट करता है. इसे होस्ट कोड बाइनरी में शामिल किया जा सकता है.
बिल्ड के नियमों के बारे में ज़्यादा जानकारी के लिए, बिल्ड के नियम लेख पढ़ें.
वैरिएबल
SAPI कई खास तरह के टाइप उपलब्ध कराता है. इन्हें SAPI Types कहा जाता है. हमारा सुझाव है कि आप इनका इस्तेमाल होस्ट कोड में करें. SAPI टाइप की ज़रूरत इसलिए होती है, क्योंकि होस्ट कोड और सैंडबॉक्स की गई लाइब्रेरी के बीच प्रोसेस और मेमोरी को अलग-अलग किया जाता है.
इस विषय के बारे में ज़्यादा जानकारी और आम तौर पर इस्तेमाल किए जाने वाले कुछ एसएपीआई टाइप की खास जानकारी के लिए, वैरिएबल देखें.
लेन-देन
जैसा कि ऊपर बताया गया है, सैंडबॉक्स की गई लाइब्रेरी को किया गया कोई भी एपीआई कॉल, आरपीसी लेयर पर पास किया जाता है. इस लेयर पर होने वाली गड़बड़ी को ठीक करने के लिए, आपको गड़बड़ी ठीक करने का सही तरीका लागू करना होगा. SAPI Transaction मॉड्यूल, यह पक्का करने के लिए ज़रूरी तरीका उपलब्ध कराता है कि सैंडबॉक्स की गई लाइब्रेरी को किए गए सभी कॉल, आरपीसी लेवल की किसी भी समस्या के बिना पूरे हो जाएं या किसी काम की गड़बड़ी के साथ वापस आ जाएं.
इस विषय के बारे में ज़्यादा जानकारी के लिए, लेन-देन लेख पढ़ें.
शुरू करना
अपना पहला Sandboxed API प्रोजेक्ट सेट अप करने के लिए, शुरू करें पेज पढ़ें.