সমস্যাটি এমন ক্ষেত্রে হয় যেখানে সামগ্রীর সামগ্রীটি $x
স্যানিটাইজ করা হয়নি এবং এমন ডেটা রয়েছে যা সম্ভাব্যভাবে আক্রমণকারীর নিয়ন্ত্রণে থাকতে পারে ক্ষেত্রে শেল কোডটি কোনও বিশেষাধিকার বর্ধনের প্রসঙ্গে ব্যবহার করা যেতে পারে (উদাহরণস্বরূপ সেটআপের দ্বারা লিখিত স্ক্রিপ্ট) অ্যাপ্লিকেশন, একটি sudoers স্ক্রিপ্ট বা অফ-দ্য নেটওয়ার্ক ডেটা (সিজিআই, ডিএইচসিপি হুক ...) প্রত্যক্ষ বা অপ্রত্যক্ষভাবে প্রক্রিয়া করতে ব্যবহৃত হয়)।
এমন:
x='(PATH=2)'
তারপর:
x=$((1-$x)))
সেট PATH
করার পার্শ্ব প্রতিক্রিয়া রয়েছে 2
(একটি আপেক্ষিক পথ যা খুব ভাল আক্রমণকারীটির নিয়ন্ত্রণে থাকতে পারে)। আপনি বা এর PATH
সাথে প্রতিস্থাপন করতে পারেন ... ব্যাশ, জেডএস বা কেএসএর ক্ষেত্রেও একই ঘটনা ঘটে (ড্যাশ বা যশ নয় যা কেবলমাত্র ভেরিয়েবলগুলিতে সংখ্যার ধ্রুবক গ্রহণ করে)।LD_LIBRARY_PATH
IFS
x=$((1-x))
মনে রাখবেন যে:
x=$((1-$x))
$x
(POSIX অনুযায়ী optionচ্ছিক) --
(হ্রাস) অপারেটর (হ্রাস) অপারেটর বাস্তবায়িত করে এমন কয়েকটি শেলের মধ্যে নেতিবাচক মানের জন্য সঠিকভাবে কাজ করবে না x=-1
, এর অর্থ শেলটিটি মূল্যায়ন করতে বলার অর্থ1--1
পাটিগণিতের এক্সপ্রেশন । "$((1-x))"
যেমন সমস্যা নেই x
এর (আগে নয়) গাণিতিক মূল্যায়ন অংশ হিসেবে সম্প্রসারিত করা হয়।
ইন bash
, zsh
এবং ksh
(নয় dash
বা yash
), যদি x
হয়:
x='a[0$(uname>&2)]'
তারপরে প্রসারণ $((1-$x))
বা $((1-x))
সেই uname
আদেশটি কার্যকর করার কারণ ঘটায় (জন্য zsh
,a
একটি অ্যারের পরিবর্তনশীল করা প্রয়োজন, কিন্তু এক ব্যবহার করতে পারেন psvar
যে জন্য উদাহরণস্বরূপ)।
সংক্ষেপে বলা যায়, এক uninitialised না ব্যবহার করা উচিত বা শাঁস মধ্যে গাণিতিক এক্সপ্রেশন বাইরের তথ্য (দয়া করে মনে রাখবেন গাণিতিক মূল্যায়ন দ্বারা করা সম্ভব অ sanitized $((...))
(ওরফে $[...]
মধ্যে bash
বা zsh
) কিন্তু এছাড়াও শেল উপর নির্ভর করে let
, [
/ test
, declare/typeset/export...
, return
, break
, continue
, exit
, printf
, print
বিল্টিনস, অ্যারে সূচক ((..))
এবং [[...]]
কয়েকটি নাম নির্ধারণ করে)।
কোনও ভেরিয়েবলটিতে আক্ষরিক দশমিক পূর্ণসংখ্যার সংখ্যা রয়েছে তা যাচাই করতে আপনি POSIXly ব্যবহার করতে পারেন:
case $var in
("" | - | *[!0123456789-]* | ?*-*) echo >&2 not a valid number; exit 1;;
esac
সাবধান হন যে [0-9]
কোনও কোনও লোকেলগুলিতে 0123456789 এর বেশি মিল রয়েছে [[:digit:]]
OK ঠিক আছে তবে আমি এটিতে বাজি ধরব না।
এছাড়াও মনে রাখবেন যে শীর্ষস্থানীয় শূন্যগুলির সাথে সংখ্যাগুলি কিছু প্রসঙ্গে ( 010
কখনও কখনও 10, কখনও কখনও 8) অষ্টাল হিসাবে বিবেচিত হয় এবং সাবধান হন যে উপরের চেকটি আপনার সিস্টেম দ্বারা সমর্থিত সর্বাধিক পূর্ণসংখ্যার চেয়ে সম্ভাব্য বৃহত্তর সংখ্যার মাধ্যমে প্রবাহিত হবে (অথবা আপনি যা যা আবেদন করবেন) সেই পূর্ণসংখ্যাটি এতে ব্যবহার করুন; উদাহরণস্বরূপ বাশ 18446744073709551616 কে 2 64 হিসাবে বিবেচনা করে )। সুতরাং আপনি এই ক্ষেত্রে বিবৃতিতে অতিরিক্ত চেক যুক্ত করতে চাইবেন:
(0?* | -0?*)
echo >&2 'Only decimal numbers without leading 0 accepted'; exit 1;;
(-??????????* | [!-]?????????*)
echo >&2 'Only numbers from -999999999 to 999999999 supported'; exit 1;;
উদাহরণ:
$ export 'x=psvar[0$(uname>&2)]'
$ ksh93 -c 'echo "$((x))"'
Linux
ksh93: psvar: parameter not set
$ ksh93 -c '[ x -lt 2 ]'
Linux
ksh93: [: psvar: parameter not set
$ bash -c 'echo "$((x))"'
Linux
0
$ bash -c '[[ $x -lt 2 ]]'
Linux
$ bash -c 'typeset -i a; export a="$x"'
Linux
$ bash -c 'typeset -a a=([x]=1)'
Linux
$ bash -c '[ -v "$x" ]'
Linux
$ mksh -c '[[ $x -lt 2 ]]'
Linux
$ zsh -c 'echo "$((x))"'
Linux
0
$ zsh -c 'printf %d $x'
Linux
0
$ zsh -c 'integer x'
Linux
$ zsh -c 'exit $x'
Linux
এখানে আরও পড়ুন:
x='P=3'; : $(($x + 5))
সেট হবেP
8, কিন্তুx='P=3'; : $((x + 5))
সেট হবেP
থেকে3
(ইনzsh
,ksh
বাbash
)। "একই সাথে ঘটে$((x + 1))
..." এখন সঠিক নয়; এটি পুরানো হিসাবে সেটPATH
করা হবে2
।