gpt4 book ai didi

php - 如何用引号转义 php exec() 命令

转载 作者:可可西里 更新时间:2023-11-01 00:53:50 25 4
gpt4 key购买 nike

我在 Linux 上使用 Exiv2 命令行工具来编辑图像元数据,如下所示:

exiv2 -M"set Iptc.Application2.Caption String This is my caption....." modify IMG.jpg

我想使用用户提供的标题从 PHP 执行此操作。如果用户不输入特殊字符,这将起作用:

exec('/usr/local/bin/exiv2 -M"set Iptc.Application2.Caption String '.$caption.'" modify IMG.jpg');

我需要允许用户使用特殊字符,例如单引号和双引号。我想使用 escapeshellcmd() 来防止恶意数据。我怎样才能正确地转义命令和参数以使其工作?我尝试了很多选项,但我无法正确选择。

最佳答案

是的,这是一个难题,因为该命令使用了非标准的 shell 参数(就像它自己的小元语言一样)。 ImageMagick 也有同样的问题。

如果您只是在双引号字符串中使用 escapeshellarg(),它将变得无用。 escapeshellcmd() 会转义所有特殊字符,并且在双引号字符串中使用是安全的。因此,您需要在其周围硬编码单引号以使其正常工作。

exec('/usr/local/bin/exiv2 -M"set Iptc.Application2.Caption String \'' . escapeshellcmd($caption) . '\'" modify IMG.jpg');

escapeshellarg() 在单引号字符串中不起作用的原因是:

# for this input:
The smith's "; rm -rf *; echo "went to town

# after escapeshellarg()
'The smith\'s "; rm -rf *; echo "went to town'

# Works fine if left as a top-level argument
/usr/bin/command 'The smith\'s "; rm -rf *; echo "went to town'

# BUT if put in a double-quoted string:
/usr/bin/command "subcommand1 'The smith\'s "; rm -rf *; echo "went to town'"

# it is broken into 3 shell commands:
/usr/bin/command "something and 'The smith\'s ";
rm -rf *;
echo "went to town'"

# bad day...

关于php - 如何用引号转义 php exec() 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1255907/

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