क्या 'eval echo` का उपयोग करना हमेशा सुरक्षित है?


20

उपयोग करने evalको अक्सर हतोत्साहित किया जाता है क्योंकि यह मनमाने कोड के निष्पादन की अनुमति देता है। हालांकि, अगर हम उपयोग करते हैं eval echo, तो ऐसा लगता है कि बाकी स्ट्रिंग तर्क बन जाएंगे echoइसलिए यह सुरक्षित होना चाहिए। क्या मैं इस पर सही हूं?


1
हमेशा सुरक्षित न होने के कारण आप कांटा बम या गंदा rm -fR *
μολὼν.λα16

हो सकता है कि यह सिर्फ एक सोचा हुआ प्रयोग है, लेकिन अगर आप वास्तव में इसे करने के लिए ऐसा करने के बारे में सोच रहे थे तो इसे कई तरह के तर्क दिए -nजा सकते हैं , जैसे कि आप इसे बिना किसी अयोग्य चर के साथ कर सकते हैं echo $argumentsया यदि $argumentsयह एक सरणी है echo "${arguments[@]}"। का उपयोग करते हुए eval echoभले ही यह व्यर्थ है थे सुरक्षित।
जोएल

जवाबों:


40

counterexample:

DANGEROUS=">foo"
eval echo $DANGEROUS

echo"फू" नामक एक फाइल बनाने की तुलना में मनमाने तर्क कुछ और अधिक अप्रिय कर सकते थे।


6
इसके अलावा: के DANGEROUS="hello;ls"स्थान पर मनमाने आदेशों के लिए ls
Kusalananda

2
इसके अलावा: DANGEROUS='$(ls)'(अधिक भागने की आवश्यकता हो सकती है)।
wizzwizz4

चाहेंगे eval echo '"'"$DANGEROUS"'"'काम करते हैं? यह goo.gl/L2pPQP
Ismael Miguel

@IsmaelMiguel जो wizzwizz, Cyker, या sorontar के उदाहरणों के लिए, या स्ट्रिंग में किसी भी चीज़ के लिए किसी भी चीज़ के लिए काम नहीं करता (जैसे DANGEROUS='">foo"')।
गॉर्डन डेविसन

अरे। हालांकि मुझे कुछ ऐसा मिला, जिसने
इस्माइल मिगेल

26

@ कैलाडा ने एक उत्कृष्ट उत्तर प्रदान किया है। प्रदर्शित करने के evalलिए वास्तव में बुराई है, "फू" नामक एक फ़ाइल बनाने की तुलना में यहां कुछ और अधिक अप्रिय है :

DANGEROUS='$(rm foo)'
eval echo "$DANGEROUS"

और निश्चित रूप से "फू" नामक एक फ़ाइल बनाने की तुलना में कुछ और अधिक नापाक से कुछ और अधिक अप्रिय हो सकता है


8
+1 को चर की तरह प्रदर्शित "$THIS"करने के बजाय केवल इसे पसंद $THISकरने से भी मदद नहीं मिलती है!
सेलडा

उद्धरणों की एक विशेष जोड़ी भेजना मदद करने लगता है। कुछ इस तरह eval echo '"'"$DANGEROUS"'"'। इसे goo.gl/L2pPQP
Ismael Miguel

वास्तव में, आपका उदाहरण किसी से ज्यादा नापाक नहीं है >foo, क्योंकि "फू 'नामक एक फाइल बनाना जरूरी नहीं >fooहै। आपके उदाहरण में एकमात्र वास्तविक अंतर यह है कि यह एक खाली फ़ाइल को पीछे नहीं छोड़ता है। सामग्री अभी भी गए हैं।
flarn2006

12

नहीं, यह हमेशा सुरक्षित नहीं है । एक निष्कासन किसी भी आदेश को निष्पादित कर सकता है।

एक सुरक्षित आदेश, इस तरह (तारीख को निष्पादित नहीं किया जाता है क्योंकि यह एकल उद्धरण के अंदर है):

$ echo '$(date)'
$(date)

Eval के साथ प्रयोग होने पर खतरनाक हो जाता है:

$ eval echo '$(date)'
Sat Dec 24 22:55:55 UTC 2016

बेशक, तारीख किसी भी आदेश हो सकता है ।

इसे सुधारने का एक तरीका अतिरिक्त रूप से तर्कों को उद्धृत करना है:

$ eval echo '\$(date)'
$(date)

लेकिन आमतौर पर एक अभिव्यक्ति को दो बार सही ढंग से उद्धृत करना मुश्किल होता है।

और अगर बाहरी हमलावर द्वारा अभिव्यक्ति को सेट किया जा सकता है, तो सही उद्धरण को नियंत्रित करना असंभव हो जाता है, जैसे:

$ var='$(date);echo Hello!'
$ eval echo "$var"
Sat Dec 24 23:01:48 UTC 2016
Hello!

1

हालांकि यह सच है कि evalहमेशा सावधानी के साथ संपर्क करने की आवश्यकता होती है, eval echoनिर्माण हमेशा व्यर्थ नहीं होता है और इसे सुरक्षित रूप से उपयोग किया जा सकता है। मुझे हाल ही में इसकी आवश्यकता थी कि कई ब्रेस एक्सपेंशन का मूल्यांकन उस क्रम में किया जाए जिसकी मुझे जरूरत थी।

bash बाएं से दाएं कई ब्रेस एक्सपेंशन करता है, इसलिए

xargs -I_ cat _/{11..15}/{8..5}.jpg

तक फैलता है

xargs -I_ cat _/11/8.jpg _/11/7.jpg _/11/6.jpg _/11/5.jpg _/12/8.jpg _/12/7.jpg _/12/6.jpg _/12/5.jpg _/13/8.jpg _/13/7.jpg _/13/6.jpg _/13/5.jpg _/14/8.jpg _/14/7.jpg _/14/6.jpg _/14/5.jpg _/15/8.jpg _/15/7.jpg _/15/6.jpg _/15/5.jpg

लेकिन मुझे दूसरे ब्रेस विस्तार की आवश्यकता थी, जो पहले किया गया था, उपज

xargs -I_ cat _/11/8.jpg _/12/8.jpg _/13/8.jpg _/14/8.jpg _/15/8.jpg _/11/7.jpg _/12/7.jpg _/13/7.jpg _/14/7.jpg _/15/7.jpg _/11/6.jpg _/12/6.jpg _/13/6.jpg _/14/6.jpg _/15/6.jpg _/11/5.jpg _/12/5.jpg _/13/5.jpg _/14/5.jpg _/15/5.jpg

सबसे अच्छा मैं ऐसा करने के लिए आ सकता था

xargs -I_ cat $(eval echo _/'{11..15}'/{8..5}.jpg)

यह काम करता है क्योंकि एकल उद्धरण evalकमांड लाइन के पार्सिंग के दौरान ब्रेसिज़ के पहले सेट को विस्तार से बचाते हैं , जिससे उन्हें उपविभाजित द्वारा विस्तारित किया जा सकता है eval

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


आपको इको और कमांड प्रतिस्थापन की आवश्यकता नहीं है (जिसमें $ IFS पर निर्भरता भी है)। आप कर सकते हैंeval xargs -I_ cat _/'{11..15}'/{8..5}.jpg
स्टीफन चेज़लस

वह भी काम करता है, लेकिन यह सबरेल प्रक्रिया को इधर-उधर लाठी से तब तक बनाता है जब तक कि xargs प्रक्रिया समाप्त नहीं हो जाती; eval इको वर्जन बनाता है कि xargs भी शुरू होने से पहले सबशेल चले जाएं। यह शायद केवल उन लोगों के लिए महत्वपूर्ण है जो मेरे बारे में गुदा के रूप में हैं, जो कि पेड़ के विचारों और सेट-एक्स लॉग में
दिखाते हैं
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.