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
提示。