2009-08-18 4 views
4

jvmが動作しているオペレーティングシステムの種類を取得する方法を知りたいと思います。それは "安全"でなければならないので、System.getProperty("os.name")は本当にオプションではありません。なぜなら、-Dディレクティブで簡単に回避することができるからです。java( "os.name"ではなく)のオペレーティングシステムの名前

「安全」とは、邪魔にならないことを意味します。これはデスクトップアプリケーション向けです。ユーザーはいつでもコードを解読、逆コンパイル、編集、再コンパイルすることができますが、-Dをjvmに渡すよりもはるかに難しくなります。我々は、(これはできないので)不可解ではなく、不可解なことをしたい。

+7

"安全" を定義します。あなたは誰から身を守りたいのですか?あなたのアプリケーションを起動し、実行中のコンピュータを制御している人なら、おそらく運が悪いです。 AS/400のパーティションでLinux上で実行されている仮想マシンでWindows上で実行されているJVMはどうですか?その報告は何をすべきか? –

+0

安全とは、邪魔にならないことを意味します。これはデスクトップアプリケーション向けです。ユーザーはいつでもコードを解読、逆コンパイル、編集、再コンパイルすることができますが、-Dをjvmに渡すよりもはるかに難しくなります。我々は、(これはできないので)不可解ではなく、不可解なことをしたい。 –

+0

私はあなたが解決しようとしている問題はわかりませんが、os.nameに頼っているのは間違った解決策である可能性が高いことを保証できます。このプロパティを使って解決しようとしている実際の問題を再投稿してみませんか? – Kevin

答えて

15

まず、実行時環境によってコードが任意に操作されるのを防ぐことは不可能です。しかし、少なくともあなたの小切手を欺くのは難しいですが、最善の策はおそらくOS fingerprintingに基づくファイルシステムのようなものでしょう。

File.listRoots()が出発点です。 Unixライクなシステムでは、/ etc、/ usrなどの特有のディレクトリを含む単一のルートを返します.Windowsでは、複数の結果が返されますが、AFAIKはOSインストールドライブが必ずしもC: Windowsのバージョンとロケール - 誰もが英語版のVistaを実行していると想定しないように注意してください。

BSDやMacOSだけでなく、WindowsとLinuxの異なるバージョンの認識に多くの労力を費やすことができます。コンパイルされたコードからチェックを外すことは、おそらく大変少なくなります。

-2

なぜ次のものを組み合わせて補間するのではなく、回避するのが難しいのですか?あなただけOsOsFamilyを扱うことができるように

public class OpertingSystemInfo 
{ 
    public static void main(String[] args) 
    { 
     String nameOS = "os.name";   
     String versionOS = "os.version";   
     String architectureOS = "os.arch"; 
    System.out.println("\n The information about OS"); 
     System.out.println("\nName of the OS: " + 
System.getProperty(nameOS)); 
     System.out.println("Version of the OS: " + 
System.getProperty(versionOS)); 
     System.out.println("Architecture of THe OS: " + 
System.getProperty(architectureOS)); 
    } 
} 
+6

'java -Dos.name = foo -Dos.version = foo -Dos.arch = foo OpertingSystemInfo' - そして今? – Bombe

1

アパッチcommons-vfsは、処理の一部を抽象化します。内部的には、System.getProperty(..)を使用して値を取得します。私は、JVMがこれらの値を取得する他の方法については知らない。

誰かがJVMに渡されたプロパティを変更する可能性がある場合は、奇妙なプロパティを変更するよりも大きな問題があります。

セキュリティで保護されていることを詳しく説明できますか。誰から安全ですか?

8

システムプロパティは、オペレーティングシステム情報を取得するために私が知っている唯一の方法です。 OperatingSystemMXBeanでもos.Xシステムプロパティから値を取得します。

誰かがアプリケーションの起動方法を変えることができれば、os.nameが正しい場合よりも大きな問題が発生します。

ただし、アプリケーションの実行中にそのプロパティを設定する悪意のあるコードが心配されている場合は、Java Security Managerを使用してプロパティを安全に保護することができます。

0

上記のプロパティを使用する以外に、VMには公開APIはありません。

私は、Javaが安全であると考えられているので、VMはコマンドラインからこれらの値を上書きしようとする試みをすべて無視することを望んでいましたが、そうではありません。

これらの値を書き込むことを許可しないSecurityManagerを試してみても、私の推測では値は単に空です(VMはそれを変更できないため)。

+0

VMによって行われた設定がSecurityManagerによって妨げられていないことは間違いありません。 –

2

あなたはまたを通じて、環境変数を調べることができます(Windowsの場合)、OSのバージョンを取得するランタイムクラス(execメソッド)「版」のような外部cmdを介して実行または「はuname -a」

0

することができますSystem.getenv()ですが、ユーザーは起動前にこれらを自由に変更できます。アプリケーションを起動するためにコマンドラインの一部として変数を変更するのは簡単ではありません(少なくともWindowsでは)。

8

なぜあなたはこのことについて心配していますか?エンドユーザーがos。*プロパティを混乱させるくらいに愚かであれば、なぜアプリケーションを爆発させないのですか?セキュリティがあなたの第一の目標であるならば、あなたはいくつかのJNIに追加しようとする場合があり

//can be defeated by adding com.apple.eawt.Application to the classpath 
public boolean isMac() { 
    try { 
     Class.forName("com.apple.eawt.Application"); 
     return true; 
    } catch(Exception e) { 
     return false; 
    } 
} 

//can be defeated by creating a cmd.exe in PATH 
public boolean isWin() { 
    try{ 
     Runtime.getRuntime().exec(new String[]{"cmd.exe","/C","dir"}).waitFor(); 
     return true; 
    } catch (Exception e) { 
     return false; 
    } 
} 

public boolean isLinux() { 
    if(isMac()) return false; 
    try{ 
     Runtime.getRuntime().exec( new String[]{"sh","-c","ls"}).waitFor(); 
     return true; 
    } catch (Exception e) { 
     return false; 
    } 
} 
0

あなたの目的のために言われて、これらが十分に機能すること

。 最初に、linuxまたはOS XでDLLを読み込もうとすると、クラッシュするかロードされないかと思います。 第2に、そのDLLからOSのAPIを呼び出すことができるので、Java環境が提供するものに限定されません。

0

私は、JNI/JNAがより良い選択肢であることに同意します。 Native.loadLibrary( "myLib")のようなものを呼び出すだけで、ウィンドウ上ではlinux - myLib.soにmyLib.dllをロードします。それは一番安全な方法です。ただそれだけでは困ることはありません。ライブラリにすべてのos固有のコードを入れ、コンパイルしたバージョンをjarファイルに保存します。

1
あなたは1つのOSや他の上に存在することを期待することができますいくつかの無害なプログラムを実行しようとするには、execを使用することができ

- 「C:\ WINDOWS \システム\のDIR.EXE」のように、Windows用および「/ binに/ lsと」 * nixのために - 彼らが正常に実行されるか、または爆発するかどうかを確認してください。もちろん、あなたがそれをやっていることを誰かが知っていて、それを弱体化しようとしていると、それらの名前の実行可能ファイルを作成することができます。

それはあなたがより安全になるようにしようとしていることを正確には何ですか?誰かが意図的にあなたのアプリの起動を止めて、存在しないコマンドを実行しようとしているために爆発した場合、適切な応答はありません。「足が痛い場合は、足で自分を止めてください。実行しているすべてがOSコマンドを実行しているとすれば、おそらくユーザはあなたのアプリの外部にアクセスすることができるので、OSが嘘をついてセキュリティが脅かされることはありません。

+0

セキュリティ上の懸念は「コピープロテクション」です。アプリケーションが配布されている媒体以外の媒体(usbスティック)上でアプリケーションを実行することは重要ではありません。 –

+1

本当に知りたいことを聞くためにあなたの質問に言い直すことをお勧めします。 –

+1

私は今興味があります。これはおそらくあなたの質問に答えることとは関係ありませんが、OSの理解にはどのような助けがありますか?誰かがUSBを挿入し、プログラムをハードドライブにコピーして実行しようとすると、それらは同じOSの下にあります。あなたがUSB上であなたが期待しているOSをコードしていて、OSごとに違うバージョンを売っているのであれば、誰かがWindows版を購入してLinuxで動くのを防ぐことができると思うが、それは著作権侵害候補者のほんの一部に過ぎない。私は違法コピーをしたいと思うほとんどの人が同じOSのためにそれらを作っていると思う。 – Jay

0

最近のLinuxシステムでは、カーネルのバージョンIDを与える特殊なファイル/proc/versionを、持っています。したがって、そのファイルが存在する場合は適切なパターン(たとえば、Linuxという単語で始まる)と一致すると、Linuxコンピュータで実行している確率が高まります。逆に、パターンが存在しないか、パターンにマッチしない場合は、Linuxで動作していないことを確認できます。

関連する問題