这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

背景

某一天,前端小余同学和后端别问我小哥在做登录业务接口对接,出于业务的特殊性和安全性的考虑,她和后端小哥约定“user”相关信息参数需要通过HTTP协议的header传递过来,利用HTTPS协议的头部中的参数可以通过加密传输,从而保证数据的安全性。

开发阶段

确定技术方案之后,小余同学在注册发起请求函数的headers中新增user属性:

export type User = {
username: string;
password: string;
};
const handleRequest = async (userInfo: User, params: Object) => {
try {
await axios.post('/register-login-secure', params, { headers: { ...userInfo } });
} catch (e) {
console.error(e);
}
};

这段代码看起来是没有任何问题,对吗?

再看一下前端代码的逻辑:

const Register = () => {
const handleRequest = () => {
// ...
};
return (
<Form>
<Form.Item field="username" label="用户名">
<Input placeholder="请输入用户名" />
</Form.Item>
<Form.Item field="password" label="密码">
<Input.Password placeholder="请输入密码" />
</Form.Item>
<Form.Item noStyle>
<Button onClick={handleRequest} />
</Form.Item>
</Form>
);
};

整体看下来没什么问题,但是可以发现username是对用户输入没有做任何校验的,也就是说:无论用户输入什么都可以存在数据库的,这里我们忽略xss攻击。

由于这次的技术方案user信息是通过headers传递的,跟之前的传参有一些出入以及在本地测试的时候,前端和后端在用户名部分随便输入了一串英文字符串作为用户名用于测试,发现没问题于是就提测了。

测试阶段

进入提测阶段之后,测试同学把测试用例甩了过来:

场景一:注册用户名ashui,是否注册成功

场景二:重复注册用户名ashui,是否注册成功

...

测试同学也顺利的通过了所有测试用例,所以就上线了,线上验收也没什么问题,所以大家都早早下班,各回各家,各找各妈。看到这里,大家有发现什么问题?如果有的话,请继续往下看,看看猜想和后续遇到的问题是不是一直的。

事故阶段

距离这次上线已经过去三天了,忽然小余晚上三点半被P0加急电话吵醒,看到群里反馈有用户无法注册,小余瞬间清醒打开电脑复现了一下,发现没问题,群里大家复现都说没问题,但运营同学跟客户反复沟通后,发现客户确实无法注册,于是小余就去sentry监控查看了一下,忽然发现了之前从来没有遇到的报错:

Failed to read the 'headers' property from 'RequestInit': String contains non ISO-8859-1 code point.

小余从这个报错中窥探到一点信息是headers,程序员天生的直觉告诉她可能跟这次上线的技术方案有关,所以她去看了一下HTTP协议的文档.

解决阶段

文档里面有这样一段话:

By default, message header parameters in HTTP ([RFC2616]) messages can not carry characters outside the ISO-8859-1 character set ([ISO-8859-1]). RFC 2231 ([RFC2231]) defines an escaping mechanism for use in MIME headers. This document specifies a profile of that encoding for use in HTTP.

翻译过来就是HTTP headers中不能包含ISO-8859-1以外的字符集。小余恍然大悟,用户输入的是中文的名字,所以赶紧试了一下,发现果然是这个问题,于是跟产品确定用户名的用户输入的规范,以及跟后端小哥修改技术方案。

什么是ISO-8859-1字符集

用于表示文本字符的编码方案。它是国际标准化组织(ISO)制定的字符集之一,于1987年发布。

ISO-8859-1 字符集包含了来自拉丁字母表的字符,主要用于表示西欧语言,如英语、法语、德语、西班牙语等。它是一个单字节字符集(Single-Byte Character Set,SBCS),其中的每个字符都可以用一个字节(8位)进行表示。ISO-8859-1 字符集共定义了256个字符,编号从0到255。

ISO-8859-1 字符集的编码方案被广泛应用于计算机系统和互联网中的文本传输和存储。在该字符集中,ASCII 字符(0-127)与 ASCII 字符集相同,因此 ISO-8859-1 是 ASCII 的一个超集。此外,ISO-8859-1 还包括了其他特定于欧洲语言的字符,如重音符号、希腊字母、货币符号等。

例如,ISO-8859-1 中的一些常见字符包括:

  • 字母:A-Z、a-z
  • 数字:0-9
  • 标点符号:. , ; : ! ? ' " ( ) [ ] { } < > | / \ - + * = # @ $ % & _
  • 特殊字符: ° µ Æ æ Ø ø Å å

ISO-8859-1 字符集的编码方案被广泛支持,包括在操作系统、编程语言、文本编辑器、浏览器等软件和工具中。然而,它仅适用于西欧语言,对于其他非西欧语言的字符,如中文、日文、韩文等,ISO-8859-1 并不适用。对于这些语言,通常使用其他字符集和编码方案,如 UTF-8、UTF-16 等。

需要注意的是,ISO-8859-1 字符集与 Unicode 字符集是不同的概念。Unicode 是一种字符编码标准,旨在为世界上所有的字符提供唯一的标识符,而 ISO-8859-1 是其中的一种字符集,只覆盖了一部分字符。

后续

经过这次事故之后,小余也加强了对HTTP新的理解,在HTTP协议中headers是需要遵循ISO-8859-1字符集规范,也为后续小余成长做了一个警示。

本文转载于:

https://juejin.cn/post/7289343331013001271

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

记录--P0事故预警的更多相关文章

  1. MySQL 可重复读,差点就我背上了一个 P0 事故!

    小黑黑的碎碎念 哎,最近有点忙,备考复习不利,明天还要搬家,好难啊!! 本想着这周鸽了,但是想想还是不行,爬起来,更新一下,周更可不能断.偷懒一下,修改一下之前的一篇历史文章,重新发布一下. P0 事 ...

  2. 《程序人生》系列-害敖丙差点被开除的P0事故

    你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub https://github.com/JavaFamily上已经收录有一线大厂面试点脑图.个人联系方式和技术交流群,欢迎Star和指教 ...

  3. Zabbix集成Cloud Alert(睿象云)实现电话短信预警

    Zabbix 集成 睿象云智能告警平台 CA ( Cloud Alert ) 一 .简介与前期了解 Cloud Alert 通过应用,接入监控系统/平台的告警,集中管理您的告警,统一分派通知,统一分析 ...

  4. Veins(车载通信仿真框架)入门教程

    Veins入门教程——教你如何下手研究 目录 Veins入门教程——教你如何下手研究 目录 废话少说! 讲解omnetpp.ini!(挑关键的) 讲解RSUExampleScnario.ned! 注意 ...

  5. 金蝶K3表

    系统ID     表ID     表名     表中文名     表说明     FType     FSefDefSign0     0     t_VoucherGroup     凭证字表    ...

  6. 分布式锁没那么难,手把手教你实现 Redis 分布锁!|保姆级教程

    书接上文 上篇文章「MySQL 可重复读,差点就让我背上了一个 P0 事故!」发布之后,收到很多小伙伴们的留言,从中又学习到很多,总结一下. 上篇文章可能举得例子有点不恰当,导致有些小伙伴没看懂为什么 ...

  7. java实现网页爬虫

    接着上面一篇对爬虫需要的java知识,这一篇目的就是在于网页爬虫的实现,对数据的获取,以便分析. -----> 目录:   1.爬虫原理 2.本地文件数据提取及分析 3.单网页数据的读取 4.运 ...

  8. Ocelot-基于.NET Core的开源网关实现

    写在前面 API网关是系统内部服务暴露在外部的一个访问入口,类似于代理服务器,就像一个公司的门卫承担着寻址.限制进入.安全检查.位置引导等工作,我们可以形象的用下图来表示: 外部设备需要访问内部系统服 ...

  9. 基于.NET平台的Ocelot网关框架教程汇总

    Ocelot 框架是基于.NET 开发的 API 网关,API网关是系统内部服务暴露在外部的一个访问入口,类似于代理服务器,就像一个公司的门卫承担着寻址.限制进入.安全检查.位置引导等工作,我们可以形 ...

  10. 转 Mysql性能优化教程

    Mysql性能优化教程 背景及目标 厦门游家公司(4399.com)用于员工培训和分享. 针对用户群为已经使用过mysql环境,并有一定开发经验的工程师 针对高并发,海量数据的互联网环境. 本文语言为 ...

随机推荐

  1. CentOS7.5上卸载Oracle19c

    最近遇到一个麻烦的事情,由于公司开发的数据库备份容灾系统,对于备份容灾的数据库必须使用LVM(pv.vg.lv),所以之前安装的Oracle19C 必须卸载掉,然后使用空白磁盘通过parted.fdi ...

  2. NES/FC游戏: 勇者斗恶龙2

    武器 名称 攻击力 价格 主角 王子 公主 来源 Bamboo Stick 2 - x x x Wielded by the Princess of Moonbrooke at the start o ...

  3. uniapp实现点击加载更多

    使用场景 举个栗子:外卖app当订单商品数量比较多时,不方便一次性展示出来.通常会展示一部分,并在页面给出一个查看更多功能.点击后即可自定义展示剩余内容,比如可以每次点击多展示N个内容,或展示所有. ...

  4. Vue+SpringBoot+ElementUI实战学生管理系统-1.项目介绍

    1.项目介绍 前段时间有位老铁问老徐有没有Vue+SpringBoot+ElementUI前后分离的项目想学习下,抱歉前端时间有点忙.千呼万唤始出来,做得不是很到位,需要的朋友可以拿去自己定制.:) ...

  5. Vue实现简单计算器功能

    知识点: v-model双向绑定 v-on事件绑定 实现效果 源码 <!DOCTYPE html> <html lang="en"> <head> ...

  6. GDI实现透明菜单位图

    case WM_CONTEXTMENU: { m_hMenu = CreatePopupMenu(); g_BitMap = (HBITMAP)LoadImage(NULL, L"1.bmp ...

  7. 循环掌控:深入理解C语言循环结构,高效实现重复性任务

    欢迎大家来到贝蒂大讲堂 养成好习惯,先赞后看哦~ 所属专栏:C语言学习 贝蒂的主页:Betty's blog 引言 前面贝蒂带大家了解了选择结构,今天就来为大家介绍循环结构,也就是我们熟悉的while ...

  8. Hi3516开发笔记(十一):通过HiTools使用网口将uboot、kernel、roofts烧写进eMMC

    前言   前面烧写一直时烧写进入flush,是按照分区烧写.定制的板子挂的是eMMC,前面的烧写步骤一致,但是在烧写目标则时烧写eMMC了.  重新走一遍从无到有通过网口刷定制板卡的uboot.ker ...

  9. ABP Suite模块项目中设置菜单及其多语言

    1.Blazor的菜单构造的类 ABP Suite自动生成的是这样: 2.从Study.Trade.Web的Menus下拷贝内容过来后 3.TradeMenus中增加一个常量 4.启动程序 单击Tra ...

  10. 扣子(coze.cn)| 由浅入深,手把手带你实现Java转型学习助手

    扣子(coze.cn)是一款用来开发新一代 AI Chat Bot 的应用编辑平台,无论你是否有编程基础,都可以通过这个平台来快速创建各种类型的 Chat Bot,并将其发布到各类社交平台和通讯软件上 ...