https://forest.watch.impress.co.jp/docs/news/1584317.html
これの話題を聞いてなんか納得しました
cmd の仕様が意味不明すぎるし一貫性がないしで本当に扱いづらいです
なにかの問題に対応すると別のが動かなくなったり
PHP を使ってるときに近いストレスなんですよね
Rust では全てのケースを安全にエスケープできないからエラーにする場合もあるそうですが仕方ないなと思います
そういえばもう 5 年以上前ですが Rust で簡単なツールを作ったとき Windows でコマンド実行するときにかなり苦戦した覚えがあります
Stackoverflow では既知の難しい問題と言われていたり cmd.exe を通すのはやめたほうが良いとか言われてました
Windows は 11 で古いものを切り捨てたり UI 変更したりするなら先にこういうものをどうにかしてほしいんですよね
こういう内部的な問題を放置で上辺だけ綺麗にされても使いたいと思えないです
古いものの互換性は WSL や Sandbox みたいな技術で仮想的に古い Windows を動かすとかすればいいです
それと気になったのは Rust が完全に対応できないものを Node.js や PHP など他の言語ではちゃんと対応できてるのでしょうか
せっかくなので Node.js の発表も見てきました
Node.js も同じような対策みたいです
問題点は spawn 系で { shell: true } のオプションをつけていない場合でも エスケープ不全で任意コードが実行される可能性があるということです
.cmd や .bat ファイルを実行すると発生するので これらを実行しようとすると EINVAL エラーが出るように変更したようです
破壊的変更みたいですが --security-revert オプションでもとに戻すこともできるようです
.cmd や .bat を実行する場合は 自分でサニタイズして { shell: true } にして使えば良いらしいです
基本は禁止で使うならエスケープとかはユーザーに任せるようです