首页 > 其他分享 >记录--P0事故预警

记录--P0事故预警

时间:2023-10-13 18:56:05浏览次数:39  
标签:字符 P0 headers -- 字符集 预警 8859 ISO 小余

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

背景

某一天,前端小余同学和后端别问我小哥在做登录业务接口对接,出于业务的特殊性和安全性的考虑,她和后端小哥约定“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,headers,--,字符集,预警,8859,ISO,小余
From: https://www.cnblogs.com/smileZAZ/p/17762918.html

相关文章

  • Linux第二次周总结
    第三章用户管理3.1用户/组概览Linux系统是多用户、多任务的分时操作系统,系统上每一个进程都有一个特定的文件,每个文件都被一个特定的用户所拥有。每个用户都属于一个用户组或者多个组,系统可以对一个用户组中的所有用户进行集中管理。3.1.1用户标识:UID与GIDLinux系统并不能......
  • misc杂记
     用stegsolve打开找到隐藏的二维码 识别出来一长串16进制 有flag1.py等,考虑是一个pyc文件反编译之后查看源码 发现函数没有调用,所以无输出,手动给他加上  stegsolve打开发现有二维码,不完整,010editor看到有一个url打开之后是另一张看起来一样的图,用bcompare比......
  • CSS-02
    Emmet语法提高编写速度HTML生成标签:标签名+tab建多个相同标签:div*3(生成3组)父子关系:ul>lidiv>span兄弟关系:div+p有class或id的标签名:p.nav或p#nav有顺序的类名:.demo$5生成的标签内有内容:div{内容}CSStext-align:center=tactext-indent:=tiwidth:200=w200text-decorat......
  • 2023-2024-1 20231413 《计算机基础与程序设计》第三周学习总结
    班级:2023-2024-1-计算机基础与程序设计作业要求:2023-2024-1《计算机基础与程序设计》教学进程目标:自学教材:计算机科学概论第2、3章并完成云班课测试《C语言程序设计》第2章并完成云班课测试教材学习内容总结:了解了进制转换、图像/音频压缩,计算机数学的基础知识教材学习中的......
  • [AGC037D] Sorting a Grid 题解
    学长给我看了这道题,感觉很有趣啊!想了想想出来了。考虑先把每个数还原到对应行上,然后用最后一次把它们斗出来。那么我们就是要在第一次操作后,对于每种颜色使得它平铺在这个块上。那么我们直接网络流或二分图匹配构造一下方案就做完力!......
  • Vector多行日志读取,解析
    官方记录:https://github.com/vectordotdev/vector/issues/2137目前只支持file、docker[sources.multiline_logs]type="file"include=["/opt/multiline.log"] [sources.multiline_logs.multiline] start_pattern='^<\d+>' mode=......
  • 使用PasteSpider把你的代码升级到服务器的Docker/Podman上,K8S太庞大,PasteSpider极易上
    如果你的服务器的内存小于16GB,那么K8S就和你无缘了,但是你可以使用PasteSpider来实现发布你的项目到服务器上!PasteSpider是一个运维工具,使用NET编写的,部署于服务器的Docker/Podman上,他可以帮助你把你的项目发布到服务器上,支持源码模式,支持发布模式,支持一键发布!下面基于实际案例做......
  • 5771: 小明的账单 multiset
    描述  小明在一次聚会中,不慎遗失了自己的钱包,在接下来的日子,面对小明的将是一系列的补卡手续和堆积的账单…在小明的百般恳求下,老板最终同意延缓账单的支付时间。可老板又提出,必须从目前还没有支付的所有账单中选出面额最大和最小的两张,并把他们付清。还没有支付的账单会被......
  • docker搭建gitlab,集成CI/CD(gitlab-runner)
    搭建gitlab和gitlab-runner首先配置GITLAB_HOMEexportGITLAB_HOME=/srv/gitlab如果你是在BASH下,可以将以上配置放到~/.bash_profile文件中,使用source~/.bash_profile使其永久生效。dockerrun--detach\--hostname192.168.1.205\--publish9443:443--publish9......
  • Trying to backward through the graph a second time
    原因是把创建loss的语句loss_aux=torch.tensor(0.)放在循环体外了,可能的解释是第一次backward后把计算图删除,第二次backward就会找不到父节点,也就无法反向传播。参考:https://stackoverflow.com/questions/55268726/pytorch-why-does-preallocating-memory-cause-trying-to-backw......