प्रस्तावना
पहले, मैं कहूंगा कि यह समस्या का समाधान करने का सही तरीका नहीं है। यह कहना थोड़ा सा है कि " आपको लोगों की हत्या नहीं करनी चाहिए क्योंकि अन्यथा आप जेल जाएंगे ।"
इसी तरह, आप अपने चर को उद्धृत नहीं करते हैं क्योंकि अन्यथा आप सुरक्षा कमजोरियों का परिचय दे रहे हैं। आप अपने चर को उद्धृत करते हैं क्योंकि यह गलत नहीं है (लेकिन अगर जेल का डर मदद कर सकता है, तो क्यों नहीं)।
उन लोगों के लिए एक छोटा सारांश जो अभी-अभी ट्रेन में कूद गए हैं।
अधिकांश गोले में, एक चर विस्तार को निर्विवाद छोड़ दिया (हालांकि वह (और इस उत्तर के बाकी) भी कमांड प्रतिस्थापन ( `...`या $(...)) और अंकगणितीय विस्तार ( $((...))या $[...]) के लिए लागू होता है एक बहुत ही विशेष अर्थ है। इसका वर्णन करने का सबसे अच्छा तरीका यह है कि यह किसी प्रकार के निहित विभाजन + ग्लोब ऑपरेटर¹ को लागू करने जैसा है ।
cmd $var
किसी अन्य भाषा में कुछ इस तरह लिखा जाएगा:
cmd(glob(split($var)))
$var$IFSविशेष पैरामीटर ( स्प्लिट पार्ट) को शामिल करने वाले जटिल नियमों के अनुसार पहले शब्दों की एक सूची में विभाजित किया जाता है और फिर उस विभाजन के परिणामस्वरूप प्रत्येक शब्द को एक पैटर्न के रूप में माना जाता है जो इसे ( ग्लॉब भाग) से मेल खाने वाली फ़ाइलों की सूची में विस्तारित होता है ।
एक उदाहरण के रूप में, यदि $varइसमें समाहित है *.txt,/var/*.xmlऔर $IFS
सम्मिलित है ,, cmdतो तमाम तर्कों के साथ बुलाया जाएगा, पहले cmdवाले txt
और वर्तमान निर्देशिका में xmlफाइलें और अंदर की फाइलें होने के नाते /var।
यदि आप cmdकेवल दो शाब्दिक तर्कों के साथ फोन करना चाहते हैं cmd
और *.txt,/var/*.xml, आप लिखेंगे:
cmd "$var"
जो आपकी अन्य परिचित भाषा में होगा:
cmd($var)
शेल में भेद्यता से हमारा क्या मतलब है ?
आखिरकार, यह समय की सुबह से ही ज्ञात है कि शेल लिपियों का उपयोग सुरक्षा-संवेदनशील संदर्भों में नहीं किया जाना चाहिए। निश्चित रूप से, ठीक है, एक चर को छोड़ना एक बग है लेकिन यह इतना नुकसान नहीं कर सकता है, क्या यह कर सकता है?
खैर, इस तथ्य के बावजूद कि कोई भी आपको बताएगा कि शेल लिपियों का उपयोग वेब सीजीआई के लिए कभी नहीं किया जाना चाहिए, या शुक्र है कि ज्यादातर सिस्टम आजकल सेतु / सेगिड शेल स्क्रिप्ट की अनुमति नहीं देते हैं, एक चीज़ जो शेलशॉक (दूरस्थ रूप से शोषक थैला बग) ने बनाई है सितंबर 2014 में) सुर्खियों में है कि गोले अभी भी बड़े पैमाने पर उपयोग किए जाते हैं जहां वे शायद नहीं करना चाहिए: सीजीआई में, डीएचसीपी क्लाइंट हुक स्क्रिप्ट में, सुडोयर्स कमांड में, (यदि नहीं ) के रूप में सेट किया गया है ।
कभी-कभी अनजाने में। मिसाल के तौर पर system('cmd $PATH_INFO')
एक में php/ perl/ pythonCGI स्क्रिप्ट कमांड लाइन व्याख्या करने के लिए एक खोल आह्वान करता है (तथ्य यह है कि उल्लेख करने के लिए नहीं cmdअपने आप में एक खोल स्क्रिप्ट और उसके लेखक हो सकता है कभी नहीं की उम्मीद हो सकता है यह एक CGI से कहा जा करने के लिए)।
विशेषाधिकार हनन के लिए एक रास्ता होने पर आपको एक भेद्यता मिल गई है, जब कोई व्यक्ति (उसे हमलावर कहते हैं ) कुछ ऐसा करने में सक्षम है जिसका वह मतलब नहीं है।
हमेशा इसका मतलब है कि हमलावर डेटा प्रदान करता है, उस डेटा को एक विशेषाधिकार प्राप्त उपयोगकर्ता / प्रक्रिया द्वारा संसाधित किया जाता है जो अनजाने में ऐसा कुछ करता है जो बग के कारण अधिकांश मामलों में नहीं होना चाहिए।
असल में, आपको एक समस्या है जब आपका छोटी गाड़ी हमलावर के नियंत्रण में डेटा संसाधित करती है ।
अब, यह हमेशा स्पष्ट नहीं होता है कि डेटा कहाँ से आ सकता है, और यह बताना मुश्किल है कि क्या आपका कोड कभी भी अविश्वसनीय डेटा को संसाधित करने के लिए मिलेगा।
जहां तक चरों का संबंध है, एक CGI स्क्रिप्ट के मामले में, यह काफी स्पष्ट है, डेटा CGI GET / POST पैरामीटर और कुकीज, पथ, होस्ट ... पैरामीटर जैसी चीजें हैं।
एक सेटिउड स्क्रिप्ट के लिए (एक उपयोगकर्ता द्वारा दूसरे के रूप में चलाने पर), यह तर्क या पर्यावरण चर हैं।
एक और बहुत ही सामान्य वेक्टर फ़ाइल नाम है। यदि आपको निर्देशिका से फ़ाइल सूची मिल रही है, तो यह संभव है कि हमलावर द्वारा वहां फाइलें लगाई गई हों ।
उस संबंध में, यहां तक कि एक इंटरेक्टिव शेल के संकेत पर, आप असुरक्षित हो सकते हैं (
उदाहरण के लिए /tmpया ~/tmpउदाहरण के लिए फ़ाइलों को संसाधित करते समय )।
यहां तक कि एक ~/.bashrcअसुरक्षित भी हो सकता है (उदाहरण के लिए, bashजब ग्राहक के नियंत्रण में कुछ चर के साथ सर्वर परिनियोजन की
तरह sshचलाने के लिए आह्वान किया जाएगा )।ForcedCommandgit
अब, एक स्क्रिप्ट को सीधे अविश्वसनीय डेटा को संसाधित करने के लिए नहीं कहा जा सकता है, लेकिन इसे किसी अन्य कमांड द्वारा किया जा सकता है। या आपका गलत कोड उन लिपियों में कॉपी-पेस्ट किया जा सकता है जो आपके द्वारा या आपके किसी सहकर्मी से 3 साल नीचे (करते हैं)। एक जगह जहाँ यह विशेष रूप से महत्वपूर्ण है क्यू एंड ए साइटों के उत्तर में है क्योंकि आपको कभी नहीं पता होगा कि आपके कोड की प्रतियां कहाँ समाप्त हो सकती हैं।
व्यापार के लिए नीचे; यह कितना बुरा है?
एक चर (या कमांड प्रतिस्थापन) को छोड़ना खोल कोड के साथ जुड़े सुरक्षा भेद्यताओं का नंबर एक स्रोत है। आंशिक रूप से क्योंकि वे कीड़े अक्सर कमजोरियों में अनुवाद करते हैं, बल्कि इसलिए भी क्योंकि यह बिना पढ़े हुए चरों को देखना आम है।
दरअसल, जब शेल कोड में कमजोरियों की तलाश की जाती है, तो सबसे पहली बात यह है कि अनक्वेटेड वेरिएबल्स की तलाश करें। स्पॉट करना आसान है, अक्सर एक अच्छा उम्मीदवार, आमतौर पर हमलावर-नियंत्रित डेटा पर वापस ट्रैक करना आसान होता है।
वहाँ एक अनंत चर के तरीके की एक अनंत संख्या एक भेद्यता में बदल सकते हैं। मैं यहां केवल कुछ सामान्य रुझान बताऊंगा।
जानकारी प्रकटीकरण
अधिकांश लोग विभाजित भाग की वजह से अछूता चर से जुड़े कीड़े से टकराएंगे (उदाहरण के लिए, आजकल फाइलों में उनके नाम के साथ स्थान होना आम बात है और स्थान IFS के डिफ़ॉल्ट मान में है)। बहुत से लोग ग्लोब वाले हिस्से को नजरअंदाज कर देंगे
। ग्लोब हिस्सा कम से कम के रूप में के रूप में खतरनाक है
विभाजन हिस्सा।
असमान बाहरी इनपुट पर किए गए ग्लोबिंग का मतलब है कि हमलावर आपको किसी भी निर्देशिका की सामग्री को पढ़ सकता है।
में:
echo You entered: $unsanitised_external_input
यदि $unsanitised_external_inputशामिल है /*, तो इसका मतलब है कि हमलावर सामग्री देख सकता है /। कोई बड़ी बात नहीं। हालांकि यह और अधिक दिलचस्प हो जाता है के साथ /home/*जो आप मशीन पर उपयोगकर्ता नामों की सूची देता है, /tmp/*, /home/*/.forwardअन्य खतरनाक प्रथाओं पर संकेत, के लिए /etc/rc*/*समर्थित सेवाओं के लिए ... कोई ज़रूरत नहीं उन्हें व्यक्तिगत नाम है। मान का /*
/*/* /*/*/*...केवल संपूर्ण फ़ाइल सिस्टम सूचीबद्ध करेगा।
सेवा कमजोरियों से इनकार।
पिछले मामले को थोड़ा आगे ले जाना और हमें एक DoS मिला है।
वास्तव में, गैर-सूचीबद्ध इनपुट के साथ सूची के संदर्भ में कोई भी निर्विवाद चर कम से कम एक DoS भेद्यता है।
यहां तक कि विशेषज्ञ शेल स्क्रिप्टर्स आमतौर पर चीजों को उद्धृत करना भूल जाते हैं:
#! /bin/sh -
: ${QUERYSTRING=$1}
:नो-ऑप कमांड है। क्या गलत होने की सम्भावना है?
कि अगर
अप्रभावित था असाइन $1करने के लिए है । यह कमांड लाइन के साथ-साथ CGI स्क्रिप्ट को कॉल करने योग्य एक त्वरित तरीका है।$QUERYSTRING$QUERYSTRING
यही कारण है कि $QUERYSTRINGअभी भी विस्तार किया जाता है और क्योंकि यह उद्धृत नहीं कर रहा है, विभाजन + ग्लोब ऑपरेटर शुरू हो जाती है।
अब, कुछ ग्लब्स हैं जो विशेष रूप से महंगे हैं। यह /*/*/*/*काफी खराब है क्योंकि इसका मतलब है कि निर्देशिका को 4 स्तर तक नीचे सूचीबद्ध करना। डिस्क और सीपीयू गतिविधि के अलावा, इसका मतलब है कि हजारों फ़ाइल पथों का भंडारण (40k यहां एक न्यूनतम सर्वर वीएम, 10k जिसमें से निर्देशिकाएं)।
अब /*/*/*/*/../../../../*/*/*/*40k x 10k का मतलब है और
/*/*/*/*/../../../../*/*/*/*/../../../../*/*/*/*सबसे शक्तिशाली मशीन को अपने घुटनों तक लाने के लिए पर्याप्त है।
इसे अपने लिए आज़माएँ (हालाँकि आपकी मशीन क्रैश या लटकने के लिए तैयार हो):
a='/*/*/*/*/../../../../*/*/*/*/../../../../*/*/*/*' sh -c ': ${a=foo}'
बेशक, अगर कोड है:
echo $QUERYSTRING > /some/file
तब आप डिस्क को भर सकते हैं।
बस शेल cgi या bash cgi या ksh cgi पर एक Google खोज करें , और आपको कुछ पेज मिलेंगे जो आपको बताएंगे कि कैसे गोले में CGI लिखना है। ध्यान दें कि प्रक्रिया के मापदंडों में से आधे असुरक्षित हैं।
यहां तक कि डेविड कॉर्न की खुद
की चपेट में है (कुकी से निपटने के लिए देखें)।
मनमाना कोड निष्पादन कमजोरियों तक
महत्वाकांक्षी कोड निष्पादन सबसे खराब प्रकार की भेद्यता है, क्योंकि अगर हमलावर किसी भी कमांड को चला सकता है, तो वह क्या कर सकता है, इसकी कोई सीमा नहीं है।
यह आम तौर पर विभाजित भाग है जो उन लोगों की ओर जाता है। बंटवारे के परिणामस्वरूप कई तर्कों को आदेशों को पारित किया जाता है जब केवल एक ही उम्मीद की जाती है। जबकि उनमें से पहले का उपयोग अपेक्षित संदर्भ में किया जाएगा, अन्य अलग संदर्भ में होंगे इसलिए संभावित रूप से अलग-अलग व्याख्या की जाएगी। एक उदाहरण के साथ बेहतर:
awk -v foo=$external_input '$2 == foo'
यहाँ, इरादा $external_inputशेल चर की सामग्री को चर में निर्दिष्ट करना था
foo awk।
अभी:
$ external_input='x BEGIN{system("uname")}'
$ awk -v foo=$external_input '$2 == foo'
Linux
के विभाजन के कारण दूसरा शब्द $external_input
असाइन नहीं किया गया है, fooलेकिन awkकोड के रूप में माना जाता है (यहां जो एक मनमाना आदेश निष्पादित करता है:) uname।
यही कारण है कि वे आदेश दिए गए अन्य आदेश पर अमल कर सकते हैं के लिए विशेष रूप से एक समस्या है ( awk, env, sed(जीएनयू एक), perl, find...) विशेष रूप से जीएनयू वेरिएंट (जो तर्क के बाद विकल्पों को स्वीकार) के साथ। कभी कभी, आप आदेशों पर शक नहीं होता जैसे अन्य लोगों को निष्पादित करने में सक्षम हो ksh, bashया zshकी [या printf...
for file in *; do
[ -f $file ] || continue
something-that-would-be-dangerous-if-$file-were-a-directory
done
यदि हम नामक एक निर्देशिका बनाते हैं x -o yes, तो परीक्षण सकारात्मक हो जाता है, क्योंकि यह पूरी तरह से अलग सशर्त अभिव्यक्ति है जिसका हम मूल्यांकन कर रहे हैं।
इससे भी बदतर, अगर हम x -a a[0$(uname>&2)] -gt 1कम से कम सभी ksh कार्यान्वयनों (जिसमें sh
अधिकांश वाणिज्यिक यूनियनों और कुछ BSDs शामिल हैं) के साथ, नामक एक फ़ाइल बनाते हैं , जो निष्पादित करता है uname
क्योंकि उन शेल [कमांड के संख्यात्मक तुलना ऑपरेटरों पर अंकगणितीय मूल्यांकन करते हैं ।
$ touch x 'x -a a[0$(uname>&2)] -gt 1'
$ ksh -c 'for f in *; do [ -f $f ]; done'
Linux
के साथ bashएक फ़ाइल नाम के लिए ही x -a -v a[0$(uname>&2)]।
बेशक, अगर वे मनमाना निष्पादन प्राप्त नहीं कर सकते, तो हमलावर कम क्षति के लिए समझौता कर सकता है (जो मनमाना निष्पादन प्राप्त करने में मदद कर सकता है)। कोई भी आदेश जो फाइलें लिख सकता है या अनुमतियाँ बदल सकता है, स्वामित्व या किसी भी मुख्य या साइड इफेक्ट का फायदा उठाया जा सकता है।
फ़ाइल नाम के साथ सभी प्रकार की चीजें की जा सकती हैं।
$ touch -- '-R ..'
$ for file in *; do [ -f "$file" ] && chmod +w $file; done
और आप ..लेखनीय (GNU के साथ पुनरावर्ती
chmod) बनाते हैं ।
सार्वजनिक रूप से लिखने योग्य क्षेत्रों में फ़ाइलों के स्वचालित प्रसंस्करण करने वाले लिपियों /tmpको बहुत सावधानी से लिखा जाना है।
व्हाट अबाउट [ $# -gt 1 ]
मुझे लगता है कि मैं बहुत खुश हूँ। कुछ लोग यह सोचकर सभी परेशान हो जाते हैं कि क्या किसी विशेष विस्तार से यह तय करने में समस्या हो सकती है कि क्या वे उद्धरणों को छोड़ सकते हैं।
यह कहने जैसा है। अरे, ऐसा लगता $#है कि विभाजित + ग्लोब ऑपरेटर के अधीन नहीं हो सकता है, आइए शेल को विभाजित करने के लिए कहें + इसे ग्लोब करें । या अरे, चलो गलत कोड लिखते हैं क्योंकि बग हिट होने की संभावना नहीं है ।
अब इसकी संभावना कितनी कम है? ठीक है, $#(या $!, $?या किसी भी अंकगणितीय प्रतिस्थापन) में केवल अंक (या -कुछ के लिए ) हो सकते हैं ताकि ग्लोब वाला भाग बाहर हो। के लिए विभाजन हिस्सा हालांकि कुछ करने के लिए, हम सभी की जरूरत के लिए है $IFSअंक होने के लिए (या -)।
कुछ गोले के साथ, $IFSपर्यावरण से विरासत में मिला जा सकता है, लेकिन अगर पर्यावरण सुरक्षित नहीं है, तो यह वैसे भी खेल है।
अब यदि आप एक फंक्शन लिखते हैं जैसे:
my_function() {
[ $# -eq 2 ] || return
...
}
इसका मतलब यह है कि आपके कार्य का व्यवहार उस संदर्भ पर निर्भर करता है जिसमें इसे कहा जाता है। या दूसरे शब्दों में, $IFS
इसके इनपुट में से एक बन जाता है। कड़ाई से बोलते हुए, जब आप अपने फ़ंक्शन के लिए एपीआई प्रलेखन लिखते हैं, तो यह कुछ इस तरह होना चाहिए:
# my_function
# inputs:
# $1: source directory
# $2: destination directory
# $IFS: used to split $#, expected not to contain digits...
और अपने फ़ंक्शन को कॉल करने वाले कोड को यह सुनिश्चित करने की आवश्यकता है कि $IFSइसमें अंक नहीं हैं। वह सब क्योंकि आपको उन 2 दोहरे-भाव वर्णों को टाइप करने का मन नहीं था।
अब, उस [ $# -eq 2 ]बग को भेद्यता बनने के लिए, आपको हमलावर$IFS के नियंत्रण में मूल्य के लिए किसी तरह की आवश्यकता होगी । जब तक कि हमलावर एक और बग का फायदा उठाने में कामयाब नहीं हो जाता, तब तक यह हो सकता है ।
हालांकि यह अनसुना नहीं है। एक सामान्य मामला है जब लोग अंकगणितीय अभिव्यक्ति में उपयोग करने से पहले डेटा को साफ करना भूल जाते हैं। हमने पहले ही ऊपर देखा है कि यह कुछ गोले में मनमाने कोड निष्पादन की अनुमति दे सकता है, लेकिन उन सभी में, यह हमलावर को किसी भी चर को पूर्णांक मान देने की अनुमति देता
है ।
उदाहरण के लिए:
n=$(($1 + 1))
if [ $# -gt 2 ]; then
echo >&2 "Too many arguments"
exit 1
fi
और एक $1मान के साथ (IFS=-1234567890), उस अंकगणितीय मूल्यांकन में IFS की सेटिंग का साइड इफेक्ट होता है और अगली [
कमांड विफल हो जाती है जिसका अर्थ है कि बहुत सारे args के लिए चेक बायपास हो गया है।
जब विभाजन + ग्लोब ऑपरेटर को लागू नहीं किया जाता है तो क्या होगा?
एक और मामला है जहां चर और अन्य विस्तार के आसपास उद्धरणों की आवश्यकता होती है: जब यह एक पैटर्न के रूप में उपयोग किया जाता है।
[[ $a = $b ]] # a `ksh` construct also supported by `bash`
case $a in ($b) ...; esac
परीक्षण करें कि क्या $aऔर $bएक ही हैं (को छोड़कर zsh) लेकिन अगर $aपैटर्न में मेल खाता है $b। और तुम उद्धृत करने के लिए की जरूरत है $bअगर आप तारों के रूप में तुलना करना चाहते हैं (एक ही बात में "${a#$b}"या "${a%$b}"या "${a##*$b*}"जहां $bउद्धृत किया जाना चाहिए, अगर यह नहीं है एक पैटर्न के रूप में लिया जाना चाहिए)।
क्या इसका मतलब है कि वह यह है कि [[ $a = $b ]]मामलों में सही वापस आ सकते हैं जहां $aसे अलग है $b(उदाहरण के लिए जब $aहै anythingऔर $bहै *) या जब वे समान हैं झूठी वापस आ सकते हैं (उदाहरण के लिए जब दोनों $aऔर $bकर रहे हैं [a])।
एक सुरक्षा भेद्यता के लिए कर सकते हैं? हाँ, किसी बग की तरह। यहां, हमलावर आपकी स्क्रिप्ट के तार्किक कोड प्रवाह को बदल सकता है और / या आपकी स्क्रिप्ट बनाने वाली मान्यताओं को तोड़ सकता है। उदाहरण के लिए, एक कोड जैसे:
if [[ $1 = $2 ]]; then
echo >&2 '$1 and $2 cannot be the same or damage will incur'
exit 1
fi
हमलावर पास से चेक को बायपास कर सकता है '[a]' '[a]'।
अब, यदि न तो वह पैटर्न मिलान करता है और न ही विभाजित + ग्लोब ऑपरेटर लागू होता है, तो एक चर को छोड़ने में क्या खतरा है?
मुझे स्वीकार करना होगा कि मैं लिखता हूं:
a=$b
case $a in...
वहां, उद्धृत करना नुकसान नहीं पहुंचाता है लेकिन सख्ती से आवश्यक नहीं है।
हालांकि, उन मामलों में उद्धरण छोड़ने का एक पक्ष प्रभाव (उदाहरण के लिए प्रश्नोत्तर में) यह है कि यह शुरुआती लोगों को एक गलत संदेश भेज सकता है: कि यह चर को उद्धृत करने के लिए ठीक नहीं है ।
उदाहरण के लिए, वे यह सोचना शुरू कर सकते हैं कि यदि a=$bठीक है, तो export a=$bयह भी होगा (जो कि कई गोले में नहीं है क्योंकि यह exportसूची के संदर्भ में कमांड के तर्क में है) या env a=$b।
किस बारे में zsh?
zshउन डिजाइन awkwardnesses के सबसे ठीक किया। में zsh(कम से कम जब श / क्श एमुलेशन मोड में नहीं), यदि आप विभाजन या ग्लोबिंग , या पैटर्न मिलान चाहते हैं, तो आपको इसे स्पष्ट रूप से अनुरोध करना होगा: $=varविभाजित करने के लिए, और $~varग्लोब के लिए या चर की सामग्री के रूप में माना जाएगा। एक तरीका।
हालांकि, विभाजन (लेकिन ग्लोबिंग नहीं) अभी भी अंतर्निहित कमांड प्रतिस्थापन (जैसा कि echo $(cmd)) पर निहित है ।
इसके अलावा, चर को उद्धृत न करने का एक कभी-कभी अवांछित साइड इफेक्ट, खाली करने वाला निष्कासन है । zshव्यवहार क्या आप अन्य गोले में (के साथ पूरी तरह ग्लोबिंग को अक्षम करके प्राप्त कर सकते हैं के समान है set -f) और बंटवारे (साथ IFS='')। अभी भी:
cmd $var
कोई विभाजन + ग्लोब नहीं होगा , लेकिन यदि $varखाली है, तो एक खाली तर्क प्राप्त करने के बजाय, cmdकोई तर्क नहीं मिलेगा।
यह कीड़े (स्पष्ट की तरह [ -n $var ]) पैदा कर सकता है । यह संभवतः एक स्क्रिप्ट की अपेक्षाओं और मान्यताओं को तोड़ सकता है और कमजोरियों का कारण बन सकता है, लेकिन मैं अभी भी एक बहुत-बहुत-बहुत-उदाहरण के साथ नहीं आ सकता हूं)।
जब आपको विभाजन + ग्लोब ऑपरेटर की आवश्यकता होती है तो क्या होगा ?
हां, यह आम तौर पर तब होता है जब आप अपने वैरिएबल को अधूरा छोड़ना चाहते हैं। लेकिन फिर आपको यह सुनिश्चित करने की आवश्यकता है कि आप अपने विभाजन और ग्लोब ऑपरेटरों को इसे इस्तेमाल करने से पहले सही ढंग से ट्यून करें । यदि आप केवल स्प्लिट भाग चाहते हैं, न कि ग्लोब पार्ट (जो कि ज्यादातर समय होता है), तो आपको ग्लोबिंग ( set -o noglob/ set -f) को अक्षम करने और ठीक करने की आवश्यकता है $IFS। अन्यथा आप कमजोरियों का कारण बनेंगे (जैसे डेविड कोर्न के सीजीआई उदाहरण ऊपर उल्लेखित हैं)।
निष्कर्ष
संक्षेप में, गोले में अछूता एक चर (या कमांड प्रतिस्थापन या अंकगणित विस्तार) को छोड़ना विशेष रूप से गलत संदर्भों में किए जाने पर वास्तव में बहुत खतरनाक हो सकता है, और यह जानना बहुत कठिन है कि वे गलत संदर्भ कौन से हैं।
यही एक कारण है कि इसे बुरा व्यवहार क्यों माना जाता है ।
अब तक पढ़ने के लिए धन्यवाद। यदि यह आपके सिर पर चला जाता है, तो चिंता न करें। हर कोई अपने कोड को लिखने के सभी निहितार्थों को समझने की उम्मीद नहीं कर सकता है जिस तरह से वे इसे लिखते हैं। इसलिए हमारे पास
अच्छी अभ्यास सिफारिशें हैं , इसलिए उन्हें आवश्यक समझे बिना पालन किया जा सकता है क्यों।
(और यदि यह अभी तक स्पष्ट नहीं है, तो कृपया शेल में सुरक्षा संवेदनशील कोड लिखने से बचें)।
और कृपया इस साइट पर अपने जवाब पर अपने चर को उद्धृत करें!
¹In ksh93और pdkshऔर डेरिवेटिव में, ब्रेस विस्तार भी किया जाता है जब तक कि ग्लोबिंग को अक्षम नहीं किया जाता है ( ksh93संस्करण में ksh93u + तक, जबकि braceexpandविकल्प अक्षम है)।