2014-11-06 24 views
1

我开发与PhoneGap的应用程序,并已存储在本地存储的用户ID和用户级别,例如:贮藏用户ID和其他数据,并使用它来查询数据库

window.localStorage["userid"] = "20"; 

这填充,一旦用户已登录到应用程序。然后这被用在ajax请求中,以提取他们的信息和与他们的账户相关的东西(其中一些非常私人)。该应用程序也被用于网络浏览器,因为我使用完全相同的网络代码。有没有办法可以操纵?例如,用户更改它的值,以便获取那些不是他们的信息?

例如,如果浏览器中的另一个应用程序存储了相同的密钥“userid”,它将被覆盖,然后他们会在我的应用程序中将某人删除数据。

这怎么能防止?

+0

我不是安全专家。正如你所说的,用户可以伪造别人的身份证并获得未授权的数据。为什么不使用在后端(服务器)生成的会话令牌并使用它来验证事务。会话令牌可以存储在本地存储中。会话令牌是随机生成的,用户很难猜测令牌。 – frank 2014-11-06 08:50:19

回答

2

在进一步攻击媒介之前,将这些敏感数据存储在客户端不是好主意。使用令牌来代替,因为存储在客户端的每一个数据都可能被攻击者欺骗。

你认为是对的。可能的攻击向量可能与不安全的直接对象引用有关。让我举一个例子。

您正在存储userID客户端,这意味着您不能再信任该数据。

window.localStorage["userid"] = "20"; 

黑客可以将该值更改为任何他们想要的值。可能他们会将其更改为少于20的值。因为大多数常见用例显示20来自配置为自动增量的列。这意味着应该有有效的用户,他们的用户ID是19或18或更少。

让我假设您的应用程序有一个用于通过用户ID获取产品的模块。因此,后端查询应该与以下类似。

SELECT * FROM products FROM owner_id = 20 

当黑客将这个值改为别的东西时。他们将设法获取属于他人的数据。他们也有机会删除/更新属于其他人的数据。

可能的恶意攻击媒介真的取决于您的应用程序和功能。正如我之前所说的,您需要弄清楚这一点,并且不要暴露像userID这样的敏感数据。

使用令牌而不是userID正在解决可能的中断尝试。只有你需要做的事情是创建一个更多的列并命名为“token”,并使用它来代替userid。 (不要忘记生成很长且不可预知的标记值)

SELECT * FROM products FROM owner_id = iZB87RVLeWhNYNv7RV213LeWxuwiX7RVLeW12