如何在PHP源代码中用realpath_fixed
调用替换所有realpath
调用(安全而不破坏它)?
我最终得到了'#realpath('s*)'((.+)')#'
,但我不知道这是否一直有效。
EDIT:我无法编辑源代码(deps不在我的控制范围内),这应该在构建PHAR档案时在PHP脚本中完成。
<?php
foreach (glob(__DIR__.'/test/*.php') as $pathname) {
$contents = preg_replace(
'#realpath('s*)'((.+)')#',
'realpath_fixed$1($2)',
file_get_contents($pathname)
);
}
在将所有源文件打包到phar档案中之前,这应该在PHP脚本中完成。
那你就做错了。如果出于任何原因需要替换某些方法,则应将它们封装在自己的实现中,即在所有源中使用myrealpath()
而不是realpath()
。当您即将发布并需要realpath
以不同的方式工作时,只需交换一个实现myrealpath()
的文件并将其phar即可
编辑
当然,但我不能在第三方代码中替换realpath。
这稍微改变了一些。若您控制脚本运行的环境,那个么您可以考虑使用提供rename_function()或runkit及其runkit_function_redefine()的APD扩展。
如果没有,那么我会检查第三方库中有多少realpath()
。如果不是那么多,而且它们不会经常更改,那么我可能会制作这些libs的修补版本,转而使用我的myrealpath()
。我仍然认为这比全球自动源搜索/替换更安全。
编辑2
https://bugs.php.net/bug.php?id=52769
所以这都是关于法尔的。也许您应该考虑简单地放弃phar,将代码作为常规的composer包分发?Composer可以处理许多类型的存储库(即zip文件),因此如果代码是专有的,则不必将其推送给packagegist。