Si vous travaillez dans un environnement sensible à la sécurité, veuillez le lire attentivement.
Veuillez ne jamais faire confiance à une propriété obtenue via le System#getProperty(String)
sous - programme! En fait, presque toutes les propriétés, y compris os.arch
, os.name
et os.version
ne sont pas en lecture seule comme on pourrait s'y attendre - au lieu de cela, elles sont en fait tout à fait le contraire.
Tout d'abord, tout code disposant d'une autorisation suffisante pour invoquer le System#setProperty(String, String)
sous - programme peut modifier le littéral renvoyé à volonté. Cependant, ce n'est pas nécessairement le problème principal ici, car il peut être résolu en utilisant un soi-disant SecurityManager
, comme décrit plus en détail ici .
Le problème réel est que tout utilisateur peut modifier ces propriétés lors de l'exécution de la JAR
question. Cela signifie qu'il n'y a aucun moyen de déterminer si ces propriétés sont effectivement exactes. Pour cette raison, voici quelques vérifications supplémentaires pour essayer d'éviter toute falsification:
// 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;
}
Une autre bonne idée est de vérifier la présence de répertoires spécifiques au système d'exploitation. Quelle que soit l'approche que vous puissiez adopter, n'oubliez pas que le langage Java est en retrait pour être la plateforme multiplateforme. Alors, pourquoi n'essayez-vous pas de faire de même?
Windows 10
et pourtantos.name
me donneWindows 8.1
. Pourquoi donc? D'où cela vient-il?