user.name 可以被欺骗吗

Can user.name be spoofed

要在 Java 程序中获取当前用户的名称,您可以 simply fetch the value of the user.name system property:

 System.getProperty("user.name");

但这有多安全?对于常见的 运行time 环境,执行该程序的用户能否轻松地将此 属性 设置为任意值(例如,使用 JVM 的命令行参数)?用户可以轻易伪造此用户名吗?


我问是因为我正在编写一个命令行程序,任何人都可以 运行,但只有当用户是特殊管理用户时才允许某些特权操作。


请注意,由于 Java11 user.name 属性 仅在程序启动后有效读取,因此恶意 程序代码 无法恶搞一下。

是的,这个值可以是 'spoofed',如果用户可以自由启动应用程序,则不能依赖此值。

简单地使用 JVM arg -Duser.name=someothername 启动应用程序将导致 System.getProperty("user.name") 到 return 该值。

对于任何可能再次登陆这里的人:

使用 cmd 命令 whoami 并使用 读取输入应该是使用用户名 "validation".

的更安全的方式

除此之外,这也可以被欺骗,这对于 cmd 命令来说可能比 JVM 参数更难...