web开发中的常见漏洞,一般都发生在这些输入框中,一般情况我们会对这些输入域进行客户端的校验和服务器端的校验,但是在客户端的校验基本上起不来什么作用,因为客户端的所有代码我们都可以进行更改,防止漏洞的发生还是需要服务器端的校验,但是一般服务器端的校验都是校验你输入的字符或者是数字的长度等等。下面就演示一个XSS的漏洞注入,JSP页面中有两个输入框,姓名和个人介绍。当我们写入姓名和个人介绍之后,后台代码的处理就是进行一个简单的转发,然后把我们刚才的信息转发到一个jsp页面进行显示。
如果我们在个人介绍写上<script>document.location.href=‘http://www.baidu.com‘</script>,那么提交之就跳转到百度了,如果跳转到xxoo网站呢,这不就坏事了嘛。
我们需要自己在后台对这些特殊的字符进行转码,当这些字符再次显示到页面的时候不执行脚本。
使用什么样的方法才能阻止这种情况的发生,就是对 HTML 中的预留字符替换为字符实体 ,例如:对< 进行替换成 <,对>替换成> 等等。在这里把我们的代码进行一下完善防止XSS的出现:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String describe = req.getParameter("describe"); if(username == null || describe == null){ username ="aaaa"; describe="helloworld<script>alert(‘hello world‘);</script>"; } //HTML 中的预留字符必须被替换为字符实体 username = StringEscapeUtils.escapeHtml4(username); describe = StringEscapeUtils.escapeHtml4(describe); System.out.println(username +" : "+ describe); req.setAttribute("username", username); req.setAttribute("describe", describe); req.getRequestDispatcher("/info.jsp").forward(req, resp); }
这样我们就可以简单的防止XSS夸脚本攻击,代码中的 StringEscapeUtils是apache common-lang 包下的一个工具类,这个工具类也可以对sql中的保留字符进行转换,同时我们自己也可以自己实现一个对html中的预留字进行替换的程序。在后台打印的describe的字符已经被替换为:
helloworld<script>alert(‘hello world‘);</script> 把这些内容显示在html中是不会执行javascript脚本的。
时间: 2024-10-12 22:05:56