প্রস্তাবনা
প্রথমত, আমি বলব সমস্যাটি সমাধান করার সঠিক উপায় এটি নয়। এটি কিছুটা বলার মতো " আপনারা লোকদের খুন করবেন না কারণ অন্যথায় আপনি কারাগারে যাবেন "।
একইভাবে, আপনি আপনার পরিবর্তনশীলটি উদ্ধৃত করবেন না কারণ অন্যথায় আপনি সুরক্ষা দুর্বলতার পরিচয় দিচ্ছেন। আপনি আপনার ভেরিয়েবলগুলি উদ্ধৃত করেছেন কারণ এটি ভুল নয় (তবে জেলের ভয় যদি সহায়তা করতে পারে তবে কেন নয়)।
যারা কেবল ট্রেনে ঝাঁপিয়েছেন তাদের জন্য একটি সামান্য সংক্ষিপ্তসার।
সবচেয়ে শাঁস, একটি পরিবর্তনশীল সম্প্রসারণ unquoted (যদিও যে (এবং এই উত্তরটি বাকি) ও প্রতিকল্পন (কমান্ড প্রযোজ্য যাব `...`
বা $(...)
) এবং গাণিতিক সম্প্রসারণ ( $((...))
বা $[...]
)) একটি খুব বিশেষ অর্থ আছে। এটা ব্যাখ্যা করার সবচেয়ে ভালো উপায় এটি অন্তর্নিহিত কিছু বাছাই invoking মত হল যে বিভক্ত + + উল্লিখিত glob operator¹।
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
/ python
সিজিআই স্ক্রিপ্টে সেই কমান্ড লাইনটি ব্যাখ্যা করার জন্য একটি শেলটি আহ্বান করা হয় না ( cmd
নিজে নিজে শেল স্ক্রিপ্ট হতে পারে এবং এর লেখক কখনই এটি সিজিআই থেকে কল করার আশা করেনি)।
সুযোগ-সুবিধা বৃদ্ধির জন্য যখন কোনও পথ রয়েছে তখন আপনি একটি দুর্বলতা পেয়েছেন, এমন সময় যখন কেউ ( যাকে তাকে আক্রমণকারী বলে ডাকি ) এমন কিছু করতে সক্ষম হয় যা তার উদ্দেশ্য নয়।
অবিচ্ছিন্নভাবে এর অর্থ হ'ল আক্রমণকারী ডেটা সরবরাহ করে, সেই ডেটাটি কোনও বিশেষাধিকারপ্রাপ্ত ব্যবহারকারী / প্রক্রিয়া দ্বারা প্রসেস করা হচ্ছে যা অজান্তেই কিছু করা উচিত নয় এমন কাজ করে, বেশিরভাগ ক্ষেত্রে বাগের কারণে of
মূলত, যখন আপনার বগি কোড আক্রমণকারীটির নিয়ন্ত্রণে ডেটা প্রক্রিয়া করে তখন আপনি একটি সমস্যা পেয়েছেন ।
এখন, এটি সর্বদা সুস্পষ্ট নয় যে কোথা থেকে সেই ডেটা আসতে পারে এবং আপনার কোডটি কখনই অবিশ্বস্ত ডেটা প্রক্রিয়া করতে পারে তা বলা প্রায়শই শক্ত।
ভেরিয়েবলের হিসাবে, কোনও সিজিআই স্ক্রিপ্টের ক্ষেত্রে এটি স্পষ্টতই স্পষ্টভাবে উপাত্ত হ'ল সিজিআই জিইটি / পোষ্ট প্যারামিটার এবং কুকিজ, পথ, হোস্ট ... প্যারামিটারের মতো জিনিস।
একটি সেটুইড স্ক্রিপ্টের জন্য (অন্যের দ্বারা আহ্বান করার সময় এক ব্যবহারকারী হিসাবে চলমান), এটি আর্গুমেন্ট বা পরিবেশের ভেরিয়েবল।
আরেকটি খুব সাধারণ ভেক্টর ফাইলের নাম। আপনি যদি কোনও ডিরেক্টরি থেকে একটি ফাইলের তালিকা পেয়ে থাকেন তবে আক্রমণকারী দ্বারা ফাইলগুলি সেখানে স্থাপন করা সম্ভব ।
সে ক্ষেত্রে, এমনকি কোনও ইন্টারেক্টিভ শেলের প্রম্পটেও আপনি দুর্বল হয়ে পড়তে পারেন (ফাইলগুলিতে /tmp
বা ~/tmp
উদাহরণস্বরূপ প্রক্রিয়া করার সময় )।
তাও আবার একটা ~/.bashrc
প্রবন হতে পারে (উদাহরণস্বরূপ, bash
যখন উপর প্রার্থনা তার ব্যাখ্যা হবে ssh
একটি চালানোর জন্য ForcedCommand
মত git
ক্লায়েন্ট নিয়ন্ত্রণে কিছু ভেরিয়েবল দিয়ে সার্ভারে নিয়োজনগুলি)।
অবিশ্বস্ত ডেটা প্রক্রিয়াকরণের জন্য এখন কোনও স্ক্রিপ্ট সরাসরি কল করা নাও যেতে পারে, তবে এটি অন্য কোনও আদেশ দ্বারা ডাকা হতে পারে। অথবা আপনার ভুল কোডটি এমন স্ক্রিপ্টগুলিতে অনুলিপি-পেস্ট করা যেতে পারে (আপনি লাইন থেকে 3 বছর বা আপনার কোনও সহকর্মীর দ্বারা)। একটি জায়গা যেখানে এটি বিশেষভাবে সমালোচনা প্রশ্নোত্তর সাইটগুলিতে উত্তর রয়েছে কারণ আপনি কখনই জানেন না যে আপনার কোডের অনুলিপিগুলি কোথায় শেষ হতে পারে।
ব্যবসায় নিচে; এটা কতটুকু খারাপ?
একটি পরিবর্তনশীল (বা কমান্ড প্রতিস্থাপন) অব্যক্ত রেখে যাওয়া শেল কোডের সাথে সম্পর্কিত সুরক্ষা দুর্বলতার এক নম্বর উত্স। আংশিকরূপে কারণ এই বাগগুলি প্রায়শই দুর্বলতায় অনুবাদ করে তবে অব্যবহৃত ভেরিয়েবলগুলি দেখতে এটি সাধারণ common
প্রকৃতপক্ষে, শেল কোডে দুর্বলতার সন্ধান করার সময়, প্রথমে করণীয় হ'ল অব্যক্ত ভেরিয়েবলগুলি সন্ধান করা। এটি সহজেই স্পট করা যায়, প্রায়শই একজন ভাল প্রার্থী, সাধারণত আক্রমণকারী-নিয়ন্ত্রিত ডেটাতে ট্র্যাক করা সহজ।
অসমর্থিত পরিবর্তনশীলগুলি দুর্বলতায় রূপান্তরিত করতে পারে এমন অসংখ্য উপায় রয়েছে। আমি এখানে কয়েকটি সাধারণ ট্রেন্ড দেব।
তথ্য প্রকাশ
বিভক্ত অংশের কারণে বেশিরভাগ লোকই উদ্ধত ভেরিয়েবলগুলির সাথে যুক্ত বাগগুলিতে ঝাঁপিয়ে পড়বে (উদাহরণস্বরূপ, আজকাল ফাইলগুলির নামে তাদের স্পেস থাকতে পারে এবং আইএফএসের ডিফল্ট মানে স্থান হয়)। অনেক লোক গ্লোব অংশটি উপেক্ষা করবে
। উল্লিখিত glob অংশ অন্তত যতটা বিপজ্জনক
বিভক্ত অংশ।
অবাঞ্ছিত বাহ্যিক ইনপুট নিয়ে গ্লোব্বিংয়ের অর্থ আক্রমণকারী আপনাকে যে কোনও ডিরেক্টরিতে লিখিত সামগ্রী পড়তে পারে।
ইন:
echo You entered: $unsanitised_external_input
যদি $unsanitised_external_input
এতে থাকে তবে এর /*
অর্থ আক্রমণকারী এর সামগ্রী দেখতে পাবে /
। কোন ব্যাপারই না. এটা যদিও আরো আকর্ষণীয় হয়ে সঙ্গে /home/*
আপনি মেশিনে ব্যবহারকারী নামের একটি তালিকা দেয়, /tmp/*
, /home/*/.forward
অন্যান্য বিপজ্জনক চর্চা এ নির্দেশ, জন্য /etc/rc*/*
সক্রিয় পরিষেবার জন্য ... কোন প্রয়োজন নেই পৃথকভাবে তাদের নাম। একটি মান /*
/*/* /*/*/*...
শুধুমাত্র পুরো ফাইল সিস্টেমের তালিকাবদ্ধ করবে।
পরিষেবা দুর্বলতা অস্বীকার।
পূর্ববর্তী কেসটি কিছুটা দূরে নিয়ে যাওয়া এবং আমরা একটি ডস পেয়েছি।
প্রকৃতপক্ষে, অচিরাচরিত ইনপুট সহ তালিকার প্রসঙ্গে যে কোনও উদ্বেগের পরিবর্তনশীল হ'ল কমপক্ষে একটি ডস দুর্বলতা।
এমনকি বিশেষজ্ঞ শেল স্ক্রিপ্টারগুলি সাধারণত এই জাতীয় জিনিস উদ্ধৃত করতে ভুলে যায়:
#! /bin/sh -
: ${QUERYSTRING=$1}
:
কোন অপ-কমান্ড। সম্ভাব্য ভুল গুলো কী কী হতে পারতো?
যে দায়িত্ব অর্পণ করা বোঝানো হচ্ছে $1
থেকে $QUERYSTRING
যদি $QUERYSTRING
সেট না করা হয়। কমান্ড লাইন থেকে সিজিআই স্ক্রিপ্টকে কল করতে সক্ষম এটি একটি দ্রুত উপায়।
যে $QUERYSTRING
এখনো যদিও সম্প্রসারিত হয় এবং কারণ এটি উদ্ধৃত না, বিভক্ত + + উল্লিখিত glob অপারেটর প্রার্থনা করা হয়।
এখন, কিছু গ্লোব রয়েছে যেগুলি প্রসারিত করার জন্য বিশেষ ব্যয়বহুল। এর মধ্যে /*/*/*/*
একটি যথেষ্ট খারাপ কারণ এর অর্থ ডিরেক্টরিগুলি 4 টি স্তর পর্যন্ত নীচে তালিকাবদ্ধ করা। ডিস্ক এবং সিপিইউ ক্রিয়াকলাপের পাশাপাশি, এর অর্থ হ'ল কয়েক হাজার ফাইল পাথ (40k এখানে একটি সর্বনিম্ন সার্ভার ভিএম-তে, যার মধ্যে 10k ডিরেক্টরি রয়েছে) সংরক্ষণ করা।
এখন /*/*/*/*/../../../../*/*/*/*
40k x 10k এর অর্থ
/*/*/*/*/../../../../*/*/*/*/../../../../*/*/*/*
হ'ল এমনকি সবচেয়ে শক্তিশালী মেশিনটি তার হাঁটুতে আনতে যথেষ্ট।
এটি নিজের জন্য চেষ্টা করুন (যদিও আপনার মেশিনটি ক্র্যাশ বা ঝুলতে প্রস্তুত):
a='/*/*/*/*/../../../../*/*/*/*/../../../../*/*/*/*' sh -c ': ${a=foo}'
অবশ্যই, কোডটি যদি হয়:
echo $QUERYSTRING > /some/file
তারপরে আপনি ডিস্কটি পূরণ করতে পারেন।
শেল সিজি বা বাশ সিজি বা কেএস সিজি- তে কেবল একটি গুগল অনুসন্ধান করুন এবং আপনি কয়েকটি পৃষ্ঠা খুঁজে পাবেন যা শেলগুলিতে কীভাবে সিজিআই লিখতে হবে তা আপনাকে দেখায়। প্রক্রিয়া পরামিতিগুলির মধ্যে অর্ধেকটি কীভাবে দুর্বল are
এমনকি ডেভিড কর্নের নিজেরও
দুর্বল (কুকি হ্যান্ডলিংয়ের দিকে দেখুন)।
যথেচ্ছ কোড কার্যকরকরণের দুর্বলতা পর্যন্ত
স্বেচ্ছাসেবীর কোড কার্যকর করা দুর্বলতার সবচেয়ে খারাপ ধরণের, যেহেতু আক্রমণকারী যদি কোনও কমান্ড চালাতে পারে, তবে সে কী করতে পারে তার কোনও সীমা নেই।
এটি সাধারণত বিভক্ত অংশ যা তাদের দিকে পরিচালিত করে। এই বিভাজনটি বিভিন্ন আর্গুমেন্টে ফলাফল দেয় যখন কেবলমাত্র একটি প্রত্যাশিত হয় commands যদিও এর মধ্যে প্রথমটি প্রত্যাশিত প্রসঙ্গে ব্যবহৃত হবে, অন্যরা পৃথক প্রসঙ্গে থাকবে তাই সম্ভাব্যভাবে আলাদা ব্যাখ্যা করা হবে। একটি উদাহরণ সঙ্গে ভাল:
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
বেশিরভাগ বাণিজ্যিক ইউনিয়ন এবং কিছু BSD এর অন্তর্ভুক্ত) নামে একটি ফাইল তৈরি করা হয় , যা কার্যকর করে 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
এবং আপনি ..
লেখার যোগ্য করে তোলেন (জিএনইউ দিয়ে পুনরাবৃত্তভাবে
chmod
)।
পাবলিক রাইটিংযোগ্য জায়গাগুলিতে ফাইলগুলির স্বয়ংক্রিয়ভাবে প্রসেসিং করা স্ক্রিপ্টগুলি /tmp
খুব সাবধানতার সাথে লিখতে হবে।
কি সম্পর্কে [ $# -gt 1 ]
এটাই আমার ক্লান্তিকর মনে হচ্ছে। কিছু লোক এই ভেবে সমস্ত সমস্যায় নেমে পড়ে যে কোনও নির্দিষ্ট প্রসারণটি তারা উদ্ধৃতিগুলি বাদ দিতে পারে কিনা তা সিদ্ধান্ত নিতে সমস্যাযুক্ত কিনা।
এটা বলার মতো। আরে, এটা দেখে মনে হচ্ছে $#
বিভক্ত + + উল্লিখিত glob অপারেটর সাপেক্ষে হতে পারে না, এর শেল বিভক্ত করতে + + এটা উল্লিখিত glob জিজ্ঞাসা করা যাক । বা আরে, আসুন ভুল কোডটি লিখি কারণ বাগটি আঘাত হানার সম্ভাবনা নেই ।
এখন এটি কতটা অসম্ভব? ঠিক আছে, $#
(বা $!
, $?
বা কোনও গাণিতিক বিকল্প) কেবলমাত্র অঙ্কগুলি (বা কারও -
জন্য) থাকতে পারে তাই গ্লোব অংশটি বাইরে। জন্য বিভক্ত অংশ যদিও কিছু করতে, সমস্ত আমরা প্রয়োজন হয় $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)
, পাটিগণিত মূল্যায়নের আইএফএসের সেটিংসের পার্শ্ব প্রতিক্রিয়া রয়েছে এবং পরবর্তী [
কমান্ড ব্যর্থ হয় যার অর্থ অনেকগুলি আর্গের জন্য চেককে বাইপাস করা হয়।
যখন স্প্লিট + গ্লোব অপারেটর চালু করা হবে না তখন কী হবে ?
ভেরিয়েবল এবং অন্যান্য বিস্তারের আশেপাশে কোটগুলির প্রয়োজন রয়েছে এমন আরও একটি মামলা রয়েছে: যখন এটি একটি নিদর্শন হিসাবে ব্যবহৃত হয়।
[[ $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
এই নকশা বিশিষ্টতা বেশিরভাগ স্থির করে। ইন zsh
(অন্তত যখন SH / ksh এমুলেশন মোড নেই), যদি আপনি চান বিভাজন , বা globbing , অথবা প্যাটার্ন ম্যাচিং , আপনি এটি স্পষ্টভাবে অনুরোধ করতে আছে: $=var
বিভক্ত করতে, এবং $~var
উল্লিখিত glob অথবা পরিবর্তনশীল বিষয়বস্তুর জন্য যেমন চিকিত্সা করা একটি প্যাটার্ন.
যাইহোক, বিভাজন (তবে গ্লোব্বিং নয়) অব্যক্ত কমান্ড প্রতিস্থাপন (যেমন হিসাবে echo $(cmd)
) উপর স্পষ্টভাবে সম্পন্ন হয় ।
এছাড়াও, পরিবর্তনশীলকে উদ্ধৃত না করার একটি কখনও কখনও অযাচিত পার্শ্ব প্রতিক্রিয়া হ'ল খালি অপসারণ । zsh
আচরণ কি আপনি অন্য শেল মধ্যে (সঙ্গে পুরাপুরি globbing অক্ষম করার মাধ্যমে অর্জন করতে পারেন অনুরূপ set -f
) এবং বিভাজন (সঙ্গে IFS=''
)। এখনও:
cmd $var
কোনও বিভাজন + গ্লোব থাকবে না , তবে যদি $var
খালি থাকে তবে একটি খালি যুক্তি পাওয়ার পরিবর্তে cmd
কোনও যুক্তিই পাবেন না।
এটি ত্রুটিগুলি সৃষ্টি করতে পারে (স্পষ্টর মতো [ -n $var ]
)। এটি সম্ভবত কোনও স্ক্রিপ্টের প্রত্যাশা এবং অনুমানগুলি ভঙ্গ করতে পারে এবং দুর্বলতার কারণ হতে পারে, তবে আমি এখনই খুব বেশি-দূরবর্তী উদাহরণ নিয়ে আসতে পারি না)।
কি যখন আপনি কি করতে প্রয়োজন বিভক্ত + + উল্লিখিত glob অপারেটর?
হ্যাঁ, সাধারণত আপনি যখন আপনার ভেরিয়েবলটি উদ্ধৃত করতে চান না। তবে তারপরে আপনার বিভক্ত হওয়া এবং গ্লোব অপারেটরগুলি সঠিকভাবে ব্যবহার করার আগে আপনি এটি টিউন করতে হবে। আপনি যদি কেবল বিভক্ত অংশটি চান এবং গ্লোব অংশটি (যা বেশিরভাগ সময় কেস হয়) না চান তবে আপনার গ্লোব্বিং ( set -o noglob
/ set -f
) অক্ষম করে ঠিক করতে হবে $IFS
। অন্যথায় আপনি দুর্বলতাও তৈরি করতে পারবেন (যেমন উপরে বর্ণিত ডেভিড কর্নের সিজিআই উদাহরণ)।
উপসংহার
সংক্ষেপে, শেলগুলিতে নিরবচ্ছিন্ন একটি পরিবর্তনশীল (বা কমান্ড প্রতিস্থাপন বা গাণিতিক সম্প্রসারণ) রেখে যাওয়া খুব বিপজ্জনক হতে পারে বিশেষত যখন ভুল প্রসঙ্গে প্রাসঙ্গিক কাজগুলি করা হয়, এবং এটি ভুল বিষয়গুলি কী তা জানা খুব শক্ত।
এটি খারাপ অভ্যাস হিসাবে বিবেচিত হওয়ার অন্যতম কারণ ।
এতক্ষণ পড়ার জন্য ধন্যবাদ। যদি এটি আপনার মাথার উপরে চলে যায় তবে চিন্তা করবেন না। কেউ আশা করতে পারে না যে তারা নিজের কোডটি যেভাবে লিখেছেন তার সমস্ত প্রবন্ধ বোঝে। সে কারণেই আমাদের
ভাল অনুশীলনের সুপারিশ রয়েছে , তাই কেন এটি অগত্যা তা না বুঝে তাদের অনুসরণ করা যেতে পারে।
(এবং এটি এখনও সুস্পষ্ট না হলে, শেলগুলিতে সুরক্ষা সংবেদনশীল কোডটি এড়াতে দয়া করে)।
এবং দয়া করে এই সাইটে আপনার উত্তরগুলিতে আপনার পরিবর্তনগুলি উদ্ধৃত করুন!
And ksh93
এবং pdksh
এবং ডেরিভেটিভগুলিতে, গ্লোববিং অক্ষম না করা ছাড়াও ব্রেস সম্প্রসারণ করা হয় ( বিকল্প অক্ষম ksh93
থাকা সত্ত্বেও, ksh93u + পর্যন্ত সংস্করণগুলির ক্ষেত্রে braceexpand
)।