لماذا يشكو Perl Backticks "SH: Line 1: أي أمر غير موجود"؟
سؤال
لم أكن مبرمجا من قبل، ولكنها حاجة لكتابة 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.
على الأرجح، إنه شيء في متغير الاستعلام $ الذي يكسر سلسلة الأوامر. هل يمكن أن تعطينا مثالا فيه فاشل وإعطاء الخطأ؟ أو إظهار أكثر قليلا من البرنامج النصي الخاص بك؟