Como se ha sugerido en otros lugares, esto no es lo que generalmente desea hacer. Por lo general, es mejor crear un archivo temporal utilizando un método seguro como File.createTempFile().
No debe hacer esto con una lista blanca y solo mantener "buenos" caracteres. Si el archivo está formado únicamente por caracteres chinos, le quitará todo. No podemos usar una lista blanca por esta razón, tenemos que usar una lista negra.
Linux prácticamente permite todo lo que puede ser un verdadero dolor. Limitaría a Linux a la misma lista que limitas a Windows para que te ahorres dolores de cabeza en el futuro.
Al usar este fragmento de C# en Windows, produje una lista de caracteres que no son válidos en Windows. Hay bastantes más personajes en esta lista de los que puede pensar (41), por lo que no recomendaría tratar de crear su propia lista.
foreach (char c in new string(Path.GetInvalidFileNameChars()))
{
Console.Write((int)c);
Console.Write(",");
}
Aquí hay una clase de Java simple que 'limpia' un nombre de archivo.
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();
}
}
EDIT: Como Stephen sugirió que probablemente también debe verificar que estos archivos sólo accede a ocurrir dentro del directorio que lo permitan.
La siguiente respuesta tiene un código de muestra para establecer un contexto de seguridad personalizado en Java y luego ejecutar el código en esa 'caja de arena'.
How do you create a secure JEXL (scripting) sandbox?
Ben, podría dar algunos ejemplos? – OscarRyz
Agregué el comentario del signo de interrogación a mi pregunta. –