Re: safe_shell_exec extension for consideration
| From: | Stig Bakken | Date: | Tue, 25 May 2010 23:29:50 +0000 |
| Subject: | Re: safe_shell_exec extension for consideration | ||
| References: | 1 2 3 4 | Groups: | php.pecl.dev |
| Request: | Send a blank email to pecl-dev+get-7247@lists.php.net to get a copy of this message | ||
On Wed, May 26, 2010 at 12:48 AM, Dave McMurtrie <dave64@andrew.cmu.edu>wrote:
> Stig Bakken wrote:
>
>> Hi Dave,
>>
>> In general, I think calling functions or settings "safe"-anything gives
>> users false fuzzies, and should be avoided.
>>
>
> I'm not concerned with what it's named. I really just want the
> functionality to exist. If you wanted to steal from perl, name it system()
> and I'd be just as happy.
Hehe, alright. I just have a thing about choosing descriptive names that do
not promise too much or little :-)
> Wouldn't it make more sense to simply extend the existing shell_exec()
>> function in PHP's standard extension to also accept an array parameter?
>>
>
> It's most important to me that I have a way to invoke an external program
> without involving a shell. The string vs. array issue is secondary and only
> came up after my first iteration of code was already complete and I began to
> use it.
>
> With that in mind, how would you propose that the shell_exec() extension
> work? If a string is passed, still invoke a shell to avoid breaking all the
> code that's already out there, but avoid the shell if an array is passed? I
> also considered extending the bypass_shell option to proc_open() to work on
> unix, but that thought took me back to the same -- I'd have to add my
> tokenizing routine back in and a bunch of existing code that already uses
> proc_open() would break.
>
> I'm willing to entertain all suggestions and I'll put some amount of effort
> into providing code to implement whatever the best solution may be.
>
Great :-)
Actually, system() and/or proc_open() would be better PHP functions to
mimic/overload, since there would be no shell involved here.
I think it makes sense for you to write this code as an extension (to make
it available for everyone), but at the same make a patch for PHP's built-in
function(s). Using an array parameter is definitely the most intuitive
approach IMHO.
The code would be a bunch of parameter conversions (to turn the string array
into va_arg()), a fork() and execv() call, some file descriptor fiddling to
create a php stream from the forked process's standard output, and a
waitpid() call collecting exit status.
Good luck :-)
- Stig