لماذا يشكو Perl Backticks "SH: Line 1: أي أمر غير موجود"؟

StackOverflow https://stackoverflow.com/questions/1851213

  •  13-09-2019
  •  | 
  •  

سؤال

لم أكن مبرمجا من قبل، ولكنها حاجة لكتابة Webapp بسيطة للغاية للعمل.

أحاول الحصول على هذا الاستعلام هذا للعمل:

dig @8.8.8.8 +nocomments +nostats +noquestion +nocmd google.com any

مع هذا القليل من بيرل:

$dig = `/usr/bin/dig \@8.8.8.8 +nocomments +nostats +noquestion +nocmd $query any`;

إلا أنه لا يبدو أنه لا يدرك "أي" في نهاية حفر ويعطيني:

sh: line 1: any: command not found

ما شيء بسيط بغباء أنا بخير؟

هل كانت مفيدة؟

المحلول

أراهن $query لديه جديد في ذلك، مما تسبب في رؤية قذيفة الخاص بك any كأمر جديد.

محاولة القيام chomp $query; قبل استدعاء النظام الخاص بك لإزالة الخط الجديد. المزيد عن chomp..

نصائح أخرى

ربما يجب عليك استخدام dig ... '$query' لذلك هو واحد مقتبس عندما ترى قذيفة ذلك. إذا لم تفعل ذلك، فسوف تفسر القذيفة أي metacharacters. إذا كان شخص ما يضع "; echo my_key > ~/.ssh/authorized_keys" في شكل الويب الخاص بك، ثم أنت ثمل. حتى لو كان ذلك للاستخدام الداخلي فقط، فأنت لا تريد أن تنكسر إذا كان شخص ما يضع شيئا مع مسافات في الاستعلام (والتي ستقوم القذيفة بتقسيم الكلمة وتمريرها لحفر كحجة.)

يمكنك استخدام بيرل

q $ الاستعلام  e
لتوسيع الاستعلام $ مع metacharacter المحتملة من أي وقت مضى. في الواقع، هذا أفضل بكثير من إضافة علامات اقتباس واحدة، إذا كان الاستعلام يحتوي على حرف اقتباس واحد، فسوف يندلع من علامات الاقتباس. لا يزال سهلا للغاية للهجوم. هذه يجب إصلاح ذلك في ذاكرتك.

PERL لديها طرق آمنة لاستخدام وظيفة النظام () لتحديد ARGS كقائمة من السلاسل، وتجنب / bin / sh، بدلا من سلسلة واحدة ليتم تقييمها كأمر قذيفة. هذه هي الطريقة الأكثر أمانا، ولكن لا توجد نسخة من ذلك دون القيام بالأنابيب && fork && exec.

على الأرجح، إنه شيء في متغير الاستعلام $ الذي يكسر سلسلة الأوامر. هل يمكن أن تعطينا مثالا فيه فاشل وإعطاء الخطأ؟ أو إظهار أكثر قليلا من البرنامج النصي الخاص بك؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top