Windows上的PHP escapeshellarg百分号

时间:2017-02-24 19:00:28

标签: php windows escaping

在Windows上,escapeshellarg用空格替换所有百分号:

$ php -r "echo escapeshellarg('%');";
" "

其他人也mentioned this on php.net

  

在Windows下,此函数将字符串放入双引号中,而不是   单,并用空格替换%(百分号),这就是它的原因   不可能通过此名称传递名称中包含百分比的文件名   功能

我仍然希望使用escapeshellarg并允许百分号字符。在批处理中,您将使用另一个百分号来转义百分号:

$ echo %%test%%
%test%

显然,你可以通过用唯一的东西替换百分号,然后调用escapeshellarg然后再回复百分号来实现这一点:

<?php
$arg = '%';
$uid = uniqid();
echo str_replace($uid, '%%', escapeshellarg(str_replace('%', $uid, $arg)));
// outputs: "%%"

那么,是否有任何已知的解决方法可以绕过此限制并仍然使用 escapeshellarg

1 个答案:

答案 0 :(得分:0)

此链接对PHPs清理API的缺点有一个很好的解释:https://gist.github.com/Zenexer/40d02da5e07f151adeaeeaa11af9ab36

  

出于各种原因,编写通用shell转义函数是不可能的。

基本上看起来escapeshellarg无论如何都不够安全。

我一直在使用stdin来解决这个问题。这是一个糟糕的解决方法,但它为我完成了工作。