हिन्दी

HTML, chmod, कंटेनर और Cron

चार उपयोगिताओं के पीछे तर्क: एक HTML एडिटर को एक अनुमति सूची और एक सैंडबॉक्स की आवश्यकता क्यों है, एक chmod स्ट्रिंग में कैपिटल S क्यों मायने रखता है, एक Docker रन कमांड Compose में क्या व्यक्त नहीं कर सकता है, और दो Cron नियम जो सभी को पकड़ते हैं।

HTML एडिटर: एक अनुमति सूची, फ़िल्टर नहीं

एडिटर HTML उत्पन्न करता है, और HTML जो टेक्स्ट बॉक्स से आता है, वह सबसे पुराना इंजेक्शन वेक्टर है। यहां दो अलग-अलग प्रश्न उलझ जाते हैं, इसलिए उन्हें अलग करना ही उचित है। पहला है "क्या इस एडिटर को मार्कअप उत्सर्जित करने के लिए धोखा दिया जा सकता है जो इसे प्रदर्शित करने वाले पेज में कोड चलाता है?" दूसरा है "क्या यह किसी अविश्वसनीय स्रोत से शत्रुतापूर्ण HTML को साफ़ करने का एक सुरक्षित तरीका है?" यह टूल पहले का उत्तर हाँ और दूसरे का नहीं देता है, और यह आपको अन्यथा मानने की अनुमति देने के बजाय पैनल पर ऐसा कहता है।

तंत्र एक अनुमति सूची है. तत्वों की एक सूची की अनुमति है; प्रत्येक अन्य तत्व को लपेटा नहीं गया है, इसलिए इसका पाठ जीवित रहता है और इसका टैग नहीं रहता है। प्रति तत्व विशेषताओं की एक सूची की अनुमति है; बाकी सब कुछ हटा दिया गया है, जो प्रत्येक ईवेंट हैंडलर को अवरुद्ध करने के बजाय असंभव बना देता है। उस परीक्षण से पहले विशेषता नामों को छोटा कर दिया जाता है, इसलिए oNeRrOr और ONERROR onerror के समान ही अस्वीकृत नाम हैं। वे तत्व जिनकी सामग्री को HTML पार्सर कच्चे पाठ के रूप में मानता है - स्क्रिप्ट, शैली, टेक्स्टएरिया, आईफ्रेम, शीर्षक - को उनकी सामग्री के साथ हटा दिया जाता है, क्योंकि उन्हें खोलने से स्क्रिप्ट स्रोत दस्तावेज़ में मार्कअप के रूप में पेस्ट हो जाएगा।

लिंक पतों को अपना स्वयं का चेक मिलता है। मान को इकाई-डिकोड किया जाता है और इसकी योजना को पढ़ने से पहले व्हाइटस्पेस और नियंत्रण वर्णों को हटा दिया जाता है, क्योंकि ब्राउज़र नेविगेट करते समय यही करता है: javascript:alert(1) और jav ascript:alert(1) दोनों एक ही स्थान पर पहुंचते हैं। केवल http, https, mailto, tel, ftp और संबंधित पते ही बचे हैं। एक वर्ण संदर्भ जिसे टूल हल नहीं कर सकता - : क्लासिक है - जिसके कारण पूरे पते को पारित करने के बजाय अस्वीकार कर दिया जाता है, क्योंकि एक फ़िल्टर जो ब्राउज़र की तुलना में इनपुट को कम समझता है, वह एक छेद वाला फ़िल्टर होता है।

कोई छवि बटन नहीं है, और img अनुमति सूची में नहीं है। एक अनुमत छवि टैग दस्तावेज़ जहां भी समाप्त होता है वहां से एक आउटबाउंड अनुरोध है, और एक त्रुटि सतह है। ऐसे एडिटर के लिए जो गद्य का निर्माण करता है, यह भी इसके लायक नहीं है।

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

ईमानदार सीमा: यह एक स्ट्रिंग-आधारित सैनिटाइज़र है, पूर्ण HTML5 पार्सर नहीं। पार्सर डिफरेंशियल - इनपुट जहां एक ब्राउज़र इस टोकनाइज़र की तुलना में एक अलग ट्री बनाता है - इस तरह से बनाए गए प्रत्येक सैनिटाइजर की ज्ञात कमजोरी है। आउटपुट के लिए आप स्वयं को इस एडिटर में उत्पन्न करते हैं, यह ठीक है। किसी अजनबी से आए HTML को साफ करने के लिए, अपने नियंत्रण वाले सर्वर पर वास्तविक पार्सर के विरुद्ध चलने वाले सैनिटाइज़र का उपयोग करें।

chmod: बड़ा अक्षर ही संपूर्ण संदेश है

एक Unix फ़ाइल मोड बारह बिट्स है: प्रत्येक मालिक, समूह और अन्य के लिए तीन अनुमति बिट्स, प्लस सेटुइड, सेटगिड और स्टिकी बिट। अष्टक रूप उन बिट्स का प्रत्यक्ष वाचन है, यही कारण है कि 4 + 2 + 1 = 7 का अर्थ है पढ़ना, लिखना और निष्पादित करना।

प्रतीकात्मक रूप जो ls प्रिंट करता है वह वह जगह है जहां विशेष बिट्स दिलचस्प हो जाते हैं, क्योंकि उन्हें अपना स्वयं का कॉलम नहीं मिलता है। सेतुइड मालिक के निष्पादित चरित्र को प्रतिस्थापित करता है, सेटगिड समूह निष्पादन चरित्र को प्रतिस्थापित करता है, और स्टिकी अन्य निष्पादित चरित्र को प्रतिस्थापित करता है। जब अंतर्निहित निष्पादन बिट भी सेट होता है तो अक्षर लोअर केस होता है और जब ऐसा नहीं होता है तो UPPER केस होता है।

तो 4755 rwsr-xr-x है - एक सेटुइड प्रोग्राम जिसे निष्पादित किया जा सकता है - जबकि 4644 rwSr--r-- है, एक सेतुइड फ़ाइल जिसे कोई भी नहीं चला सकता है। कैपिटल एस वह प्रणाली है जो आपको बताती है कि बिट निष्क्रिय है, और यह लगभग हमेशा एक विकल्प के बजाय एक गलती होती है। यही बात 1644 पर लागू होती है, जो rw-r--r-T दिखाता है: एक नियमित फ़ाइल पर एक चिपचिपा बिट जहां अन्य-निष्पादित बिट स्पष्ट है, जो आधुनिक कर्नेल पर बिल्कुल कुछ नहीं करता है।

सीधे रखने लायक दो और भेद। नौ-अक्षर वाली स्ट्रिंग ls prints वह तर्क नहीं है जो chmod लेता है: chmod एक असाइनमेंट सूची चाहता है जैसे कि u=rwx,g=rx,o=rx,u+s। और समान बिट्स का मतलब फ़ाइल की तुलना में निर्देशिका पर अलग-अलग चीजें हैं - निष्पादित का अर्थ है "प्रवेश और ट्रैवर्स किया जा सकता है", सेटगिड का अर्थ है "नई फ़ाइलें इस समूह को प्राप्त करती हैं", और स्टिकी बिट का अर्थ है "कोई भी बना सकता है, केवल मालिक ही हटा सकता है", यही कारण है कि /tmp 1777 है।

Docker Compose करने के लिए चलता है: पार्सिंग, और जो परिवर्तित नहीं होता है

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

अधिकांश फ़्लैग साफ़-साफ़ मैप करते हैं: पोर्ट, वॉल्यूम, पर्यावरण, लेबल, पुनरारंभ नीति, क्षमताएं, स्वास्थ्य जांच, संसाधन सीमाएं, DNS और अतिरिक्त होस्ट सभी में समान अर्थ वाली Compose कुंजियाँ होती हैं। नामित वॉल्यूम और उपयोगकर्ता-परिभाषित नेटवर्क को एक शीर्ष-स्तरीय घोषणा के साथ-साथ सेवा संदर्भ की भी आवश्यकता होती है, इसलिए आउटपुट एक होता है - नेटवर्क पर external: true के साथ, क्योंकि एक नेटवर्क Docker रन शामिल हो सकता है जो पहले से मौजूद था।

कुछ झंडों में कोई Compose समतुल्य नहीं होता है, और यहीं पर कन्वर्टर्स आमतौर पर चुपचाप विफल हो जाते हैं। --rm एक सेवा गुण नहीं है: जब कोई Compose सेवा बाहर निकलती है तो उसे हटाया नहीं जाता है। -d यह बताता है कि आपने CLI को कैसे लागू किया, न कि सेवा क्या है। --link विरासत है, --mount को एक लंबे फॉर्म की आवश्यकता है जो यह टूल नहीं लिखता है, --gpus आपके ड्राइवर पर निर्भर करता है। इनमें से प्रत्येक गायब होने के बजाय एक नामित चेतावनी उत्पन्न करता है। एक अज्ञात ध्वज भी एक चेतावनी उत्पन्न करता है, और इसे बिना किसी मूल्य के माना जाता है, क्योंकि यह अनुमान लगाने से कि इसने एक चेतावनी ली है, आपकी छवि का नाम एक तर्क में बदल जाएगा और एक आत्मविश्वास से गलत फ़ाइल उत्पन्न होगी।

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

उद्धरण कॉस्मेटिक नहीं है. बिना उद्धरण के 8080:80 के रूप में लिखी गई पोर्ट मैपिंग को YAML 1.1 पार्सर्स द्वारा एक संख्या के रूप में पढ़ा जाता है, और हाँ, नहीं, चालू और बंद एक ही बोली में बूलियन हैं। जो कुछ भी गलत पढ़ा जा सकता है उसे उद्धृत किया गया है; जो कुछ भी एक स्ट्रिंग के रूप में स्पष्ट रूप से पढ़ा जाता है उसे अकेला छोड़ दिया जाता है, ताकि फ़ाइल पढ़ने योग्य बनी रहे।

Cron: दो नियम जो सभी को प्रभावित करते हैं

पहला है दिन का नियम. जब महीने का दिन और सप्ताह का दिन दोनों * के अलावा किसी अन्य चीज़ पर सेट होते हैं, तो Cron काम तब चलाता है जब EITHER मेल खाता है - तब नहीं जब दोनों मेल खाते हों। तो 0 0 13 * 5 "13 तारीख की आधी रात, और हर शुक्रवार की आधी रात" है, जो महीने में लगभग पांच बार होती है, न कि "13 तारीख का शुक्रवार", जो साल में एक या दो बार होती है। जब भी दोनों फ़ील्ड प्रतिबंधित होते हैं तो जनरेटर चेतावनी देता है, और वह जो वाक्य लिखता है वह "और" के बजाय "या" कहता है।

दूसरा है समय क्षेत्र. Cron उस मशीन के ज़ोन का उपयोग करता है जिस पर वह चलता है, जो अक्सर सर्वर पर UTC होता है और क्रोनटैब लिखने वाले व्यक्ति का ज़ोन लगभग कभी नहीं होता है। इसलिए अगली बार चलने वाला पूर्वावलोकन यह पूछता है कि आपका क्षेत्र मानने के बजाय किस क्षेत्र का उपयोग करना है। समय की गणना उस क्षेत्र में दीवार-घड़ी के समय के रूप में की जाती है, इसलिए एक दैनिक कार्य एक घंटे के बहाव के बजाय दिन के उजाले-बचत परिवर्तन के दौरान एक ही स्थानीय समय पर रहता है - और एक स्थानीय समय जो मौजूद नहीं है, हर वसंत में छोड़े गए घंटे में, सूची से बाहर छोड़ दिया जाता है, क्योंकि Cron तब भी नहीं चलेगा।

वाक्यविन्यास स्वयं छोटा है: एक सितारा, एक संख्या, एक कैटेगरी ए-बी, एक सूची ए, बी, सी, एक चरण */n या ए-बी/n, और महीने और दिन के नाम JAN-DEC और SUN-SAT. दोनों 0 और 7 मतलब रविवार. एक कदम के साथ एक नंगे मूल्य, जैसे 5/15 मिनट फ़ील्ड में, का अर्थ है "से।" 5 सीमा के अंत तक, प्रत्येक 15", जो मिनट है 5, 20, 35 और 50.

सत्यापन उद्देश्य पर सख्त है। 60 * * * * को अस्वीकार कर दिया गया है क्योंकि मिनट 59 पर रुकते हैं; * * * * 8 को अस्वीकार कर दिया गया है क्योंकि दिन का क्षेत्र 7 पर रुक जाता है; */0 * * * * को अस्वीकार कर दिया गया है क्योंकि शून्य का एक चरण किसी भी चीज़ से मेल नहीं खाता है। छह फ़ील्ड का मतलब आमतौर पर एक क्वार्ट्ज या सिस्टमडी अभिव्यक्ति है जिसका पहला फ़ील्ड सेकंड है, इसलिए त्रुटि केवल गिनती के बजाय कहती है। एक शेड्यूल जो वाक्यविन्यास की दृष्टि से मान्य है, लेकिन कभी चल नहीं सकता - 0 0 30 2 * 30 फरवरी की तारीख मांगता है - स्वीकार किया जाता है और चिह्नित किया जाता है, क्योंकि इससे इनकार करना गलत होगा और चुप रहना और भी बुरा होगा।

आप जो चिपकाते हैं उसका क्या होता है

  • प्रत्येक रूपांतरण, हैश, डिकोड और अंतर आपके ब्राउज़र टैब में चलता है। सर्वर पर कोई इनपुट अपलोड, लॉग या संग्रहीत नहीं किया जाता है, क्योंकि पेज लोड होने के बाद कोई सर्वर शामिल नहीं होता है।
  • हैश ब्राउज़र के अपने Web Crypto कार्यान्वयन से आते हैं, और UUID इसके क्रिप्टोग्राफ़िक रूप से सुरक्षित यादृच्छिक जनरेटर से आते हैं। न ही नेटवर्क कॉल शामिल है।
  • आपके द्वारा टाइप किया गया कुछ भी स्थानीय संग्रहण या कुकी पर नहीं लिखा जाता है। पेज को पुनः लोड करने से वह ख़ारिज हो जाता है; टैब बंद करने से वह ख़ारिज हो जाता है।
  • साइट-व्यापी विश्लेषण केवल कॉन्फ़िगर किए गए कैनोनिकल प्रोडक्शन होस्ट पर चलता है और गोपनीयता नीति में इसका खुलासा किया गया है; स्थानीय और पूर्वावलोकन होस्ट इसे अस्वीकार कर देते हैं। चिपकाए गए मान, टोकन, URL और फ़ाइल सामग्री को ToolAcre के स्वयं के विश्लेषण ईवेंट से बाहर रखा गया है। वर्तमान कॉन्फ़िगरेशन में विज्ञापन अक्षम है.
  • उसने कहा: JWT या API कुंजी एक लाइव क्रेडेंशियल है। सुरक्षित आदत यह है कि इसे कभी भी किसी ऐसे वेब पेज पर पेस्ट न करें जिसे आपने नहीं लिखा है, भले ही इसके दावे कितने भी भरोसेमंद हों - इसमें यह भी शामिल है।

प्रश्न

क्या मैं एडिटर को साफ़ करने के लिए उसमें प्रतिकूल HTML चिपका सकता हूँ?

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

एडिटर मेरी छवियाँ और तालिकाएँ क्यों हटाता है?

क्योंकि वे अनुमति सूची में नहीं हैं. छवियाँ एक आउटबाउंड अनुरोध और एक ऑनररर सतह हैं; तालिकाएँ इस एडिटर के उद्देश्य से बिलकुल बाहर हैं। उनकी पाठ्य सामग्री जीवित रहती है, टैग नहीं। यह एक बग के बजाय अनुमति सूची काम कर रही है - लेकिन इसका मतलब यह है कि यह एक जटिल मौजूदा दस्तावेज़ को संपादित करने के लिए सही टूल नहीं है।

chmod 4644 बड़ा S क्यों दिखाता है?

क्योंकि setuid सेट है और स्वामी निष्पादन बिट नहीं है। बड़े अक्षर का मतलब है कि विशेष बिट पर कार्रवाई करने के लिए कुछ भी नहीं है: यह एक सेतुइड फ़ाइल है जिसे निष्पादित नहीं किया जा सकता है। लोअर केस s का मतलब है कि दोनों बिट सेट हैं। वही नियम आपको सेटगिड के लिए एस और स्टिकी बिट के लिए टी देता है, और इसे पीछे की ओर ले जाना मोड कैलकुलेटर में सबसे आम त्रुटि है।

क्या Docker कन्वर्टर मेरा आदेश चलाता है?

नहीं, और ऐसा नहीं हो सकता. कमांड को एक टोकनाइज़र द्वारा विभाजित किया जाता है जो उद्धरण को समझता है और कुछ नहीं। कोई इवल, कोई शेल, कोई चाइल्ड प्रोसेस नहीं है - पेज को शुरू करने का कोई तरीका नहीं है। आप जो भी पेस्ट करते हैं वह टैब में रहता है।

कन्वर्टर उस झंडे को गिराने के बजाय चेतावनी क्यों देता है जिसे वह संभाल नहीं सकता?

क्योंकि एक Compose फ़ाइल जो चुपचाप जिस कमांड से आई है उससे कम काम करती है, वह बिल्कुल भी आउटपुट न होने से भी बदतर है: आपको उत्पादन में पता चलता है। हर उस झंडे का नाम दिया गया है जिसका प्रतिनिधित्व नहीं किया गया है, इसके बारे में क्या करना है। यदि आपको कोई चेतावनी नहीं दिखती है, तो कुछ भी नहीं खोया गया है।

अगला Cron रन मेरे सर्वर से भिन्न क्यों है?

लगभग हमेशा समय क्षेत्र. क्रोन इसे चलाने वाली मशीन के क्षेत्र का उपयोग करता है; पूर्वावलोकन आपके द्वारा ड्रॉपडाउन में चुने गए क्षेत्र का उपयोग करता है। इसे अपने सर्वर के क्षेत्र में सेट करें - अक्सर UTC - और उन्हें सहमत होना चाहिए। दूसरा उम्मीदवार दिन का नियम है: यदि महीने का दिन और सप्ताह का दिन दोनों निर्धारित हैं, तो Cron किCAक पर चलता है, जो कि ज्यादातर लोगों के इरादे से अधिक होता है।

सीमाएँ

  • HTML सैनिटाइज़र इस एडिटर के स्वयं के आउटपुट के लिए एक अनुमति सूची है, जिसे पूर्ण HTML5 पार्सर के बजाय एक स्ट्रिंग टोकनाइज़र के रूप में कार्यान्वित किया जाता है। यह एक सामान्य प्रयोजन XSS फ़िल्टर नहीं है और इसे एक के रूप में उपयोग नहीं किया जाना चाहिए।
  • एडिटर के पास कोई छवियाँ, तालिकाएँ, रंग या फ़ॉन्ट नियंत्रण नहीं हैं, और उन्हें जोड़ने का कोई तरीका नहीं है: अनुमति सूची के बाहर की सभी चीज़ें हटा दी जाती हैं।
  • संपादन सतह document.execCommand का उपयोग करती है, जिसे अप्रचलित कर दिया गया है और इसका कोई प्रतिस्थापन नहीं किया गया है। ब्राउज़र अभी भी इसका समर्थन करते हैं; व्यवहार उनके बीच थोड़ा भिन्न होता है, विशेषकर सूची नेस्टिंग के आसपास।
  • chmod कैलकुलेटर केवल बारह अनुमति बिट्स को कवर करता है। अभिगम नियंत्रण सूचियाँ, विस्तारित विशेषताएँ, SELinux संदर्भ, umask अंकगणित और Windows ACL सभी दायरे से बाहर हैं।
  • Docker कन्वर्टर एकल Docker रन कमांड को एकल सेवा में अनुवादित करता है। यह Dockerfiles को नहीं पढ़ता है, छवियों को हल नहीं करता है, और --mount, --gpus, --device, --link या --volumes-from को व्यक्त नहीं कर सकता है; उनमें से प्रत्येक इसके बजाय एक नामित चेतावनी उत्पन्न करता है।
  • जिन फ़्लैगों को कन्वर्टर नहीं पहचानता उन्हें बिना किसी मूल्य के माना जाता है। यदि ऐसा कोई ध्वज लेता है, तो मूल्य को गलत तरीके से पढ़ा जाएगा - चेतावनी ऐसा कहती है, और ध्वज को हटाना ही ठीक है।
  • Cron जनरेटर केवल पांच-फ़ील्ड क्रॉस्टैब प्रारूप को पढ़ता है। छह-क्षेत्र क्वार्ट्ज और सिस्टमडी अभिव्यक्ति, @reboot, और गैर-मानक एल, डब्ल्यू, # और? ऑपरेटरों को अनुमान लगाने के बजाय मना कर दिया जाता है।
  • अगली बार चलने का समय अंतर्राष्ट्रीय के माध्यम से ब्राउज़र के अपने समय-क्षेत्र डेटाबेस से आता है। वे एक पूर्वावलोकन हैं, कोई गारंटी नहीं: मशीन चलाने वाले Cron में एक अलग ज़ोन, एक अलग डेटाबेस संस्करण या एक डेमॉन हो सकता है जो समय आने पर नहीं चल रहा था।