System.setProperty在java中是否安全?

System.setProperty在java中是否安全?,java,security,Java,Security,在java中,为了在某些类之间传递值,我们可以使用System.setProperty。但是使用System.getProperties()我们可以获得所有系统属性。因此,如果我使用任何第三方API的方式,他们也可以访问我的属性,也可以更改。System.setProperty是否安全?这取决于您所说的安全 将系统属性对象视为只读对象是一种很好的做法,但您不能依赖第三方库来实现这一点 如果您担心“受信任的”第三方代码会看到或更改应用程序的属性,请不要使用系统属性来表示它们。创建自己的属性对象并将

在java中,为了在某些类之间传递值,我们可以使用
System.setProperty
。但是使用
System.getProperties()
我们可以获得所有系统属性。因此,如果我使用任何第三方API的方式,他们也可以访问我的属性,也可以更改。
System.setProperty是否安全?

这取决于您所说的安全

  • 将系统属性对象视为只读对象是一种很好的做法,但您不能依赖第三方库来实现这一点

  • 如果您担心“受信任的”第三方代码会看到或更改应用程序的属性,请不要使用系统属性来表示它们。创建自己的属性对象并将属性放在那里。总体而言,这可能是最简单的方法

  • 如果使用沙箱,可以防止不受信任的代码访问系统属性。。。前提是您的代码不会将系统属性对象泄漏给不受信任的代码。(访问检查在
    系统中实施
    方法…)

  • 属性对象是线程安全的。。。如果你指的是那种安全



  • 1-有时需要以编程方式修改系统属性。但是,这样做最终可能会导致脆弱的应用程序。系统属性通常用于在初始化期间配置JVM服务。如果类初始化的顺序由于某种原因而改变,您可能会发现应用程序代码现在设置属性太晚了。如果可能,最好通过
    -D
    命令行参数设置属性。

    这取决于您所说的安全

  • 将系统属性对象视为只读对象是一种很好的做法,但您不能依赖第三方库来实现这一点

  • 如果您担心“受信任的”第三方代码会看到或更改应用程序的属性,请不要使用系统属性来表示它们。创建自己的属性对象并将属性放在那里。总体而言,这可能是最简单的方法

  • 如果使用沙箱,可以防止不受信任的代码访问系统属性。。。前提是您的代码不会将系统属性对象泄漏给不受信任的代码。(访问检查在
    系统中实施
    方法…)

  • 属性对象是线程安全的。。。如果你指的是那种安全


  • 1-有时需要以编程方式修改系统属性。但是,这样做最终可能会导致脆弱的应用程序。系统属性通常用于在初始化期间配置JVM服务。如果类初始化的顺序由于某种原因而改变,您可能会发现应用程序代码现在设置属性太晚了。如果可能,最好通过
    -D
    命令行参数设置属性。

    根据

    通常,请注意不要覆盖系统属性

    setProperties方法更改的系统属性集 当前正在运行的应用程序。这些变化不是持久的。那个 是,更改应用程序中的系统属性不会 影响将来对此或任何应用程序调用Java解释器 其他应用程序。运行时系统重新初始化系统 每次启动时的属性。如果系统属性发生更改 如果要持久化,则应用程序必须将值写入 在退出之前读取一些文件,并在启动时再次读取它们

    您担心某些第三方库可能会覆盖应用程序正在使用的属性,这是正确的。使用某种命名约定来区分属性文件中定义的键始终是一种良好的做法

    这个问题的一个非常简单的模拟

    public class TestApp {
        public static void main(String args[]) throws InterruptedException {
            TestApp app = new TestApp();
            app.new ThirdPartyLib("thirdParty").start();
            while (true) {
                Thread.currentThread().sleep(500);
                System.setProperty("test", "orignalProperty");
                System.out
                        .format("Thread Name  '%s' setting the property with value '%s' \n ",
                                Thread.currentThread().getName(),
                                System.getProperty("test"));
            }
        }
    
        class ThirdPartyLib extends Thread {
            public ThirdPartyLib(String threadName) {
                super(threadName);
            }
    
            @Override
            public void run() {
                super.run();
                while (true) {
                    Thread.currentThread();
                    try {
                        Thread.sleep(400);
                        System.setProperty("test", "modifiedProperty");
                        System.out
                                .format("Thread Name  '%s' setting the property with value '%s' \n ",
                                        Thread.currentThread().getName(),
                                        System.getProperty("test"));
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
    将导致下面的输出-这可能不是预期的,我相信也很难调试

     Thread Name  'thirdParty' setting the property with value 'modifiedProperty' 
     Thread Name  'main' setting the property with value 'orignalProperty' 
     Thread Name  'thirdParty' setting the property with value 'modifiedProperty' 
     Thread Name  'main' setting the property with value 'orignalProperty' 
     Thread Name  'thirdParty' setting the property with value 'modifiedProperty' 
     Thread Name  'thirdParty' setting the property with value 'modifiedProperty' 
     Thread Name  'main' setting the property with value 'orignalProperty' 
    
    按照

    通常,请注意不要覆盖系统属性

    setProperties方法更改的系统属性集 当前正在运行的应用程序。这些变化不是持久的。那个 是,更改应用程序中的系统属性不会 影响将来对此或任何应用程序调用Java解释器 其他应用程序。运行时系统重新初始化系统 每次启动时的属性。如果系统属性发生更改 如果要持久化,则应用程序必须将值写入 在退出之前读取一些文件,并在启动时再次读取它们

    您担心某些第三方库可能会覆盖应用程序正在使用的属性,这是正确的。使用某种命名约定来区分属性文件中定义的键始终是一种良好的做法

    这个问题的一个非常简单的模拟

    public class TestApp {
        public static void main(String args[]) throws InterruptedException {
            TestApp app = new TestApp();
            app.new ThirdPartyLib("thirdParty").start();
            while (true) {
                Thread.currentThread().sleep(500);
                System.setProperty("test", "orignalProperty");
                System.out
                        .format("Thread Name  '%s' setting the property with value '%s' \n ",
                                Thread.currentThread().getName(),
                                System.getProperty("test"));
            }
        }
    
        class ThirdPartyLib extends Thread {
            public ThirdPartyLib(String threadName) {
                super(threadName);
            }
    
            @Override
            public void run() {
                super.run();
                while (true) {
                    Thread.currentThread();
                    try {
                        Thread.sleep(400);
                        System.setProperty("test", "modifiedProperty");
                        System.out
                                .format("Thread Name  '%s' setting the property with value '%s' \n ",
                                        Thread.currentThread().getName(),
                                        System.getProperty("test"));
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
    将导致下面的输出-这可能不是预期的,我相信也很难调试

     Thread Name  'thirdParty' setting the property with value 'modifiedProperty' 
     Thread Name  'main' setting the property with value 'orignalProperty' 
     Thread Name  'thirdParty' setting the property with value 'modifiedProperty' 
     Thread Name  'main' setting the property with value 'orignalProperty' 
     Thread Name  'thirdParty' setting the property with value 'modifiedProperty' 
     Thread Name  'thirdParty' setting the property with value 'modifiedProperty' 
     Thread Name  'main' setting the property with value 'orignalProperty' 
    

    如果您需要担心库的行为,则需要了解并使用安全策略和。除其他外,这将允许您限制使用
    System.setProperty

    如果您需要担心库的行为,则需要了解并使用安全策略和。除其他外,这将允许您限制使用
    System.setProperty

    我不会依赖使用系统属性在线程之间共享信息。我尝试在一个线程中创建一个属性,而另一个线程在10秒后也找不到。修改线程已经可用的系统属性值的行为已经得到了其他人的回答。

    我不会依靠使用系统属性在线程之间共享信息。我尝试在一个线程中创建一个属性,而另一个线程在10秒后也找不到。修改值的行为