Php有一个escapeshellcmd()方法,它可以转义字符串中的任何字符,这些字符可能用于诱使shell命令执行任意命令。

<?php
exec(find /music -type f -iname '*mp3'", $arrSongPaths);
echo $arrSongPaths[0] //prints It Won´t Be Long.mp3;
echo escapeshellcmd($arrSongPaths[0]) //prints It Wont Be Long.mp3;
?>

有没有一种方法可以编写一个shell脚本,用特殊的转义字符递归地重命名文件名(特别是*mp3)?
我试着用php做这个
$escapedSongPath = escapeshellarg($arrSongPaths[0]);
exec("mv $arrSongPaths[0] $escapedSongPath");

但那没用。无论如何,最后一行代码是不安全的,因为您正在执行一个具有潜在危险文件名$arrSongPaths[0]的命令。

最佳答案

出于对所有与安全相关的东西的热爱,为什么不使用phprename命令-它不受任何shell转义问题的影响。将exec("mv ...")替换为:

rename($arrSongPaths[0], $escapedSongPath)

... 并检查错误。
而不是使用exec(find...)使用globphp操作页面中的recursive_glob提示。

08-25 06:58