Always eval প্রতিধ্বনি ব্যবহার করা কি সর্বদা নিরাপদ?


20

ব্যবহারটি evalপ্রায়শই নিরুৎসাহিত করা হয় কারণ এটি স্বেচ্ছাসেবী কোড কার্যকর করতে দেয়। তবে, আমরা যদি eval echoএটি ব্যবহার করি তবে দেখে মনে হচ্ছে বাকী স্ট্রিংটি যুক্তি হয়ে উঠবে echoতাই এটি নিরাপদ হওয়া উচিত। আমি কি এই বিষয়ে সঠিক?


1
সর্বদা নিরাপদ নয় আপনি কাঁটাচামলা বা কদর্য আরএম -fR *
μολὼν.λαβέλαβέ

হতে পারে এটি কেবল একটি চিন্তার পরীক্ষা, তবে আপনি যদি এটির মতো একাধিক যুক্তিগুলি পাস করার জন্য এটি করার কথা ভাবছিলেন তবে আপনি এটি -nকেবল একটি অব্যক্ত ভেরিয়েবলের সাথে করতে পারেন echo $argumentsবা যদি $argumentsঅ্যারে হয় তবে echo "${arguments[@]}"। ব্যবহার eval echoযদিও তা অর্থহীন হয় ছিল নিরাপদ।
JoL

উত্তর:


40

Counterexample:

DANGEROUS=">foo"
eval echo $DANGEROUS

স্বেচ্ছাসেবী যুক্তিগুলি echo"foo" নামে একটি ফাইল তৈরি করার চেয়ে আরও খারাপ কিছু করতে পারত could


6
এছাড়াও: DANGEROUS="hello;ls", স্থানে অবাধ কমান্ডের জন্য ls
কুসালানন্দ

2
এছাড়াও: DANGEROUS='$(ls)'(আরও পালানোর প্রয়োজন হতে পারে)।
wizzwizz4

চান eval echo '"'"$DANGEROUS"'"'কাজ করে? এটি goo.gl/L2pPQP-
ইসমাইল মিগুয়েল

@ ইসমাইল মিগুয়েল এটি উইজউইজ, সাইকার বা সোরন্তর উদাহরণগুলির জন্য বা স্ট্রিংয়ের (যেমন DANGEROUS='">foo"') ডাবল-কোট সহ যে কোনও কিছুর জন্য কাজ করে না ।
গর্ডন ডেভিসন

অভিশাপ। যদিও আমি এমন কিছু খুঁজে পেয়েছি যা কিছুটা সহায়তা করেছিল
ইসমাইল মিগুয়েল

26

@ কেলাডা একটি দুর্দান্ত উত্তর সরবরাহ করেছে। প্রদর্শন evalকরা সত্যই দুষ্ট, এখানে "foo" নামে একটি ফাইল তৈরি করার চেয়ে আরও নিকৃষ্ট কিছু রয়েছে :

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

এবং অবশ্যই "foo" নামক একটি ফাইল তৈরির চেয়ে আরও নিকৃষ্ট কিছু থেকে আরও খারাপ কিছু হতে পারে


8
ভেরিয়েবলটিকে উদ্ধৃত করার "$THIS"পরিবর্তে কেবল এটির মতো রাখার $THISজন্যও +1 সাহায্য করে না!
সেলেদা

অ্যাডিশনাল জোড়া উদ্ধৃতি প্রেরণ সাহায্যকারী বলে মনে হচ্ছে। কিছু একটা eval echo '"'"$DANGEROUS"'"'। এটি goo.gl/L2pPQP
ইসমাইল মিগুয়েল

প্রকৃতপক্ষে, আপনার উদাহরণটি এর চেয়ে নিখুঁত নয় >foo, কারণ "'foo' নামে একটি ফাইল তৈরি করা" অগত্যা যা >fooকিছু হয় তা নয় । আপনার উদাহরণের মধ্যে আসল পার্থক্যটি হ'ল এটি কোনও খালি ফাইল পিছনে ফেলে না। বিষয়বস্তু এখনও গেছে।
flarn2006

12

না, এটা হয় না সবসময় নিরাপদ। একটি eval যে কোনও কমান্ড কার্যকর করতে পারে।

একটি নিরাপদ কমান্ড, এর মতো (তারিখটি একক উদ্ধৃতিতে যেমন কার্যকর হয় না):

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

ইওল দিয়ে ব্যবহার করা বিপজ্জনক হয়ে ওঠে:

$ 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নিরাপদ কারণ এর আর্গুমেন্টগুলি সমস্ত স্থির স্ট্রিং যার কোনও প্যারামিটার বিস্তৃতি থাকে না।


আপনার এখানে প্রতিধ্বনি এবং কমান্ড প্রতিস্থাপনের দরকার নেই (এটিরও $ আইএফএসের উপর নির্ভরশীলতা রয়েছে)। আপনি করতে পারেনeval xargs -I_ cat _/'{11..15}'/{8..5}.jpg
স্টাফেন চ্যাজেলাস

এটি খুব কার্যকর হয়, তবে এটি xargs প্রক্রিয়াটি সমাপ্ত না হওয়া অবধি চারদিকে ইওল স্টিক দ্বারা সাবস্কেল প্রক্রিয়া তৈরি করে; ইভাল প্রতিধ্বনি সংস্করণটি জার্গেজ এমনকি শুরু হওয়ার আগে সাবশেলটি চলে যাবে। এটি কেবলমাত্র অন্যদের জন্যই গুরুত্বপূর্ণ যারা আমার মত পোষাকের সম্পর্কে হটোপ ট্রি ভিউ এবং সেট-এক্স লগগুলিতে কী দেখায় সে সম্পর্কে :-)
ফ্লাবডব্লেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.