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

J2EE数据验证的一些开发建议

阅读更多
说在前面:非原创。

输入数据验证:虽然为了用户的方便,可以提供“客户端”层数据的数据验证,但必须使用Servlet 在服务器层执行验证。 客户端验证本身就不安全,因为这些验证可轻易绕过,例如,通过禁用 Javascript。一份好的设计通常需要 Web 应用程序框架,以提供服务器端实用程序例程,从而验证以下内容:
  • [1] 必需字段;
  • [2] 字段数据类型(缺省情况下,所有 HTTP 请求参数都是“字符串”);
  • [3] 字段长度;
  • [4] 字段范围;
  • [5] 字段选项;
  • [6] 字段模式;
  • [7] cookie 值;
  • [8] HTTP 响应。

好的做法是将以上例程作为“验证器”实用程序类中的静态方法实现。以下部分描述验证器类的一个示例。
[1] 必需字段
  // Java example to validate required fields
  public Class Validator {
      ...
      public static boolean validateRequired(String value) {
          boolean isFieldValid = false;
          if (value != null && value.trim().length() > 0) {
              isFieldValid = true;
          }
          return isFieldValid;
      }
      ...
  }
  ...
  String fieldValue = request.getParameter("fieldName");
  if (Validator.validateRequired(f ieldValue)) {
      // fieldValue is valid, continue processing request
      ...
  }

[2] 输入的 Web 应用程序中的字段数据类型和输入参数欠佳。例如,所有 HTTP 请求参数或cookie值的类型都是“字符串”。开发者负责验证输入的数据类型是否正确。 使用Java基本包装程序类,来检查是否可将字段值安全地转换为所需的基本数据类型。
验证数字字段(int 类型)的方式的示例:
  // Java example to validate that a f ield is an int number
  public Class Validator {
      ...
      public static boolean validateInt(String value) {
          boolean isFieldValid = false;
          try {
              Integer.parseInt(value);
              isFieldValid = true;
          } catch (Exception e) {
              isFieldValid = false;
          }
          return isFieldValid;
      }
      ...
  }
  ...
  // check if the HTTP request parameter is of type int
  String f ieldValue = request.getParameter("f ieldName");
  if (Validator.validateInt(f ieldValue)) {
      // f ieldValue is valid, continue processing request
      ...
  }

好的做法是将所有HTTP请求参数转换为其各自的数据类型。例如,开发者应将请求参数的“integerValue”存储在请求属性中,并按以下示例所示来使用:
  // Example to convert the HTTP request parameter to a primitive wrapper data type
  // and store this value in a request attribute for further processing
  String f ieldValue = request.getParameter("f ieldName");
  if (Validator.validateInt(f ieldValue)) {
      // convert f ieldValue to an Integer
      Integer integerValue = Integer.getInteger(f ieldValue);
    // store integerValue in a request attribute
      request.setAttribute("f ieldName", integerValue);
  }
  ...
  / / Use the request attribute for further processing
  Integer integerValue = (Integer)request.getAttribute("f ieldName");
  ...

应用程序应处理的主要 Java 数据类型:
  • Byte
  • Short
  • Integer
  • Long
  • Float
  • Double
  • Date

[3] 字段长度“始终”确保输入参数(HTTP请求参数或cookie值)有最小长度和/或最大长度的限制。
以下示例验证 userName 字段的长度是否在 8 至 20 个字符之间:
  // Example to validate the f ield length
  public Class Validator {
      ...
      public static boolean validateLength(String value, int minLength, int maxLength) {
          String validatedValue = value;
          if (!validateRequired(value)) {
              validatedValue = "";
          }
          return (validatedValue.length() >= minLength &&
                      validatedValue.length() <= maxLength);
      }
      ...
  }
  ...
  String userName = request.getParameter("userName");
  if (Validator.validateRequired(userName)) {
      if (Validator.validateLength(userName, 8, 20)) {
          / / userName is valid, continue further processing
          ...
      }
  }

[4] 字段范围
始终确保输入参数是在由功能需求定义的范围内。
以下示例验证输入 numberOfChoices 是否在 10 至 20 之间:
  / / Example to validate the f ield range
  public Class Validator {
      ...
      public static boolean validateRange(int value, int min, int max) {
          return (value >= min && value <= max);
      }
      ...
  }
  ...
  String f ieldValue = request.getParameter("numberOfChoices");
if (Validator.validateRequired(f ieldValue)) {
      if (Validator.validateInt(f ieldValue)) {
          int numberOfChoices = Integer.parseInt(f ieldValue);
          if (Validator.validateRange(numberOfChoices, 10, 20)) {
              // numberOfChoices is valid, continue processing request
              ...
          }
      }
  }

[5] 字段选项 Web 应用程序通常会为用户显示一组可供选择的选项(例如,使用SELECT HTML 标记),但不能执行服务器端验证以确保选定的值是其中一个允许的选项。请记住,恶意用户能够轻易修改任何选项值。始终针对由功能需求定义的受允许的选项来验证选定的用户值。
以下示例验证用户针对允许的选项列表进行的选择:
  // Example to validate user selection against a list of options
  public Class Validator {
      ...
      public static boolean validateOption(Object[] options, Object value) {
          boolean isValidValue = false;
          try {
              List list = Arrays.asList(options);
              if (list != null) {
                  isValidValue = list.contains(value);
              }
          } catch (Exception e) {
          }
          return isValidValue;
      }
      ...
  }
  ...
  // Allowed options
  String[] options = {"option1", "option2", "option3");
  // Verify that the user selection is one of the allowed options
  String userSelection = request.getParameter("userSelection");
  if (Validator.validateOption(options, userSelection)) {
      // valid user selection, continue processing request
      ...
  }

[6] 字段模式
始终检查用户输入与由功能需求定义的模式是否匹配。例如,如果 userName 字段应仅允许字母数字字符,且不区分大小写,那么请使用以下正则表达式:^[a-zA-Z0-9]*$。
执行正则表达式验证的示例:
  // Example to validate that a given value matches a specif ied pattern
  // using the Java 1.4 regular expression package
  import java.util.regex.Pattern;
  import java.util.regexe.Matcher;
  public Class Validator {
      ...
      public static boolean matchPattern(String value, String expression) {
          boolean match = false;
          if (validateRequired(expression)) {
              match = Pattern.matches(expression, value);
          }
          return match;
      }
      ...
  }
  ...
  // Verify that the userName request parameter is alphanumeric
  String userName = request.getParameter("userName");
  if (Validator.matchPattern(userName, "^[a-zA-Z0-9]*$")) {
      / / userName is valid, continue processing request
      ...
  }

[7]cookie值使用javax.servlet.http.Cookie对象来验证cookie值。适用于cookie值的相同的验证规则(如上所述)取决于应用程序需求(如验证必需值、验证长度等)。
验证必需 cookie 值的示例:
  // Example to validate a required cookie value
  // First retrieve all available cookies submitted in the HTTP request
  Cookie[] cookies = request.getCookies();
  if (cookies != null) {
      // f ind the "user" cookie
      for (int i=0; i<cookies.length; ++i) {
          if (cookies[i].getName().equals("user")) {
              / / validate the cookie value
              if (Validator.validateRequired(cookies[i].getValue()) {
                  // valid cookie value, continue processing request
                  ...
              }
          }    
      }
  }

[8] HTTP 响应
[8-1] 过滤用户输入要保护应用程序免遭跨站点脚本编制的攻击,请通过将敏感字符转换为其对应的字符实体来清理 HTML。这些是 HTML 敏感字符:< > " ' % ; ) ( & +。
以下示例通过将敏感字符转换为其对应的字符实体,来过滤指定字符串:
  // Example to f ilter sensitive data to prevent cross-site scripting
  public Class Validator {
      ...
      public static String f ilter(String value) {
          if (value == null) {
              return null;
          }        
          StringBuf fer result = new StringBuf fer(value.length());
          for (int i=0; i<value.length(); ++i) {
              switch (value.charAt(i)) {
              case '<':
                  result.append("&lt;");
                  break;
              case '>':
                  result.append("&gt;");
                  break;
              case '"':
                  result.append("&quot;");
                  break;
              case '\'':
                  result.append("&#39;");
                  break;
              case '%':
                  result.append("&#37;");
                  break;
              case ';':
                  result.append("&#59;");
                  break;
              case '(':
                  result.append("&#40;");
                  break;
              case ')':
                  result.append("&#41;");
                  break;
              case '&':
                  result.append("&amp;");
                  break;
              case '+':
                  result.append("&#43;");
                  break;
              default:
                  result.append(value.charAt(i));
                  break;
          }        
          return result;
      }
      ...
  }
  ...
  // Filter the HTTP response using Validator.filter
  PrintWriter out = response.getWriter();
  // set output response
  out.write(Validator.filter(response));
  out.close();

Java Servlet API 2.3 引进了过滤器,它支持拦截和转换 HTTP 请求或响应。
以下示例使用 Validator.f ilter 来用“Servlet 过滤器”清理响应:
  // Example to f ilter all sensitive characters in the HTTP response using a Java Filter.
  // This example is for illustration purposes since it will f ilter all content in the response, including 
HTML tags!
  public class SensitiveCharsFilter implements Filter {
      ...
      public void doFilter(ServletRequest request,
                      ServletResponse response,
                      FilterChain chain)
              throws IOException, ServletException {
          PrintWriter out = response.getWriter();
          ResponseWrapper wrapper = new ResponseWrapper((HttpServletResponse)response);
          chain.doFilter(request, wrapper);
          CharArrayWriter caw = new CharArrayWriter();
          caw.write(Validator.f ilter(wrapper.toString()));
          response.setContentType("text/html");
          response.setContentLength(caw.toString().length());
          out.write(caw.toString());
          out.close();
      }
      ...
      public class CharResponseWrapper extends HttpServletResponseWrapper {
          private CharArrayWriter output;
          public String toString() {
              return output.toString();
          }
          public CharResponseWrapper(HttpServletResponse response){
              super(response);
              output = new CharArrayWriter();
          }
          public PrintWriter getWriter(){
              return new PrintWriter(output);
          }
      }
  }

[8-2] 保护cookie
在cookie中存储敏感数据时,确保使用Cookie.setSecure(布尔标志)在 HTTP 响应中设置cookie 的安全标志,以指导浏览器使用安全协议(如 HTTPS 或 SSL)发送cookie。
保护“用户”cookie 的示例:
  // Example to secure a cookie, i.e. instruct the browser to
  / / send the cookie using a secure protocol
  Cookie cookie = new Cookie("user", "sensitive");
  cookie.setSecure(true);
  response.addCookie(cookie);


全文结束,有问题的可以留言大家探讨。
分享到:
评论

相关推荐

    开发J2EE Web应用

    在IT领域,特别是软件开发行业中,Java 2 Platform, Enterprise Edition(简称J2EE)是一个极为重要的技术框架,专门用于构建可扩展、健壮的企业级Web应用。《Designing Enterprise Applications with the Java 2 ...

    《J2EE专业项目实例开发》源代码

    《J2EE专业项目实例开发》源代码是一个包含多个J2EE应用实例的资源集合,旨在帮助开发者深入了解和实践J2EE技术栈。这个压缩包可能涵盖了从基础的Servlet、JSP到高级的企业级框架如Spring、Hibernate和Struts等。...

    J2EE基础的校验demo

    总的来说,J2EE基础的校验demo是一个很好的起点,帮助初学者快速上手Java Web开发中的数据校验。它强调了验证的重要性,并提供了实用的代码示例,使得学习者能够将所学应用于实际项目中,提升应用程序的质量和用户...

    j2EE的简单web开发

    在J2EE(Java 2 Platform, Enterprise Edition)的web开发中,我们通常涉及到一系列的技术和工具,以构建高效、可扩展的企业级应用程序。这里我们将深入探讨标题和描述中提到的一些关键知识点,包括EL(Expression ...

    J2ee企业级开发考试大纲

    J2EE企业级开发考试大纲详细涵盖了J2EE开发中的关键技术和知识点,旨在测试学生对这一领域的理解和应用能力。以下是大纲中涉及的主要内容: 1. **Struts框架技术**:Struts是Java Web开发中常用的MVC框架。考生需要...

    J2EE和数据分析实践分享-V0.2.pptx

    ### J2EE与数据分析实践知识点概述 #### 一、J2EE基础知识 - **定义**:J2EE(Java 2 Platform, Enterprise Edition)是一种基于Java的平台标准,用于开发可移植、健壮、安全、多用户访问和多平台部署的企业级应用...

    简易快速j2ee开发GIS数据建库基本思想

    在进行J2EE开发以构建GIS(地理信息系统)数据建库系统时,我们需要理解几个核心概念和技术要点。本文将深入探讨简易快速J2EE开发GIS数据建库的基本思想。 首先,J2EE(Java 2 Platform, Enterprise Edition)是...

    j2ee开发完整代码

    《J2EE开发完整代码详解》 在软件开发领域,J2EE(Java 2 Platform, Enterprise Edition)作为企业级应用开发的主流平台,一直以来都备受开发者们的青睐。本项目提供了一个完整的J2EE开发实例,包括了数据库设计与...

    快速开发J2EE应用方案

    本文档主要针对快速开发J2EE应用提供了详细的指导和建议,内容覆盖了架构描述、命名规范、编码规范以及编程步骤等方面,旨在帮助开发者减少重复性劳动,提高开发效率,并确保软件质量。 #### 二、技术平台架构及...

    j2ee电子商务系统开发从入门到精通

    ### J2EE电子商务系统开发从入门到精通 #### 一、J2EE概论 - **双层(C/S)软件架构设计**:早期的客户端/服务器架构将应用程序分为两个部分,一部分安装在客户端计算机上,另一部分安装在服务器端。这种架构下,...

    《j2ee专业项目实例开发》源代码

    《J2EE专业项目实例开发》源代码是一个涵盖了多个实际应用场景的综合性学习资源,主要针对J2EE(Java 2 Enterprise Edition)平台进行深入实践。这个压缩包包含了由三位专业人士精心设计并编写的三个项目,旨在帮助...

    J2EE 专业项目实例开发

    《J2EE专业项目实例开发》是一本专为IT专业人士准备的实践指南,它深入浅出地探讨了J2EE(Java 2 Platform, Enterprise Edition)在实际项目中的应用。这本书采用PDG格式,旨在通过丰富的实例讲解,帮助读者更好地...

    J2EE企业级项目开发-3期(KC007) 8.2 Struts之数据校验与国际化文档.doc

    Struts2作为一款强大的MVC框架,被广泛应用于J2EE企业级项目开发中,尤其在数据校验和国际化方面提供了高效便捷的支持。本节主要探讨Struts2在数据校验和国际化实施上的核心概念和技术。 首先,让我们回顾一下...

    J2EE小型项目开发代码以及数据库

    【标题】"J2EE小型项目开发代码以及数据库"揭示了这个压缩包是关于使用Java企业版(J2EE)进行小型项目开发的实际代码实例和相关的数据库设计。J2EE是一个用于构建分布式、多层的企业级应用程序的平台,它包含了各种...

    基于Hibernate和Struts的J2EE应用开发 PDF

    ### 基于Hibernate和Struts的J2EE应用开发 #### 一、引言 随着Java技术的逐渐成熟与...通过这种方式,开发人员可以更高效地开发出具有良好扩展性和维护性的J2EE应用,同时减少了传统J2EE开发中的一些复杂性和挑战。

    J2EE专业项目实例开发

    在IT行业中,J2EE(Java 2 Platform, Enterprise Edition)是一个重要的企业级应用开发平台,它由Oracle公司提供,用于构建分布式、多层的、安全的、高性能的企业级应用程序。J2EE主要包含了Web组件、EJB...

    J2EE电子商务系统开发从入门到精通

    ### J2EE电子商务系统开发从入门到精通 #### 第1章 J2EE概论 **1.1 简单双层架构到复杂多层架构** - **1.1.1 双层(C/S)软件架构设计** - C/S架构即客户端/服务器架构,是一种传统的软件架构方式。在这种架构中...

    j2ee开发全程的实录

    在IT行业中,J2EE(Java 2 Platform, Enterprise Edition)是用于构建企业级应用程序的框架,它由Oracle公司提供并被广泛应用于大型分布式系统、Web应用和后端服务的开发。本实录将深入探讨J2EE开发的全过程,包括但...

    《J2EE架构与应用开发》大作业报告-电影售票系统

    《J2EE架构与应用开发》大作业报告的焦点是一个名为“宁海电影城网上售票管理系统”的项目,这个系统旨在为用户提供便捷的在线购票服务。报告涵盖了从项目概述到详细设计,再到测试的全过程,体现了J2EE技术在实际...

Global site tag (gtag.js) - Google Analytics