`
ycyk_168
  • 浏览: 100281 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

运用装饰模式截取用户输入构建通用验证

阅读更多

 在系统开发中,与用户交互的地方,例如表单输入,浏览器URL传参都是系统安全的敏感地带。传统的客户端JavaScript验证只能挡君子而不能拦小人,因为用户一旦将JS禁用,我们就无能为力。于是人们说最安全的方式还是在服务器端验证。但是这种最安全的方式却是很麻烦的做法!因为我们无法只单单的在服务器端验证,我们还需要做客户端传统验证,这样一来同一套验证,客户端一次,服务器端一次,暂且不考虑执行的效率,单单是开发的效率就很让人抓狂了!尤其是对URL传参的验证,难道我们对每一个URL传递参数的地方都必须写一堆的验证代码吗?
 如果有这样一种方法能够通过一个过滤器能够一次性的拦截获取所有的用户输入,那么我们就可以只通过这个过滤器来做基础的安全性验证,例如我们可以过滤SQL语句,过滤非安全字符等等,而把业务规则验证留给程序员去实现,就将大大的加快开发效率,同时也可以构建一个通用的用户输入验证框架,减少与程序的紧耦合!
 例如我们将所有用户输入中的"<"改为"&lt;",将所有的">"改为"&gt;"
 本文试图寻找一种方法来解决这个问题!
 
 关于对装饰模式的具体说明,可以自行Google一下,或者可以查看此文:装饰Servlet Request对象,建议想了解原理的读者先阅读一下这篇文章!
 首先我们创建一个filter,让它可以拦截所有的请求!

 <filter>
  <filter-name>userInputFilter</filter-name>
  <filter-class>
   com.djwl.core.security.UserInputFilter
  </filter-class>
 </filter>
 <filter-mapping>
  <filter-name>userInputFilter</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

 

package com.djwl.core.security;

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

/** *//**
 * 功能描述:过滤用户输入的危险字符,及SQL语句<BR>
 * @author 杨凯 <BR>
 * 时间:Jun 9, 2009 1:22:03 PM <BR>
 */
public class UserInputFilter implements javax.servlet.Filter {

    public void destroy() {
        
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        request.setCharacterEncoding("gbk");
        
        //重点是这句,该处我们运用装饰模式构建一个自己的ServletRequest类
        chain.doFilter(new UserInputFilterHttpServletRequestWrapper(request), servletResponse);
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        
    }

}

 

package com.djwl.core.security;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import com.djwl.core.utils.V;

public final class UserInputFilterHttpServletRequestWrapper extends HttpServletRequestWrapper {

    public final static Map characterMap = new HashMap();
    
    //对于一些我们不想让该类验证的值,例如我使用Tapestry开发,那么这些Tapestry框架自己的东西,我们忽略掉!
    static{
        characterMap.put("formids", "");
        characterMap.put("seedids", "");
        characterMap.put("submitmode", "");
        characterMap.put("sp", "");
        
    }
    
    //构造函数
    public UserInputFilterHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
    }
    
    //验证从页面上提取单个值的情况,包括URL传参
    @Override
    public String getParameter(String name) {
        return  V.validate(super.getParameter(name));
    }
    
    //验证从页面上一次性获取多个值的情况
    @Override
    public String[] getParameterValues(String name) {
        //忽略一些我们的设定
        if (characterMap.containsKey(name)) {
            return super.getParameterValues(name);
        }
        String[] userinputs = super.getParameterValues(name);
        if (userinputs == null) {
            return null;
        }
        //逐一判断
        String[] results = new String[userinputs.length];
        int i=0;
        for (String string : userinputs) {
            results[i] = V.validate(string);
            i++;
        }
        return results;      
    }
}

 

package com.djwl.core.utils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;

import com.djwl.core.MisException;

public class V {
    
    /** *//**
     * 功能描述:改变用户输入<BR>
     * @param str
     * @return
     * @author:杨凯<BR>
     * 时间:Nov 24, 2009 12:07:57 PM<BR>
     */
    private static String escape(String str){
//        str = StringEscapeUtils.escapeSql(str);
//        str = StringEscapeUtils.escapeHtml(str);
//        //str = StringEscapeUtils.escapeJavaScript(str);
//        str = str.replaceAll("#", "");
        str = str.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
        str = str.replaceAll("\r\n", "<BR>");
        str = str.replaceAll("null", " ");
        return str;
    }
    
    /** *//**
     * 功能描述:截取危险字符<BR>
     * @param str
     * @return
     * @author:杨凯<BR>
     * 时间:Nov 24, 2009 12:08:08 PM<BR>
     */
    private static Boolean contains(String str){
        //这里我们可以根据自己的逻辑,编写适当的正则表达式判断
        String regexp = "\\b(drop|delete|update|insert|select|call|exec|set|declare|script|link)\\b";
        Matcher matcher = Pattern.compile(regexp).matcher(str.toLowerCase());
        if (matcher.find()) {
            throw new MisException("用户输入中含有非法字符");
        } else {
            return true;
        }
    }
    
    /** *//**
     * 功能描述:验证字符串<BR>
     * @param str
     * @return
     * @author:杨凯<BR>
     * 时间:Jun 9, 2009 5:09:31 PM<BR>
     */
    public static String validate(String str){
        if (StringUtils.isNotBlank(str) && contains(str)) {
            return escape(str);
        }
        return null;
    }
    
    
}

      需要说明的一点是,如果表单中有文件上传的控件,意思是说如果from标签中enctype="multipart/form-data" ,则该过滤器如果获取用户输入,需要自行验证,当然一个系统中有文件上传的地方毕竟不多!所以造成的麻烦是很小的!

0
1
分享到:
评论

相关推荐

    23种设计模式

    这些模式总结了在实践中被广泛验证并认可的最佳实践,能够提升代码的可读性、可维护性和可扩展性。 在设计模式中,我们可以将其分为三类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)和...

    Asp借助Flash实现头像截取功能

    至于"common"文件夹,可能包含了通用的样式表(CSS)、JavaScript文件或者其他的公共资源,它们被用来支持整个上传和截取头像流程的用户体验。 总结来说,这个Asp+Flash的头像截取功能,通过Flash提供图形界面供...

    ios-身份证验证.zip

    在iOS开发中,身份证验证是一项重要的功能,...通过上述技术,开发者可以构建一个安全、高效的身份验证流程。在实际应用中,应根据项目需求选择合适的验证方式,同时注重用户体验和数据安全性,以打造高质量的iOS应用。

    基于asp.net+sql的通用作业批改系统毕业设计与实现(源代码+项目报告).zip

    ASP.NET提供了身份验证和授权机制,可以确保只有经过验证的用户(如教师)才能访问和操作作业数据。同时,通过HTTPS协议加密传输数据,防止敏感信息被截取。 此外,系统可能还涉及到错误处理和日志记录,以追踪和...

    uchome 通用方法汇

    根据提供的文件信息,本文将对“uchome 通用方法汇”这一主题进行深入解析,并尝试提炼出相关的IT知识点。 ### uchome 通用方法汇概述 #### 一、uchome项目简介 uchome是一个开源的社区系统,它主要用于构建在线...

    Selenium4 PO设计模式源码

    在IT行业中,设计模式是一种通用解决方案的模板,用于解决软件设计中经常遇到的问题。Selenium 4 是一个广泛使用的Web应用程序自动化测试框架,它允许开发者编写脚本来模拟用户与网页的交互。本项目是一个基于...

    本资源里面有很多通用的代码,比如软换汇率等等

    1. **控件封装**:ASP.NET中的用户控件和自定义控件可以封装常用功能,如数据展示、表单验证等,方便在多个页面中重复使用。 2. **数据访问**:ADO.NET或Entity Framework等数据访问技术可以用于与数据库交互,编写...

    java开发通用帮助类

    这些方法在处理用户输入、生成日志或构建查询语句时非常实用。 2. **日期时间**:帮助类可能会包含处理日期和时间的方法,如获取当前时间、格式化日期、计算两个日期之间的差值等。Java 8引入的`java.time`包提供了...

    C# .Net 较完美随机验证码通用类

    9. **验证过程**:用户输入验证码后,服务器端需要验证输入是否与生成的验证码匹配。若匹配则通过验证,否则提示错误。 10. **安全性考虑**:验证码的有效期应有限制,以防止恶意用户反复尝试。此外,应避免在...

    简单有趣的后台登录页面模板

    在设计和实现一个后台登录页面时,我们关注的焦点通常是用户体验、安全性以及界面的美观性。"简单有趣的后台登录页面模板"就是一个集这些特点于一身的设计案例。它旨在为用户提供一个既直观又有趣的登录体验,同时...

    基于Eclipse+Tomca的在线通讯录的开发

    ActionForm用于接收和验证用户输入,ActionServlet处理请求,Action类执行业务逻辑,ActionMapping指示请求如何映射到Action类。 此外,我们还需要创建对应的JSP页面来展示视图,使用Struts提供的标签库来简化页面...

    smtp.rar_SMTP客户端_email发送客户端_mysmtp.exe

    1. 用户界面:提供一个友好的图形用户界面(GUI),让用户输入发送邮件所需的必要信息,如发件人地址、收件人地址、邮件主题和内容。 2. 邮件构造:根据用户输入构建符合SMTP格式的邮件消息,这通常涉及将文本、...

    dede常见函数参考类

    12. `GetCkVdValue()`:获取验证码的值,用于验证用户输入的有效性,防止自动化攻击。 13. `HtmlReplace()`:对用户输入的文本进行HTML过滤,可选择性地替换或移除HTML标签,以保护网站安全。 14. `GetTags()`:...

    DotNet.Utilities.zip

    在Web开发中,表单验证是必不可少的一环,用于确保用户输入的数据符合预期格式和规则。这个类库可能包含了一些常见的验证方法,如非空验证、邮箱格式验证、电话号码验证等,可以轻松集成到ASP.NET MVC或Web Forms...

    thinksns常用手册

    验证码对于验证用户身份和防止自动脚本攻击至关重要。 5. **byte_format()**:此函数将字节数转换为更易读的格式,如KB、MB、GB或TB,这对于显示文件大小或内存占用量非常实用。 6. **is_utf8()**:检查一个字符串...

    使用Microsoft.NET的企业解决方案模式

    - **第1章:企业解决方案的构建模式**:介绍模式的基本概念,以及如何利用模式来记录和传播经过验证的设计策略。 - **第2章:组织模式**:探讨模式如何在不同的抽象层次和领域之间发挥作用,以及如何有效地组织模式...

    网页版QQ在线聊天系统

    【网页版QQ在线聊天系统】是一个基于ASP技术构建的在线实时通信平台,允许用户通过网页进行即时消息交流,类似于我们熟知的PC版QQ。在互联网早期,这种网页版的聊天系统为不能安装桌面客户端或者在公共设备上使用QQ...

    nfctoollite for bb10

    2. **代码结构**:源代码可能包括处理NFC事件的类、解析和构建NDEF消息的函数,以及用户界面组件来显示和接收用户输入。 3. **学习价值**:开发者可以从nfctoollite中学习如何初始化NFC控制器、注册事件监听器、处理...

    帝国CMS整合DiscuzX1.5通行证

    总的来说,"帝国CMS整合DiscuzX1.5通行证"是一项涉及到多系统协作的技术任务,通过PHP编程和API接口设计,实现了用户账号的跨平台通用,提升了用户体验,同时也为开发者提供了更灵活的网站构建方案。对于想要学习和...

    PHP开发高可用高安全App后端

    1. **输入验证**:对所有用户提交的数据进行严格的验证和过滤,防止SQL注入、XSS攻击等常见的安全威胁。 2. **权限控制**:根据用户角色分配不同的操作权限,限制敏感数据的访问范围,确保数据的安全性和完整性。 ...

Global site tag (gtag.js) - Google Analytics