2010-09-17 14 views
6

मैं अपनी वेबसाइट उपयोगकर्ताओं को मनमाने ढंग से पढ़ने के लिए केवल SQLite3 डेटाबेस तक पहुंच देना चाहता हूं, उन्हें डेटाबेस में लिखने या अन्य नुकसान करने के बिना। कैसे?सुरक्षित पढ़ने-योग्य sqlite3 डेटाबेस

db फ़ाइल बनाना केवल पढ़ने के लिए एक छोटे से मदद करता है, लेकिन की तरह कमांड "संलग्न", ".load" और ".output" लोगों को पढ़ने के लिए/अन्य फ़ाइलें, जो सुरक्षित नहीं किया जा सकता है लिखने की अनुमति है।

बेशक, अगर मुझे ऐसे सभी आदेशों को पता था, तो मैं सिर्फ उनके खिलाफ फ़िल्टर करता हूं, लेकिन मैं ज्यादातर उन आदेशों के बारे में चिंतित हूं जिनके बारे में मैंने नहीं सोचा है।

मैं राईट अस्वीकृत करने के लिए sqlite3 के स्रोत कोड को बदलने के लिए कुछ समय के लिए कोशिश की, लेकिन इस कठिन की तुलना में यह लग रहा है है: भी SELECT कथन आदि कुछ आंतरिक आवेषण करने के लिए/प्रकट होता है।

नोट:मैं डॉस हमलों पर विचार किया है, और 5s या कुछ करने के लिए cputime ulimit होगा। मेरी मुख्य चिंता फाइलों/"हैकिंग" को नुकसान पहुंचाती है, न कि डॉस।

chroot() काम कर सकता है, लेकिन चरम लगता है।

विचार?

संपादित करें: वाह, क्या मैंने वास्तव में यह 3+ साल पहले पूछा था?

तब से, I've actually written a program to do this.

जो मुझे लगता है (लेकिन मैं गलत हो सकता है) यथोचित सुरक्षित है।

Here is a sample query.

+0

मुझे लगता है कि मैं वास्तव में यहां "मेटा-समाधान" ढूंढ रहा हूं। उदाहरण के लिए, अगर मैंने अपनी पूरी प्रणाली को केवल पढ़ने के लिए सीडी से भाग लिया, तो मुझे चिंता करने की ज़रूरत नहीं होगी कि sqlite3 क्या कर सकता/नहीं कर सकता। यह मेरे मामले में बहुत चरम है, लेकिन सामान्य विचार यह है कि मैं एक समाधान ढूंढना चाहता हूं जो sqlite3 गुणों के आधार पर w/o काम करता है। – barrycarter

उत्तर

1
बेशक

, अगर मैं ऐसे सभी आदेशों जानता था, मैं सिर्फ उन्हें के खिलाफ फ़िल्टर कर चाहते हैं, लेकिन मैं ज्यादातर आदेशों मैं नहीं सोचा बारे में चिंतित हूँ।

क्या आपने ब्लैकलिस्ट के बजाय श्वेतसूची का उपयोग करने पर विचार किया है? केवल उन कथनों को अनुमति दें जो SELECT या EXPLAIN से शुरू होते हैं।

+1

sqllite क्वेरी स्टैकिंग के लिए अनुमति देता है ... – rook

+0

हां, लेकिन * आपको * इसे अनुमति देने की आवश्यकता नहीं है। Sqlite3_exec के बजाय, तैयार कथन का उपयोग करें, जो एक समय में केवल एक ही कथन निष्पादित करता है। – dan04

+1

एक उपयोगकर्ता लेखन प्रश्न तैयार कथन के बिल्कुल विपरीत है। – rook

0

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

+0

दाएं। वह हिस्सा आसान है। कठिन हिस्सा: क्या sqlite3 कमांड अन्य फ़ाइलों तक पहुंच सकते हैं (उदाहरण के लिए, ATTACH)। – barrycarter

0

अपनी डेटाबेस फ़ाइल केवल ऑपरेटिंग सिस्टम में पढ़ें। एक बार ऐसा करने के बाद कि SQLite इसे ओवरराइड नहीं कर सकता है। यदि आपके पास अभी भी समस्याएं हैं तो यह SQLite समस्या नहीं है। वे अभी भी एक php/cgi/आदि मुद्दा ढूंढ पाएंगे लेकिन यह सुरक्षा जानवर की प्रकृति है।

+0

दुर्भाग्य से, सच नहीं (वह मेरी मूल योजना थी)। ATTACH जैसे कमांड अन्य फ़ाइलों तक पहुंच सकते हैं। – barrycarter

+0

यदि आपका पर्यावरण अन्य फ़ाइलों तक पहुंच की अनुमति नहीं देता है तो वे इसके साथ बहुत कुछ नहीं कर सकते हैं। क्या आप इसे क्रोट जेल में चला सकते हैं? – Jay

0

आपने उल्लेख नहीं किया है कि आप SQLite डेटाबेस तक पहुंच प्रदान कैसे कर रहे हैं।

यदि आप सी एपीआई के माध्यम से ऐसा कर रहे हैं (उदाहरण के लिए सी में सीजीआई लिखना जो कच्ची एसक्यूएल क्वेरी लेता है, इसे एसक्लाइट में भेजता है, और उसके बाद जो कुछ भी लौटाया जाता है), तो ".load" जैसे डॉट कमांड हैं कोई चिंता नहीं। इन्हें sqlite3 shell program द्वारा कार्यान्वित किया गया है, और सी एपीआई कार्यों को सीधे कॉल करते समय काम नहीं करेंगे।

इस मामले में आप sqlite3_open_v2 को SQLITE_OPEN_READONLY को डेटाबेस से लिखे जाने से रोकने के लिए झंडे में से एक के रूप में कॉल कर सकते हैं।

सफल होने से दूसरे डेटाबेस को जोड़ने से रोकने के लिए SQLITE_LIMIT_ATTACHED को सेट करने के लिए ATQCH कमांड को SQLite3_limit() को कॉल करके अक्षम किया जा सकता है। चूंकि DETACH कथन "ATTACH कथन का उपयोग करके पहले जुड़े अतिरिक्त डेटाबेस कनेक्शन को अलग करता है" ऐसा लगता है कि इस प्रतिबंध को बाईपास करने के लिए यह किसी को मूल डेटाबेस को अलग करने से रोक देगा।

जहां तक ​​मैं SQL understood by SQLite को देखने से कह सकता हूं, यह सभी छेद को बंद करना चाहिए। आप pragmas के माध्यम से एक दांत-दांत कंघी के साथ चलाने के लिए बस यह सुनिश्चित करने के लिए प्रयास कर सकते हैं कि अगर कुछ भी मुझे याद आया तो मुझे बताएं और मैं यह जवाब अपडेट करूंगा।

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