Si está trabajando en un entorno sensible a la seguridad, lea esto detenidamente.
¡Abstenerse de confiar en una propiedad obtenida a través de la System#getProperty(String)
subrutina! En realidad, casi todas las propiedades os.arch
, incluidos os.name
, yos.version
no son de solo lectura como cabría esperar; en cambio, en realidad son todo lo contrario.
En primer lugar, cualquier código con permiso suficiente para invocar la System#setProperty(String, String)
subrutina puede modificar el literal devuelto a voluntad. Sin embargo, ese no es necesariamente el problema principal aquí, ya que se puede resolver mediante el uso de un llamado SecurityManager
, como se describe en mayor detalle aquí .
El problema real es que cualquier usuario puede editar estas propiedades cuando ejecuta el JAR
en cuestión. Esto significa que no hay forma de determinar si estas propiedades son realmente precisas. Debido a esto, aquí hay algunas comprobaciones adicionales para tratar de evitar la manipulación:
// The first thing we're able to do is to query the filesystem.
switch (java.io.File.separator)
{
case "/":
// Windows is a potential candidate.
break;
case "\\":
// And here it could really be anything else.
break;
default:
// There's probably something really wrong here by now.
break;
}
Otra buena idea es verificar la presencia de directorios específicos del sistema operativo. Cualquiera que sea el enfoque que tome, recuerde que el lenguaje Java está diseñado para ser la plataforma cruzada. Entonces, ¿por qué no intentas hacer lo mismo?
Windows 10
y aúnos.name
me daWindows 8.1
. ¿Porqué es eso? ¿De dónde viene esto?