Jeśli pracujesz w środowisku wrażliwym na bezpieczeństwo, przeczytaj to.
Proszę, nigdy nie ufajcie nieruchomości uzyskanej za pomocą System#getProperty(String)
podprogramu! W rzeczywistości prawie każda właściwość, w tym os.arch
, os.name
i, os.version
nie jest tylko do odczytu, jak można się spodziewać - zamiast tego są wręcz przeciwnie.
Przede wszystkim każdy kod z wystarczającą zgodą na wywołanie System#setProperty(String, String)
podprogramu może dowolnie modyfikować zwracany literał. Jednak nie jest to koniecznie główny problem, ponieważ można go rozwiązać za pomocą tak zwanego SecurityManager
, jak opisano bardziej szczegółowo tutaj .
Rzeczywistym problemem jest to, że każdy użytkownik może edytować te właściwości podczas uruchamiania danego JAR
pytania. Oznacza to, że nie ma sposobu, aby ustalić, czy te właściwości są rzeczywiście dokładne. Z tego powodu oto kilka dodatkowych sprawdzeń, aby uniknąć manipulacji:
// 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;
}
Innym dobrym pomysłem jest sprawdzenie obecności katalogów specyficznych dla systemu operacyjnego. Niezależnie od tego, jakie podejmiesz podejście, pamiętaj, że język Java jest przeznaczony dla wielu platform. Dlaczego więc nie spróbujesz zrobić tego samego?
Windows 10
a jednakos.name
daje miWindows 8.1
. Dlaczego? Skąd to się bierze?