java 安全验证方法

输入数据验证:虽然为方便用户而在客户端层上提供数据验证,但仍必须使用 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(fieldValue)) {

// fieldValue is valid, continue processing request

...

}

[2] 输入的 Web 应用程序中的字段数据类型和输入参数欠佳。例如,所有 HTTP 请求参数或 cookie 值的类型都是“字符串”。开发者负责验证输入的数据

2014/5/30 353

类型是否正确。使用 Java 基本包装程序类,来检查是否可将字段值安全地转换为所需的基本数据类型。

验证数字字段(int 类型)的方式的示例:

// Java example to validate that a field 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 fieldValue = request.getParameter("fieldName");

if (Validator.validateInt(fieldValue)) {

// fieldValue 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 fieldValue = request.getParameter("fieldName");

if (Validator.validateInt(fieldValue)) {

// convert fieldValue to an Integer

Integer integerValue = Integer.getInteger(fieldValue);

// store integerValue in a request attribute

request.setAttribute("fieldName", integerValue);

}

...

// Use the request attribute for further processing

Integer integerValue = (Integer)request.getAttribute("fieldName");

...

应用程序应处理的主要 Java 数据类型:

Byte

Short

Integer

Long

Float

Double

Date

[3] 字段长度“始终”确保输入参数(HTTP 请求参数或 cookie 值)有最小长度和/或最大长度的限制。以下示例验证 userName 字段的长度是否在 8 至 20

个字符之间:

// Example to validate the field 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);

}

...

}

2014/5/30 354

...

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 field range

public Class Validator {

...

public static boolean validateRange(int value, int min, int max) {

return (value >= min && value <= max);

}

...

}

...

String fieldValue = request.getParameter("numberOfChoices");

if (Validator.validateRequired(fieldValue)) {

if (Validator.validateInt(fieldValue)) {

int numberOfChoices = Integer.parseInt(fieldValue);

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 字段应仅允许字母数字字符,且不区分大小写,那么请使用以下正则表达

式:^[azAZ09]*$

2014/5/30 355

Java 1.3 或更早的版本不包含任何正则表达式包。建议将“Apache 正则表达式包”(请参阅以下“资源”)与 Java 1.3 一起使用,以解决该缺乏支持的问

题。执行正则表达式验证的示例:

// Example to validate that a given value matches a specified pattern

// using the Apache regular expression package

import org.apache.regexp.RE;

import org.apache.regexp.RESyntaxException;

public Class Validator {

...

public static boolean matchPattern(String value, String expression) {

boolean match = false;

if (validateRequired(expression)) {

RE r = new RE(expression);

match = r.match(value);

}

return match;

}

...

}

...

// Verify that the userName request parameter is alpha-numeric

String userName = request.getParameter("userName");

if (Validator.matchPattern(userName, "^[a-zA-Z0-9]*$")) {

// userName is valid, continue processing request

...

}

Java 1.4 引进了一种新的正则表达式包(java.util.regex)。以下是使用新的 Java 1.4 正则表达式包的 Validator.matchPattern 修订版:

// Example to validate that a given value matches a specified 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;

}

...

}

[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) {

// find 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

...

}

}

}

}

2014/5/30 356

[8] HTTP 响应

[81]

过滤用户输入要保护应用程序免遭跨站点脚本编制的攻击,请通过将敏感字符转换为其对应的字符实体来清理 HTML。这些是 HTML 敏感字符:<

> " ‘ % ) ( & +

以下示例通过将敏感字符转换为其对应的字符实体来过滤指定字符串:

// Example to filter sensitive data to prevent cross-site scripting

public Class Validator {

...

public static String filter(String value) {

if (value == null) {

return null;

}

StringBuffer result = new StringBuffer(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("'");

break;

case ‘%‘:

result.append("%");

break;

case ‘;‘:

result.append(";");

break;

case ‘(‘:

result.append("(");

break;

case ‘)‘:

result.append(")");

break;

case ‘&‘:

result.append("&amp;");

break;

case ‘+‘:

result.append("+");

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.filter 来用“Servlet 过滤器”清理响应:

// Example to filter all sensitive characters in the HTTP response using a Java Filter.

// This example is for illustration purposes since it will filter 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);

2014/5/30 357

chain.doFilter(request, wrapper);

CharArrayWriter caw = new CharArrayWriter();

caw.write(Validator.filter(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);

}

}

}

}

[82]

保护 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);

推荐

java 安全验证方法,布布扣,bubuko.com

时间: 2024-10-24 12:30:56

java 安全验证方法的相关文章

Java连接MySQL数据库实现用户名密码的验证方法 Java语句中sql查询语句&#39;&#39; &quot;&quot;作用

//方法一,可以验证登录,但方法不实用.package com.swift; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; public class Logi

java 常用的验证方法帮助类

import java.text.ParseException; import java.util.Collection; import java.util.Map; /** * 常用的验证方法帮助类,提供对字符串,集合,数组,数值的验证 * * */ public class ValidateHelper { /** * 判断一个字符串是否不是一个空字符串 * * @param s 要判断的字符串 * @return 如果不为空返回true,否则返回false */ public static

[转帖] 分享一个java正则验证类

原址:http://blog.csdn.net/jarvis_java/article/details/5949096 package com.tool.util; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * * @author Jarvis * 90%的验证都调用了Regular方法 但是本类也可删除大部分方法 涉及到正则的判断都直接穿参数和正则表达式 * 但是为了方便业务类调用和有更直观的含义 建

jQuery Validate扩展验证方法

/***************************************************************** jQuery Validate扩展验证方法 (linjq) *****************************************************************/ $(function(){ // 判断整数value是否等于0 jQuery.validator.addMethod("isIntEqZero", functio

基于本体的语义信息模型的验证方法

一.先简单说说整个的一个需求吧 广义的配电管理系统(DMS)涵盖配电网生产.运行和服务全过程,是整个电力企业信息集成系统的一个有机组成部分.DMS 包含着大量应用系统,由于现在配网一体化和智能化发展的要求,需要这些应用系统之间能够相互的进行数据交换(实现系统间的互操作如下图),但这些大量的系统由于开发时间和功能的不一致,造成了这些系统和相应的数据库采用了不同的接口标准和模型,相对独立,不可避免的造成信息重叠和"信息孤岛",无法实现全局范围内的信息交互和信息共享. 目前,整个电网对此的解

【转】封装jQuery Validate扩展验证方法

本文转自:http://www.cnblogs.com/linjiqin/p/3433635.html 一.封装自定义验证方法-validate-methods.js /***************************************************************** jQuery Validate扩展验证方法 (linjq) *****************************************************************/ $(

Java获取路径方法&amp;相对路径读取xml文件方法

Java获取路径方法&相对路径读取xml文件方法 (1).request.getRealPath("/");//不推荐使用获取工程的根路径 (2).request.getRealPath(request.getRequestURI());//获取jsp的路径,这个方法比较好用,可以直接在servlet和jsp中使用 (3).request.getSession().getServletContext().getRealPath("/");//获取工程的根路径

封装jQuery Validate扩展验证方法

一.封装自定义验证方法-validate-methods.js /***************************************************************** jQuery Validate扩展验证方法 (linjq) *****************************************************************/ $(function(){ // 判断整数value是否等于0 jQuery.validator.addMe

09 Java相等判断方法

JavaSE 基础之九 09 Java相等判断方法 1. ( == )   ( == )比较的是对象值,如果是地址,比较两个地址是否相等. 2. equals()方法   equals()也默认与( == )一样比较地址,但是每个类都继承了object,每个类都可以重写equals(), 你可以自己实现比较的逻辑,比如比较对象的所有属性和方法是否相等.  String类重写equals(),比较两者的每个字符是否相同. 3. equals()方法 与hashcode方法比较 效率对比   1.