自定义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>
<%@ 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
- 自定义EL函数防止HTML注入
- php防止sql注入的自定义函数
- 防止html注入
- 如何防止html注入
- 防止sql注入函数
- JAVA防止JS html 注入
- YII 防止自定义sql注入
- 如何自定义EL函数
- EL自定义函数
- el自定义函数
- JSP自定义EL函数
- EL自定义函数
- 自定义EL函数
- EL表达式-自定义函数
- EL表达式-自定义函数
- 自定义el函数
- EL自定义函数
- 自定义EL函数
- socket server 服务端 带计算心跳。超时断链的控制
- block,inline和inline-block概念和区别
- 第五周项目1-三角形类的雏形(5)
- 封装
- 确定两个字符串通过重新排序是否可以相同的算法
- 自定义EL函数防止HTML注入
- C++第3次实验(基础班)—选择结构程序设计
- strcpy 和 memcpy 用法的区别
- 设计模式4#值对象
- DuiLib(6)——界面管家CPaintManagerUI的函数简介
- 第三周项目四(7)-谁是小偷
- Step by Step into Spring (AOP)
- sockt练习-文本聊天c/s实现
- HDU 1698 Just a Hook(线段树的区间更新)