首页 >>  正文

使用redis实现缓存

来源:baiyundou.net   日期:2024-09-21

作者 | 屠敏

出品 | CSDN(ID:CSDNnews)

ChatGPT 的火爆,超出了很多人的想象。今年初,根据 UBS(瑞士银行巨头瑞银集团)的一份报告显示,ChatGPT 推出仅两个月后,它在 2023 年 1 月末的月活用户已经突破了 1 亿,成为史上用户数增长最快的消费者应用。

不过,就是这样一款应用,最近却被推上风口浪尖,只因不少用户发现自己竟然可以看到别人与 ChatGPT 的聊天记录。

聊天信息被看光了可还行?

这导致 OpenAI 曾一度选择紧急关闭 ChatGPT。经过几天的排查,直至近日,OpenAI 正式公开了此次事件的技术原因,其表示,是开源库 Redis 中的一个 Bug 才导致了 ChatGPT 服务暴露了其他用户的个人信息和聊天标题。

而这究竟是怎么一回事,我们将通过 OpenAI 的官方公告了解事情的真相。

事件始末

在上周,CSDN 报道过此事,彼时有一位 Reddit 用户率先发现,在与 ChatGPT 聊天记录栏中,多出了许多陌生的对话标题,这也让他产生了“ChatGPT 或我是被黑了吗?”的错觉。

没想到的是,这条帖子迅速引发了多人的关注,也有很多用户在下方留言称自己也遇到了同样的问题,一位 Twitter 用户 Jordan L Wheeler 表示:“我看不到内容,但可以看到他们最近的对话标题。”

OpenAI 在公告中对这种情况进行了解释,「如果两个用户大约同时在线活跃,那么新创建的对话的第一条消息也有可能在其他人的聊天记录中可见」。

技术细节

至于为什么会出现这种状况,OpenAI 进一步补充说,该错误是在 Redis 客户端开源库 redis-py 中发现的。以下是 Bug 的工作原理:

OpenAI 使用 Redis 在其服务器中缓存用户信息,因此他们不需要为每个请求检索一遍数据库。

该团队使用 Redis Cluster 将此负载分布到多个 Redis 实例中。

OpenAI 使用 redis-py 库,从基于 Asyncio 运行的 Python 服务器与 Redis 交互。

该库在服务器和集群之间维护一个共享连接池,并在完成后回收连接以用于另一个请求。

当使用 Asyncio 时,redis-py 的请求和响应表现为两个队列:调用者将请求推送到传入队列,然后从传出队列弹出响应,并将连接返回到池中。

如果在请求被推送到传入队列之后,但在响应从传出队列中弹出之前,请求被取消,OpenAI 便可以看到错误所在:连接因此被破坏,下一个为不相关的请求去排队的响应可以接收连接中留下的数据。

在大多数情况下,这会导致不可恢复的服务器错误,用户将不得不再次尝试他们的请求。

但在某些情况下,损坏的数据恰好与请求者期望的数据类型相匹配,因此从缓存中返回的数据看起来是有效的,即使它属于另一个用户。

太平洋时间 3 月 20 日星期一凌晨 1 点,OpenAI 无意中对服务器进行了更改,导致 Redis 请求取消数量激增。这为每个连接返回错误数据带来了一个小概率事件。

OpenAI 表示,这个错误只出现在 Redis Cluster 的 Asyncio redis-py 客户端中,在发现的第一时间,便联系了 Redis 维护者,现已修复。

不过,OpenAI 也承认这个错误会在其他地方带来一些影响,比如可能导致 1.2% 的 ChatGPT Plus 订阅者在特定的 9 小时(太平洋时间 3 月 20 日星期一凌晨 1 点到 10 点)无意中看到了别人与支付相关的信息,包括会看到另一个活跃用户的名字和姓氏、电子邮件地址、支付地址、信用卡号的最后四位(仅)和信用卡到期时间日期。

OpenAI 称已经联系受影响的用户并通知他们的付款信息可能已被泄露。同时,该研发团队也添加了冗余检查以确保 ChatGPT 应用程序的 Redis 缓存返回的数据与请求用户匹配。

OpenAI 也修复了关键账户接管漏洞

在另一个与缓存相关的问题中,OpenAI 还解决了一个关键的帐户接管漏洞。

该漏洞最初由安全研究员 Gal Nagli 发现,它绕过了 OpenAI 在 chat.openai[.]com 上实施的保护措施,可以被利用来控制另一个用户的帐户,查看他们的聊天记录,并在他们不知情的情况下访问账单信息。

实现这一目标的方法是,首先创建一个特制的链接,将一个 .CSS 资源加载到 "chat.openai[.]com/api/auth/session/"端点上,并诱使用户点击该链接,导致包含有 accessToken 字符串的 JSON 对象的响应被缓存在 Cloudflare 的 CDN 中。

对 CSS 资源的缓存响应(其 CF-Cache-Status header 值设置为HIT)然后被攻击者滥用,以收获目标的 JSON Web Token(JWT) 凭证并接管账户。

Nagli 表示,OpenAI 在负责任的披露后两小时内就修复了该漏洞,表明了问题的严重性。

开源维护者是否要为商业公司的使用负责到底?

不过,虽然 OpenAI 在公告中一直强调,“Redis 开源维护者是出色的合作者,他们迅速解决了错误并推出了补丁。Redis 和其他开源软件在我们的研究工作中发挥着至关重要的作用。它们的重要性不可低估——如果没有 Redis,我们将无法扩展 ChatGPT。”

但是,对于 ChatGPT 具备捉 Bug 能力,却避免不了自己的 Bug,而且 Redis 承担主责这一情况,也引发了不少网友的讨论,甚至称「ChatGPT 惹的祸,终是要让开源软件来担着了」。

这也让很多人联想到了当初风靡全球的 Log4j 2 漏洞,以及

第三方公司在商业化产品中使用开源项目,从中赚得盆满钵满,而自己从未提供技术资金支持,当遇到问题时,又推回给开源开发者,一味“白嫖”只拿钱不办事,再次增加了开源开发者的负担。

对此,你认为开源维护者是否要为商业软件的安全问题负责到底?

","gnid":"954eb5a1b28ecaf92","img_data":[{"flag":2,"img":[{"desc":"","height":"80","s_url":"https://p0.ssl.img.360kuai.com/t013d73ffee4a20366b_1.gif","title":"","url":"https://p0.ssl.img.360kuai.com/t013d73ffee4a20366b.gif","width":"640"},{"desc":"","height":"222","title":"","url":"https://p0.ssl.img.360kuai.com/t01fa6a91e11e5a81bc.jpg","width":"1080"},{"desc":"","height":"934","title":"","url":"https://p0.ssl.img.360kuai.com/t01e3c363ae02193e38.jpg","width":"1080"},{"desc":"","height":"267","title":"","url":"https://p0.ssl.img.360kuai.com/t01f9e8809730232d1c.jpg","width":"729"},{"desc":"","height":"80","s_url":"https://p0.ssl.img.360kuai.com/t018e6f0fcf6c9df4ee_1.gif","title":"","url":"https://p0.ssl.img.360kuai.com/t018e6f0fcf6c9df4ee.gif","width":"960"}]}],"original":0,"pat":"art_src_1,fts0,sts0","powerby":"cache","pub_time":1680082751000,"pure":"","rawurl":"http://zm.news.so.com/6567e1185dc12807bcc3c3d01c75f3f4","redirect":0,"rptid":"e9faa44923c23d92","rss_ext":[],"s":"t","src":"CSDN","tag":[{"clk":"ktechnology_1:聊天记录","k":"聊天记录","u":""}],"title":"ChatGPT 修得了别人的 Bug,修不了自己的!OpenAI 直指开源数据库 Redis 漏了底

牧注畏2274如何使用redis缓存来实现用户最近浏览的商品列表 -
庄贫枫18292843567 ______ 可以用集合sadd sadd key value

牧注畏2274redis cacheable的缓存怎么使用 -
庄贫枫18292843567 ______ 事务执行前后数据状态一致,例如扣钱后,用于余额不可能为负数,redis放弃了回滚,也就是说放弃了对数据一致性的保证;redis大多采用分片和集群,数据一致性无法依靠事务机制,可以通过应用层解决!

牧注畏2274wcf怎么和redis缓存结合 -
庄贫枫18292843567 ______ Redis是一个不错的缓存数据库,读取数据速度效率都很不错.今天大家共同研究下redis的用法.结合网上的资料和自己的摸索,先来看下安装与配置把.咱们主要看在WINDOWS上怎样使用REDIS数据库.下载地址:https://github.com/dmajkic/...

牧注畏2274redis做缓存,怎么更新里面的数据 -
庄贫枫18292843567 ______ 伪代码如下,思路也清晰.读写部分 if(redis){ 读取redis数据 }else{ 数据库读取,存redis+设置超时时间 } 更新部分 if(数据库update){ 更新redis+设置超时时间 }

牧注畏2274redis做缓存,怎么更新里面的数据 -
庄贫枫18292843567 ______ 伪代码如下,思路也清晰.读写部分 if(redis){ 读取redis数据 }else{ 数据库读取,存redis+设置超时时间 } 更新部分 if(数据库update){ 更新redis+设置超时时间 }

牧注畏2274redis做缓存,怎么更新里面的数据 -
庄贫枫18292843567 ______ 伪代码如下,思路也清晰.读写部分if(redis){读取redis数据}else{数据库读取,存redis+设置超时时间}更新部分if(数据库update){更新redis+设置超时时间}

牧注畏2274redis做缓存,怎么更新里面的数据 -
庄贫枫18292843567 ______ 伪代码如下,思路也清晰. 读写部分 if(redis){ 读取redis数据 }else{ 数据库读取,存redis+设置超时时间 } 更新部分 if(数据库update){ 更新redis+设置超时时间 }

牧注畏2274ShardedJedisClient 如何去清空redis缓存 -
庄贫枫18292843567 ______ 应用Redis实现数据的读写,同时利用队列处理器定时将数据写入mysql.同时要注意避免冲突,在redis启动时去mysql读取所有表键值存入redis中,往redis写数据时,对redis主键自增并进行读取,若mysql更新失败,则需要及时清除缓存及同步redis主键.这样处理,主要是实时读写redis,而mysql数据则通过队列异步处理,缓解mysql压力,不过这种方法应用场景主要基于高并发,而且redis的高可用集群架构相对更复杂,一般不是很推荐.

牧注畏2274用了redis还有必要用本地缓存了吗 -
庄贫枫18292843567 ______ 本地缓存可以减少网络io的开销,如果对性能要求极高可以考虑使用.如果redis本身就可以满足要求了,那么就没必要使用.使用就要考虑不同机器数据不一致的问题.

牧注畏2274如何设置数据库缓存 -
庄贫枫18292843567 ______ 内存数据库有现成的redis,高效存取键值对,键设为你的查询条件,值设为你的查询结果转为字符串 查询时先从redis取,没有再查数据库,并且设置redis的过期时间,这种方式需要项目对实时性要求不高,这样你才能用缓存,而且如果你的项...

(编辑:自媒体)
关于我们 | 客户服务 | 服务条款 | 联系我们 | 免责声明 | 网站地图 @ 白云都 2024