他の場所で提案されているように、これは通常、やりたいことではありません。通常は、File.createTempFile() などの安全な方法を使用して一時ファイルを作成することをお勧めします。
ホワイトリストでこれを行うべきではなく、「良い」文字のみを保持してください。ファイルが中国語のみで構成されている場合は、すべてを削除します。このため、ホワイトリストを使用することはできません。ブラックリストを使用する必要があります。
Linux では、本当に面倒なことは何でも許されます。Linux を Windows を制限するのと同じリストに制限するだけで、将来の頭痛の種を避けることができます。
Windows でこの C# スニペットを使用して、Windows で無効な文字のリストを作成しました。このリストには、あなたが思っているよりもかなり多くの文字 (41) があるので、独自のリストを作成しようとすることはお勧めしません.
foreach (char c in new string(Path.GetInvalidFileNameChars()))
{
Console.Write((int)c);
Console.Write(",");
}
以下は、ファイル名を「消去」する単純な Java クラスです。
public class FileNameCleaner {
final static int[] illegalChars = {34, 60, 62, 124, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 58, 42, 63, 92, 47};
static {
Arrays.sort(illegalChars);
}
public static String cleanFileName(String badFileName) {
StringBuilder cleanName = new StringBuilder();
for (int i = 0; i < badFileName.length(); i++) {
int c = (int)badFileName.charAt(i);
if (Arrays.binarySearch(illegalChars, c) < 0) {
cleanName.append((char)c);
}
}
return cleanName.toString();
}
}
編集:スティーブンが示唆したように、これらのファイルアクセスが許可したディレクトリ内でのみ発生することも確認する必要があります。
次の回答には、Java でカスタム セキュリティ コンテキストを確立し、その「サンドボックス」でコードを実行するためのサンプル コードがあります。
安全な JEXL (スクリプト) サンドボックスを作成するにはどうすればよいですか?