分享

微信朋友圈“空”消息的H5模拟

 TestOps云层 2021-06-22

昨天和大家简单介绍了微信朋友圈空信息的原因后,不少朋友都在问如果在H5中出现这个问题怎么办,或者如果这样回来带什么问题,于是就有了本篇文章。

注意本篇文章为“硬核”内容,云层一本正经的写代码。

为了方便这里首先先把HTML代码放出

<!DOCTYPE html><html lang="cn"><head> <meta charset="UTF-8"> <title>WX朋友圈信息BUG原理演示</title></head><body><script> function checkinput() { if(window.name == "") { document.getElementById("message").value=""; window.name="modify"; } var1=document.getElementById("message").value; if(var1.trim().length==0) document.getElementById("button").disabled=true; else document.getElementById("button").disabled=false; }</script><form id="form1" action="/api" method="POST" > <input type="button" id="button" value="发表" style="font-size: 30px;left: 30px;top: 0;"><br> <textarea cols="40" rows="5" id="message" name="message" onkeypress="checkinput()">这一刻的想法...</textarea> </form></body></html>

将这个代码保存为html后缀文件,用浏览器打开即可看到下面的效果

接着试试点击文本框,然后删掉所有内容(发表按钮变灰)

接着添加两个空格,会发现按钮发表还是灰色,如果添加别的内容就能看到按钮正常使用。

接着解释一下代码及工作原理

基于onkeyup的事件触发,调用checkinput函数

<textarea cols="40" rows="5" id="message" name="message" onkeypress="checkinput()">这一刻的想法...</textarea>

点击文本框输入内容先清空默认提示信息,为了避免再次输入的时候继续清空,所以修改了window.name的值。

if(window.name == "") { document.getElementById("message").value=""; window.name="modify";        }

获取文本框的值,然后去空格检查长度是否是零,如果是零则让按钮不可用,否则让按钮可用。

var1=document.getElementById("message").value; if(var1.trim().length==0)          document.getElementById("button").disabled=true; else          document.getElementById("button").disabled=false; }

好了基本代码这里写完了,这里对关键几个知识点做个说明

//如何确保页面第一次打开,window.name属性第一次打开页面为空window.name == ""//如何通过js获取一个文本框的值,这里需要文本框有ID属性document.getElementById("message").value//如何修改一个按钮为灰色不可用document.getElementById("button").disabled=true//如何判断一个文本框内容是否为空,trim()函数去空格,length拿字符串长度var1.trim().length==0

代码到这里,是不是就出现了不能提交空内容的情况了!

介绍下常见的浏览器客户端的两个小办法

A.和微信的朋友圈问题类似,不触发checkinput()函数

按F12打开Chrome浏览器开发工具,在下面的Console内输入代码

document.getElementById("message").value=""

然后敲下回车

接着你就会发现文本框的内容为空了,而按钮仍然可以使用。同理还可以通过这个命令模式直接把按钮的灰色改成可用。

B.不管按钮状态直接触发表单提交

大家会说直接发请求是不是就行了,这是一种方法,但是如果涉及到协议加密或者有特殊令牌就麻烦了,所以这里仍然基于表单提交的方式来做。

直接调用表单提交即可。

所以这里再次强调一下所有客户端的内容都是不可靠的哪怕你做了JS混淆也可以通过Eval()函数执行,所以服务器端的校验是非常重要的,当然同样就算是服务器返回的内容也要做校验,避免被注入。

很多注入都是基于客户端及服务器端的校验方式及时序问题,所以小问题虽小,产生的影响会可能很大。

备注

文本没有使用框架,是为了让大家更好的知道原理,如果使用Vue或者Jquery类的框架,道理雷同。

TestOps|测试运维

精益流程 赋能技术

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多