gpt4 book ai didi

php - 安全地使用 PHP exec 函数

转载 作者:可可西里 更新时间:2023-10-31 22:46:46 24 4
gpt4 key购买 nike

我正在编写一个 PHP 脚本,旨在通过 exec() 函数运行可执行文件 (ffmpeg.exe)。问题是我读过使用 exec() 函数可能存在安全风险,应尽可能避免。我一直在研究如何安全地运行 exec() 函数,而我不断遇到的唯一一件事就是使用 escapeshellcmd 或 escapeshellarg 过滤命令字符串。我想知道的是在使用 exec() 函数时是否可以进一步提高安全性,或者是否有 exec() 的安全替代方法。任何帮助将不胜感激。

这是我的代码;

define('FFMPEG_LIBRARY', 'c:\\ffmpeg7\\ffmpeg\\bin\\ffmpeg ');
$transcode_string = FFMPEG_LIBRARY." -i " . $srcFile . " -acodec libmp3lame -ab 64k -ar 22050 -ac 1 -vcodec libx264 -b:v 250k -r 30 -f flv -y " . $destFile;
$transcode_string = escapeshellcmd($transcode_string);
exec($transcode_string);

$srcFile 基本上是用于转码的视频,而 $destFile 是我希望创建的输出文件。

最佳答案

using the exec() function can be a security risk and should be avoided if possible.

这有点笼统 - 使用 exec() 构建安全解决方案是完全可能的。但这确实很难:执行外部程序有很多陷阱,尤其是当您向它们传递外部参数时。

正如您所说,第一步是使用 escapeshellarg() 转义所有内容,以防止注入(inject)其他可能有害的命令。

那么问题是输入错误的值会对被调用的程序造成什么损害。例如,

  • 在 200000 x 200000 像素的大视频上运行 ffmpeg 操作很可能会导致服务器挂起,因为调用试图分配不可能的内存量。因此,您必须清理用户可以输入的大小值,如果它们太大或不是数字则退出。

  • 恶意用户可能会告诉 ffmpeg 使用配置文件并尝试从中创建视频,这可能会导致配置文件被用作输出,因此您需要限制用户可以访问的文件路径范围指定。

等等等等。

此外,您还需要考虑仅通过请求数就可以杀死服务器的可能性。如果我每秒向 PHP 脚本发送 50 个请求,然后调用复杂的 ffmpeg 命令怎么办?服务器可能很容易在负载下崩溃,您可能希望防止这种情况发生。

因此:使用 exec() 没有内在的安全问题,但需要非常仔细地检查传递给它的每个传入参数。

关于php - 安全地使用 PHP exec 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8931286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com