前言
本人博客园:https://www.cnblogs.com/lzj523/
本文博客园原文章:https://www.cnblogs.com/lzj523/p/14283076.html
今天因解决漏洞而更新了Tomcat,运行网站就报错
类型 异常报告
消息 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义
描述 由于被认为是客户端对错误(例如:畸形的请求语法、无效的请求信息帧或者虚拟的请求路由),服务器无法或不会处理当前请求。
例外情况
java.lang.IllegalArgumentException: 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义
如图所示:
可能的原因是超链接带了特殊字符或中文
第一部分 因超链接参数带中文而报错
通过脚本来将href超链接传递的参数转换为from表单提交
function linkClick(linkObject) {var formObject = document.createElement('form');document.body.appendChild(formObject);formObject.setAttribute('method', 'post');var url = linkObject.href;var uri = '';var i = url.indexOf('?');if(i == -1) {formObject.action = url;
} else {formObject.action = url.substring(0, i);}if( i >= 0 && url.length >= i + 1) {uri = url.substring(i + 1, url.length);}var sa = uri.split('&');for(var i = 0; i < sa.length; i++) {var isa = sa[i].split('=');var inputObject = document.createElement('input');inputObject.setAttribute('type', 'hidden');inputObject.setAttribute('name', isa[0]);inputObject.setAttribute('value', isa[1]);formObject.appendChild(inputObject);}formObject.submit();return false;
}
<a href='/Servlet?name=中文' onclick="return linkClick(this)">超链接</a>
参考文章:https://blog.csdn.net/weixin_45986454/article/details/107950262?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.control
注:部分浏览器若传参出现urlencode编码,且不想出现这个编码时
将
27 inputObject.setAttribute('value', isa[1]);
改为
inputObject.setAttribute('value', decodeURIComponent(isa[1]));
或
java解码
java.net.URLDecoder.decode(mytext,“utf-8”)
第二部分 超链接参数带特殊字符而报错
参数中可能包含了 |{}[],% 等一些特殊字符
修改Tomcat的server.xml文件
向server.xml 中Connector添加
relaxedPathChars="|{}[],%" relaxedQueryChars="|{}[],%"
例如:(参数里有哪些特殊字符,就加哪些)
<Connector port="80" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" relaxedPathChars="|{}[],%" relaxedQueryChars="|{}[],%"/>
参考文章:https://blog.csdn.net/qq_39089749/article/details/108726996
结语:
记得对传递参数进行过滤,防止他人插入脚本代码