前言:
今天发版走到了外部测试,也可以叫它准生产测试阶段。这个阶段里的功能测试提了一个bug:在后台的系统配置菜单里做插入操作时,输入框中输入得是null,然后显示保存成功,但是展示时是:¥qtnull¥qt(这个¥是$,因为这个符号连续两次出现,在编辑器里会被识别为斜体,所以使用¥代替)。前端输入的是null,后端怎么就变成这个了呢?
问题排查过程
1.看表象是XSS惹得祸
根据描述,很容易就会想到是特殊字符后台XSS对它进行了过滤拦截。然后笔者进行了一番测试,发现正是XSS中的问题,但是测试人员输入的是null,到后台应该是“null”,这个是不会被过滤的。但是从展示效果看,肯定不是这样,然后笔者自己测试了下发现一顿操作后“null”变成了"“null”",然后XSS发现有引号,这是属于过滤范畴就将引号替换成了¥qt(这个替换内容是自己定义的)。那究竟是谁作了这个骚操作呢,将"null"变成了"“null”",然后触发了XSS的过滤呢?
2.罪魁祸首
罪魁祸首就是这行代码惹的祸:
JSONObject jsonObject = JSONObject.fromObject(params);
解释下,params这个是一个json字符串。这行代码是将json字符串转化为JSONObject对象。在这里就将“null”变成了"“null”"。也是狗血,这个JSONObject是一个引入的工具类就是net.sf.json包下的。最后就发现了是这个工具类的问题。那只有null有这种情况吗,其他有没有。
3.测试其他场景
因为页面插入输入的是null,所以导致了该问题,但笔者再使用test、null1、1null测试后发现均没有此问题,最后得出结论,这个是net.sf.json.JSONObject工具类的坑,且该坑只有是null时才会出现,其他场景是没有问题的。但是该工具类其他使用场景应用,笔者目前没有发现过问题,也都挺好用,瑕不掩瑜吧。
总结
这个是一个工具类使用产生的问题,所以日常开发中还是应该多测试些场景,不可轻信外部的工具类,像net.sf.json.JSONObject还是使用较为广泛的一个,依然还会存在一些问题。