我真的很难弄明白这一点。花了大约 4 个小时在网上爬行,没有 SO 帖子来拯救我。
设想一个场景:
我已经编写了一个 chrome 扩展程序,它可以捕获网页上的一些特定操作(主要是按钮点击)。该操作会触发一个函数,该函数会捕获一些用户信息和按钮信息(都存在于页面本身上)并显示出来
现在我希望插件能够将其更新为远程服务器上的数据库设置。
由于我精通 PHP(因此 MySQL 是不错的选择),我正在寻找一种解决方案来确保仅且仅从扩展本身进行更新。
对此,我认为最好的选择是运行一个类似 http://remoteserver.tld/update-db.php?id=XXXX&action=YYYYY&foo=bar 的 GET/POST 请求。 ....等等。但是如果用户在插件外部打开/传递 post vars 到这个 url 会发生什么?
数据仍会更新,完整性会丢失!
下一个最好的想法是在请求中包含 key ,但是扩展是用 JS 编写的,几乎任何人都可以嗅出 key 。
指导我使用最佳方法更新远程服务器上的数据库并确保操作经过身份验证。
干杯!
最佳答案
这里的问题基本上是身份验证之一,您想防止任何人都能够更新任何其他人的数据存储。
对此最明显的解决方法是发送一个难以枚举的附加参数(散列是一个很好的例子)并且只分配给您的扩展的单个实例(因此每个用户都会生成自己的身份验证散列)。
要使此哈希有效,重要的是它不可猜测。 不要仅基于静态内容(如 ip 地址或用户代理字符串)创建哈希。
您可以包含这些静态字符串以减少碰撞的可能性: [伪] sha1(ip_address+user_agent+random_integer)。
所以基本上对您来说,结果如下: 让扩展为当前实例生成一个散列,如果它是第一次运行,向您的服务器发出初始请求以“注册”这个新实例,所有具有此散列的后续请求都将对该实例进行身份验证。
另外,使用 SSL 加密连接来防止嗅探。
请不要通过到处异或之类的晦涩难懂的方式来安全地解决这个问题,人们会发现的。
哦,顺便说一句,如果您的问题是关于数据完整性本身的,那么您无法修复它。发送的数据始终由用户提供,因为机器所做的一切都在该用户的控制之下(假设)。
关于php - 我如何从 chrome 扩展中安全地更新远程数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12921562/