自定义EL函数防止HTML注入

来源:互联网 发布:网络大专可以做人事吗 编辑:程序博客网 时间:2024/06/14 17:47

我们先来看看没有自定义EL函数时是怎么HTML注入的。

首先,我们定义一个jsp页面用于搜集用户提交的表单数据

<form action="ResultServlet" method="post">用户名:<input type="text" name="username"><br><br>留言:     <textarea rows="6" cols="100" name="message"></textarea><br><input type="submit" value="提交"></form>

我们让表单数据提交给ResultServlet来处理,所以我们定义一个servlet来处理数据

import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ResultServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("UTF-8");String name=request.getParameter("username");//获取usernameString message=request.getParameter("message");//获取mesagerequest.setAttribute("name",name);request.setAttribute("message",message);request.getRequestDispatcher("/result.jsp").forward(request,response);//请求转发,给result.jsp显示处理的结果}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request,response);}}

EL表达式显示处理后的数据
<body>用户名:${caorui:filter(name)}<br>留言内容:${caorui:filter(message)}</body>

现在,我们可以来测试数据了,一起来看看结果:






很不幸,我们被HTML注入成功了( ▼-▼ )


-------------------------------------------------------------------------------------------我是分割线-------------------------------------------------------------------------------------------------------------


作为一个合格的javaweb程序员,我们应该要解决这个问题。一般情况下,自定义EL函数,可以防止HTML注入(当然,还有更好的办法)。
现在,我们来解决这个BUG。


第一步,开发我们自己的EL函数,这个函数的所属类必须定义为public,函数本身必须为public  static。这个函数的功能是实现HTML编码转换防止注入

public class HTMLFilter {public static String filter(String message){if(message==null){return null;}char content[]=new char[message.length()];message.getChars(0,message.length(),content,0);StringBuffer result=new StringBuffer(content.length+50);for(int i=0;i<content.length;i++){switch(content[i]){case '<':result.append("<");break;case '>':result.append(">");break;case '&':result.append("&");break;case '"':result.append(""");default:result.append(content[i]);}}return (result.toString());}}

我们要让EL函数可以调用这个static方法,此时我们应该在tld(标签库描述符)文件中注册自定义函数,将这个函数映射成EL自定义函数。这个文件可以放到WEB-INF目录下。

<?xml version="1.0" encoding="UTF-8" ?>  <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"      version="2.0">      <tlib-version>1.0</tlib-version>      <jsp-version>2.0</jsp-version>      <short-name>function</short-name>      <uri>http://www.baidu.com</uri>    <function>          <name>filter</name>          <function-class>packge01.HTMLFilter</function-class>          <function-signature>java.lang.String filter(java.lang.String)</function-signature>      </function>  </taglib>  


最后,我们可以在显示的jsp页面中使用自定义EL函数

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib prefix="caorui" uri="http://www.baidu.com" %><html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Insert title here</title></head><body>用户名:${caorui:filter(name)}<br>留言内容:${caorui:filter(message)}</body></html>

再来看看执行效果



ok,到此为止我们成功了!

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 绿能电动车坏了怎么办? 永久单车收不到验证码怎么办 24速山地车档乱了怎么办 新电瓶车被偷了怎么办 汽车前风挡玻璃砸出洞怎么办 凯迪拉克xt5钥匙掉了怎么办 凯迪拉克xt5媒体不好用怎么办 晒黄的白鞋怎么办 白鞋子被晒黄了怎么办? 耐克空军一号白色发黄怎么办 空军一号破皮了怎么办 匡威鞋帆布破了怎么办 脚腕起疙瘩很痒怎么办 跑步后脚踝微疼怎么办 跑步跑得脚疼怎么办 nike air 鞋头脱胶怎么办 耐克空军一号磨脚怎么办 白鞋刷完变黄了怎么办 乔丹气垫坏了怎么办 气垫鞋气垫坏了怎么办 建行u盾忘记密码怎么办 工商银行u盾忘记密码怎么办 民生银行不给u盾怎么办 银行不给开u盾怎么办 有车有空想赚点外快怎么办 车被注册了滴滴怎么办 快手号手机丢了怎么办 手机号码不停收到验证码怎么办 手机网页滑动自动跳到最下面怎么办 网页一打开就跳至评论怎么办? 百度总出现重复的网页怎么办 苹果7一直处于系统升级页面怎么办 手机看百度文章总是跳转怎么办 美度舵手滑丝怎么办 小区房产证办不下来怎么办 美海军陆战队进驻台湾大陆怎么办? 束脚裤带子怎么办系 眼角弄伤了应该怎么办 浴盆下水盖坏了怎么办 冒险岛勋章多了怎么办 玉手镯取不下来怎么办?终极绝招!