如何在Chrome扩展程序内安全地更新远程数据库?

7

我现在遇到困难,花了大约4个小时搜索网络和SO帖子,但没有找到答案。

想象一下这样的情景:

  1. 我已经编写了一个Chrome扩展程序,用于捕获网页上的某些特定操作(主要是点击按钮)。该操作会触发一个函数,该函数会捕获页面上所有用户信息和按钮信息并显示它们。

  2. 现在我希望该插件能够将这些信息更新到远程服务器上设置的数据库中。

由于我擅长PHP(因此MySQL是好的选择),我正在寻找解决方案,以确保更新仅来自于扩展本身。

为此,我认为最好的选项是运行类似http://remoteserver.tld/update-db.php?id=XXXX&action=YYYYY&foo=bar之类的GET/POST请求...等。但是如果用户在插件外部打开/传递post变量到这个URL会怎么样呢?

数据仍然会被更新,完整性会丢失!

下一个最好的想法是包含请求密钥,但是扩展都是用JS编写的,几乎任何人都可以嗅探到密钥。

引导我找到更新远程服务器上数据库的最佳方法,并确保该操作经过身份验证。

谢谢!


5
任何人都可以嗅探钥匙以及扩展程序的活动。完美的安全基本上是不可能的。选择一个你愿意接受的风险水平,然后将事物保护到该点,不需要更进一步。 - Marc B
没错...但是我可以在服务器端检查更新数据库的请求是否来自插件,还是来自伪造的页面?你认为我有哪些选择@MarcB?你会怎么做?请记住,它需要尽可能快,因为将有数百个用户在内部网络上更新主机。 - whizzzkid
假设我正在为科技先驱之一工作,需要一个可靠的方法来保护这些数据免受伪造...因为我相信这里的极客们会尽力攻击这些数据...感谢你的想法@MarcB。 - whizzzkid
在这种情况下,不要在浏览器中进行操作。那就像使用塑料布和胶带在购物中心中央建造超级监狱一样。 - Marc B
我还能用什么方式收集用户与网页的交互呢?如果我无法控制网页,也无法将其嵌入到框架或其他控制数据的东西中。 - whizzzkid
你在这里尝试解决什么问题?除了浏览器扩展之外,也许还有其他解决方法。 - Jan Prieser
1个回答

1
这里的问题基本上是身份验证,您希望防止任何人能够更新其他人的数据存储。
最明显的解决方法是发送一个难以枚举的附加参数(哈希值是一个很好的例子),并将其分配给您扩展程序的单个实例(因此每个用户都会生成自己的身份验证哈希值)。
为了使此哈希值有效,重要的是它不可猜测。不要仅基于静态内容(如IP地址或用户代理字符串)创建哈希值。
您可以包括这些静态字符串以使碰撞更少发生:[伪] sha1(ip_address + user_agent + random_integer)。
所以基本上对于您来说,这就结束了: 如果扩展程序第一次运行,请让扩展程序为当前实例生成哈希值,并向您的服务器发出初始请求以“注册”此新实例,所有具有此哈希值的后续请求都将对该实例进行身份验证。
此外,请使用SSL加密连接以防止窃听。
请不要通过混淆来解决此问题,例如在各个地方进行异或操作,人们会发现的。

顺便说一下,如果你的问题是关于数据完整性本身的,那么你无法修复它。发送的数据始终是由用户提供的,因为机器所做的一切都在该用户的控制之下(假定如此)。


感谢@ garuda:在撰写帖子之前,我已经考虑到了这一点。但问题或多或少是:假设要更新数据库,我会将数据作为http://remote/update/?data=<data>发送到远程服务器,但如果插件没有进行更新,则任何人都可以使用浏览器添加到数据库中,或者运行shell脚本来复制这些记录。 - whizzzkid
我最初的计划是:用户将数据更新到数据库中,更新页面返回一个ID哈希值,因此下次插件更新时,它只能更新包含该哈希值的内容,并且每次查询都会重新生成哈希值! - whizzzkid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接