Wenn Sie in einer sicherheitsrelevanten Umgebung arbeiten, lesen Sie dies bitte durch.
Bitte vertrauen Sie niemals einer Eigenschaft, die Sie über das System#getProperty(String)
Unterprogramm erhalten haben! Eigentlich fast jedes Eigentum , einschließlich os.arch
, os.name
und os.version
ist nicht nur lesbar , wie Sie vielleicht erwarten würde - stattdessen sind sie eigentlich ganz im Gegenteil.
Zunächst kann jeder Code mit ausreichender Berechtigung zum Aufrufen der System#setProperty(String, String)
Unterroutine das zurückgegebene Literal nach Belieben ändern. Dies ist hier jedoch nicht unbedingt das Hauptproblem, da es durch die Verwendung eines so genannten Problems gelöst werden kann SecurityManager
, wie hier ausführlicher beschrieben .
Das eigentliche Problem ist, dass jeder Benutzer diese Eigenschaften bearbeiten kann, wenn er die JAR
betreffende Funktion ausführt. Dies bedeutet, dass es keine Möglichkeit gibt , festzustellen, ob diese Eigenschaften tatsächlich korrekt sind. Aus diesem Grund finden Sie hier einige zusätzliche Überprüfungen, um Manipulationen zu vermeiden:
// 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;
}
Eine weitere gute Idee ist es, das Vorhandensein betriebssystemspezifischer Verzeichnisse zu überprüfen. Denken Sie bei jedem Ansatz daran, dass die Java- Sprache als plattformübergreifende Einheit eingerückt ist. Warum versuchst du nicht das Gleiche zu tun?
Windows 10
undos.name
gebe mir dochWindows 8.1
. Warum ist das so? Woher kommt das?