你好呀,我是歪歪。
刚刚在小红书上冲浪的时候,发现了这样一条内容:
我开始以为是一个钓鱼贴,骗评论的。
结果发现评论反映确实是发不出来。
于是我也试了一下:
当我在小红书的评论区输入 time.sleep(1) 之后,弹窗提示“似乎已断开与互联网的连接”。
通过浏览器观察,可以看到后端返回的 405 状态码:
然后我尝试着在搜索框里面搜了一下:
这波就更厉害了,直接就是弹出“网络断开”的错误页面。
你就说这是不是 BUG 吧?
什么,你说这是 future?
我又不是憨憨,你为什么要骗我,哪怕你说是彩蛋呢?
都稍微合理一点。
针对这个现象,小红书的小姐妹们在评论区讨论的非常热闹,你看这个评论数就知道了:
按照这个逻辑推理,我试着输入了一下这个玩意:
《script》alert("xss")《script/》 //后面会解释为什么用中文
果然,出现了一模一样的问题。
我作为程序员,针对这个现象当然能大概联想到“注入攻击”这样的关键词。
毕竟 time.sleep(1) 和 《script》alert("xss")《script/》 这类评论是有代码含义的。
但是我理解不了的是为什么小红书会抛出一个“网络连接异常”给到用户。
这样不是更加具有迷惑性吗?
歪师傅当年接了一个需求也是类似的,防止用户在输入框进行 XSS 攻击。
主要就是对所有用户输入进行过滤,特别是当用户的输入被包含在 HTML、JavaScript、CSS 或 URL 中时,按照正常逻辑来说,是要过滤掉或转义掉潜在的危险字符,比如 <、>、&、" 和 ' 这些玩意。
但是我当时就是直接一个大力出奇迹,我也懒得过滤,比如用户输入中包含一些 html 标签的时候,我就直接弹出一个非法输入。
我知道这个做法很糙,但是反正也是内部人员使用的页面,糙点也就糙点了。当他们拿着问题来找我的时候,我就告诉他:这是一个历史悠久的技术问题,解决起来比较棘手,你尽量使用中文符号,就好使了。
但当这个问题放在小红书,这个面向 C 端用户的 APP 来说,在提示上就值得好好琢磨了。
首先,我个人觉得这类评论直接在前端拦截到,是合理的。
因为正常用户按理来说是不会输入这样的评论的,输入这样评论的用户,一定是有某种意图。
比如前面大量的用户在评论区输入这样的评论,是因为有这样的引导,然后她们出于一种不相信或者猎奇的心态,觉得很有趣,第一次遇到这种情况,才在评论区输入了这样的评论。
所以,能偶然间触发这个 bug 的用户应该非常之少,没有必要为了这么一小部分用户,费心费力的去想着怎么把这部分“奇怪”的评论落下来。
但真的遇到了这样的输入,直接提示一个“非法输入”我觉得都比提示“网络异常”合理很多。
一般来说,能输入这个评论的用户,心里也明白这是一个“非法输入”。
当然了,这都是歪师傅自己的看法,如果你有更友好的实现方式,也可以在评论区交流一下。
我学习学习。
在这个小红书下面有一个热评是这样的:
诶,不是说好打不出来吗,这个评论又是怎么回事呢?
你想想,你在写代码的过程中,有没有被 l(小写的 L),(I)大写的 i,数字 1 搞过?
甚至还有人教我的“丨”,这种存粹恶搞的玩意:
l,I,1,丨 。
这四个哥们放在一起,在有的平台上面真的是,“安能辨我是雌雄”。
所以,上面这个热评中 sleep 中的 l 其实是大写的 I:
这两个字母在小红书里面的差异,真是像素级别的。
我给你演示一下,第一个 l 是小写的 L,第二个 I 是大写的 i:
肉眼看真的看不出来啥区别。
但是放大到像素级别的时候,你会发现它们有一个像素的差异:
真的就一个像素。
还有比如这个评论,他输入了中文括号,成功了:
我从这个评论中看到了一点“信息茧房”的味道。
作为一个程序员,只要看到别人说:“你使用的是中文的括号”,立马就能反应过来。
但是对于非程序员来说,他一时间很难理解这其中的差异。
这就是一种信息茧房。
同时作者还提示在“time.sleep(1)”加入其他内容就能正常显示:
比如他第一句解释中就包含“time.sleep(1)”,就能正常发出来。
于是,我想到了一个只有程序员能懂,且能迷惑到程序员的一个输入:
//time.sleep(1)
在这个场景中,你会不会一瞬间把 // 理解为了注释?
大脑真的就很神奇,它会自动帮我们解析很多信息。
这也让我想起了以前在网上看到的一个段子。
有个资源包的解压密码是“鲁迅的本名”。大多数人都会输入“周树人”,提示错误,多次尝试后才反应过来,解压密码原来就是“鲁迅的本名”这几个字。
不知道这个问题的答案或者母语非中文者就不会被困扰,因为缺乏相关知识,他们的大脑不会自动解析这些信息。
确实有点意思,就当是一个让人蛋疼的冷知识吧。
最后,来一个梗图:
就在我写完文章,准备用 mdnice 转公众号格式的时候,也遇到了这样的问题:
直接从这里开始截断了...
好吧,也是一种处理方式。
所以,我这个地方用的是中文符号。