在匿名XPages应用程序中使用applicationScope的安全性如何?

在匿名XPages应用程序中使用applicationScope的安全性如何?,xpages,Xpages,在XPages应用程序中,我希望将一些(机密)信息存储在applicationScope中,以便所有用户都可以访问这些信息。但是,应用程序的ACL配置为允许匿名用户读取公共文档。不过,我不希望他们能够访问applicationScope。匿名用户是否可以访问/读取applicationScope?如果通过XPage上的可见控件公开该值,则用户只能从applicationScope和其他作用域变量读取值。因此,如果不公开这些值,则用户(匿名或非匿名)无法看到该值。所有范围变量(包括applicat

在XPages应用程序中,我希望将一些(机密)信息存储在applicationScope中,以便所有用户都可以访问这些信息。但是,应用程序的ACL配置为允许匿名用户读取公共文档。不过,我不希望他们能够访问applicationScope。匿名用户是否可以访问/读取applicationScope?

如果通过XPage上的可见控件公开该值,则用户只能从applicationScope和其他作用域变量读取值。因此,如果不公开这些值,则用户(匿名或非匿名)无法看到该值。

所有范围变量(包括
applicationScope
)都是内存上下文。在这种情况下,“范围”一词指的是每一项的访问范围

requestScope
可以在单个HTTP请求期间由当前页面中执行的任何代码访问,此时对象将被销毁。任何其他页面以及针对同一页面实例的任何后续请求都有各自独立的
requestScope

viewScope
可由当前页面中在该页面实例生命周期内执行的任何代码访问。其他页面(包括由同一用户访问的页面)有自己的
viewScope
。类似地,如果用户导航到另一个页面,然后导航回上一个页面,则这是一个新的
viewScope
,因为它是该页面的新实例

sessionScope
可以在单个HTTP会话期间由任何页面内执行的任何代码访问。这与浏览器中的会话cookie有关,而与身份验证无关。因此,如果一个匿名用户稍后登录,它仍然是相同的
sessionScope
。如果他们稍后注销,在关闭浏览器或应用程序清除存储之前,他们仍然拥有相同的
会话范围

applicationScope
可由当前应用程序内任何页面内执行的任何代码访问。这就是允许跨用户共享它的原因:如果User1在一台计算机上访问
app1.nsf/page1.xsp
,而User2在同一个nsf中访问同一页或不同页,它们具有相同的
applicationScope
——变量指的是两个用户完全相同的内存对象——因此,通过一个用户执行的代码存储的任何数据都可以通过另一个用户执行的代码检索,直到应用程序清除存储

但是,如果User1正在访问
app1.nsf
中的任何页面,而User2(或匿名)正在访问
app2.nsf
中的任何页面,则变量
applicationScope
表示每个用户的不同内存中对象,因为他们正在访问不同的应用程序,即使其中一个应用程序中有代码访问另一个应用程序中的磁盘数据。
applicationScope
变量所指的内存中对象在每个NSF中都是不同的,无论它可能访问或创建的任何磁盘数据恰好存储在哪里


因此,您(以及在同一NSF中编写代码的任何其他人)仍然需要认真研究如何构造逻辑,以避免将敏感信息存储在
applicationScope
中,然后将其暴露给不应该访问它的用户,但您不必担心从访问相同内存范围的其他应用程序执行的代码。如果代码是从同一NSF执行的,则代码只能读取存储在应用程序范围中的数据。

感谢您的回答,但我更担心的是“不受信任”的人从我的应用程序(应用程序)获取信息。例如,匿名用户可以创建自己的XPages应用程序,并在我的应用程序中以编程方式读取公共文档。因此,我认为有可能以类似的方式访问我的应用程序的applicationScope。这是可能的吗?正如Tim指出的,applicationScope只能从应用程序内部访问(因此可以从nsf中运行的代码内部访问)。非常感谢您提供的详细和有用的答案。我知道applicationScope变量总是引用执行代码的数据库的相应内存对象。然而,我认为可以通过执行session.getDatabase(“MY_ANONYMOUS_database”).getApplicationScope()之类的命令,从另一个数据库访问这个内存中的对象……我知道没有API调用允许这样做。具有讽刺意味的是,在某些情况下,应用程序之间共享内存中的信息会很有用,因此有多个扩展库可用于创建一个
serverScope
变量,该变量可用于同一服务器上的所有应用程序。。。但即使这样,也只有同一服务器上的应用程序才能访问。例如,我无法编写远程连接到服务器的应用程序(即使它允许匿名访问)并读取范围变量。关键的一点是,所有这些信息和代码都在服务器上执行,而不是在客户端上执行。要让用户注入要在服务器上执行的SSJS代码,需要设计器访问,并且可能需要Notes RPC访问应用程序。Notes RPC访问需要使用高度安全的身份验证过程的Notes ID。上述情况的唯一例外是,设计师特别包括允许用户(或API使用者)发布代码的功能,然后由应用程序进行评估(例如,使用
ValueBinding
API)。如果你没有特别包括这项功能,Newbs就可以了。谢谢大家的帮助,我得到了我想要的答案。