قم بتنفيذ أمر خارجي عن طريق تمرير صفيف ، مع مسافات في أسماء الملفات
-
22-09-2019 - |
سؤال
لديّ برنامج نصي PHP يحتاج إلى تنفيذ البرامج التي ستعمل على الملفات التي تحتوي على مسافات في الأسماء. معظم وظائف PHP لتنفيذ الأوامر الخارجية (على سبيل المثال exec()
) خذ وسيطة سلسلة واحدة لتنفيذ سطر الأوامر. ومع ذلك ، عليك أن تفعل أشياء مثل escapeshellarg()
لجعل مدخلاتك آمنة.
هل هناك طريقة لتنفيذ أمر خارجي في PHP مع صفيف. لذا بدلاً من:
exec("ls -l ".escapeshellarg($filename));
أستطيع أن أذهب:
exec(array("ls", "-l", $filename));
هذا يعني أنه لا داعي للقلق بشأن الهروب من الحجج. أريد تجنب استخدام escapeshellarg()
, ، نظرًا لأن الإصدار الذي أستخدمه يحتوي على خطأ يخرج من الأحرف غير ASCII.
جافا لديها هذه الوظيفة http://java.sun.com/j2se/1.4.2/docs/api/java/lang/runtime.html#exec٪28java.lang.String Budap:d29
المحلول
يبدو أن هذا غير ممكن مع وظائف PHP المدمجة.
نصائح أخرى
function myExec ( command, arguments )
{
exec( command + ' ' + implode( ' ', array_map( escapeshellarg, arguments ) ) );
}
إجابة Poke جيدة - ومع ذلك ، كم عدد الأوامر التي يحتاجونها إلى الجري؟ أود أن أفكر في تنفيذ قائمة أساسية من الأوامر والحجج - وبهذه الطريقة ، يمكنك أن تكون متأكدًا من أنها ليست مدخلات ضارة بالحقن. شيء مثل:
$whitelistCommandArray = array('ls' => 'ls', ...);
if (isset($whitelistCommandArray[$userSuppliedCommand]])
{
//ok its a valid command, lets parse the args next
...
}
else echo "Unsupported command";
تحديث/تحرير:
هل القائمة البيضاء من الحجج ممكنة؟ ماذا لو احتاج المرجع إلى تعديل العديد من الملفات؟ - ماتشو
هيه لا أعرف - يمكن أن يكون - يعتمد تماما على احتياجاتك.
$whitelistArray = array('ls' => array('a', 'l', 'h'), ...);
شيء من هذا القبيل - مع كل من الأمر ثم مجموعة من الحجج لذلك.