安全地替换PHP源代码中的函数调用


Safely replacing a function call in PHP source code

如何在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。