قم بتنفيذ أمر خارجي عن طريق تمرير صفيف ، مع مسافات في أسماء الملفات

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

سؤال

لديّ برنامج نصي 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'), ...);

شيء من هذا القبيل - مع كل من الأمر ثم مجموعة من الحجج لذلك.

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