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]
的命令。
答案 0 :(得分:2)
为了爱所有与安全相关的事情为什么你不使用php rename
命令 - 它不会遇到任何shell转义问题。将exec("mv ...")
替换为:
rename($arrSongPaths[0], $escapedSongPath)
...并检查错误。
而不是使用exec(find...)
使用glob php操作页面中的recursive_glob
提示。