【发布时间】:2010-03-17 16:43:43
【问题描述】:
我正在开发一个 ASP.NET 应用程序,该应用程序与 Google 地图交互并从数据库中检索标记信息。标记信息被拆分为数据库中的表,其中表的名称反映了公司(例如 CompanyA_MarkerData、CompanyB_MarkerData 等)。为了使用新的标记数据定期更新地图,我在 JavaScript 中使用 setTimeout 来定期调用我的“UpdateMarkers”JavaScript 函数。 “UpdateMarkers”调用执行数据库查询并将标记列表返回给 JavaScript 的 Web 服务,JavaScript 进而更新地图。
我使用此方法的主要问题是我的 Web 服务要求我将公司名称传递给它,以便它知道要访问数据库中的哪个表。正如您可以想象的那样,这会带来安全风险,因为任何人都可以将不同的公司名称传递给 Web 服务,并能够从其他公司以及他们自己的公司检索数据。
为了避免这个问题,我正在重组我的程序如下:当系统管理员为我的应用程序创建用户时,他们也可以为这个用户分配一个公司 ID。公司 ID 使用 ASP.NET 中的 Profile 对象存储。我正在将 Web 服务代码移动到具有共享功能的类中,以便它们只能在我的页面中调用(但不能被任何人调用,例如 Web 服务)。这些函数仍然需要传递给它们的公司名称。但是,JavaScript 不会直接调用这些共享函数,而是调用一组页面方法(据我了解,它们不像 Web 服务那样公开)。然后,这些页面方法将使用 Profile 对象检索附加到当前登录用户的公司名称,然后调用我的共享数据库函数并将信息返回给 JavaScript。
我认为第二种方法比第一种方法更安全,因为我不允许客户端将不同的选项传递给我的代码并检索未经授权的数据。服务器端代码计算出需要发送的参数。但是,我想知道是否有更好的方法让我错过了?
谢谢
--Amr
【问题讨论】:
-
刚刚意识到页面方法需要在 VB 中声明为 Shared,而我无法从 Shared 函数访问 Profile 对象。这让工作中的扳手有点......
标签: asp.net javascript web-services security pagemethods