- 浏览: 25909 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
cevin15:
jak&jin 写道 学习了,小强写的文章很不错~~ ...
使用过滤器Filter解决tomcat默认编码配置下的传值乱码 -
jak&jin:
学习了,小强写的文章很不错~~ ,保存起来再说
使用过滤器Filter解决tomcat默认编码配置下的传值乱码 -
aki319:
...
Html的一些小经验
说在前面:非原创。
输入数据验证:虽然为了用户的方便,可以提供“客户端”层数据的数据验证,但必须使用Servlet 在服务器层执行验证。 客户端验证本身就不安全,因为这些验证可轻易绕过,例如,通过禁用 Javascript。一份好的设计通常需要 Web 应用程序框架,以提供服务器端实用程序例程,从而验证以下内容:
好的做法是将以上例程作为“验证器”实用程序类中的静态方法实现。以下部分描述验证器类的一个示例。
[1] 必需字段
[2] 输入的 Web 应用程序中的字段数据类型和输入参数欠佳。例如,所有 HTTP 请求参数或cookie值的类型都是“字符串”。开发者负责验证输入的数据类型是否正确。 使用Java基本包装程序类,来检查是否可将字段值安全地转换为所需的基本数据类型。
验证数字字段(int 类型)的方式的示例:
好的做法是将所有HTTP请求参数转换为其各自的数据类型。例如,开发者应将请求参数的“integerValue”存储在请求属性中,并按以下示例所示来使用:
应用程序应处理的主要 Java 数据类型:
[3] 字段长度“始终”确保输入参数(HTTP请求参数或cookie值)有最小长度和/或最大长度的限制。
以下示例验证 userName 字段的长度是否在 8 至 20 个字符之间:
[4] 字段范围
始终确保输入参数是在由功能需求定义的范围内。
以下示例验证输入 numberOfChoices 是否在 10 至 20 之间:
[5] 字段选项 Web 应用程序通常会为用户显示一组可供选择的选项(例如,使用SELECT HTML 标记),但不能执行服务器端验证以确保选定的值是其中一个允许的选项。请记住,恶意用户能够轻易修改任何选项值。始终针对由功能需求定义的受允许的选项来验证选定的用户值。
以下示例验证用户针对允许的选项列表进行的选择:
[6] 字段模式
始终检查用户输入与由功能需求定义的模式是否匹配。例如,如果 userName 字段应仅允许字母数字字符,且不区分大小写,那么请使用以下正则表达式:^[a-zA-Z0-9]*$。
执行正则表达式验证的示例:
[7]cookie值使用javax.servlet.http.Cookie对象来验证cookie值。适用于cookie值的相同的验证规则(如上所述)取决于应用程序需求(如验证必需值、验证长度等)。
验证必需 cookie 值的示例:
[8] HTTP 响应
[8-1] 过滤用户输入要保护应用程序免遭跨站点脚本编制的攻击,请通过将敏感字符转换为其对应的字符实体来清理 HTML。这些是 HTML 敏感字符:< > " ' % ; ) ( & +。
以下示例通过将敏感字符转换为其对应的字符实体,来过滤指定字符串:
Java Servlet API 2.3 引进了过滤器,它支持拦截和转换 HTTP 请求或响应。
以下示例使用 Validator.f ilter 来用“Servlet 过滤器”清理响应:
[8-2] 保护cookie
在cookie中存储敏感数据时,确保使用Cookie.setSecure(布尔标志)在 HTTP 响应中设置cookie 的安全标志,以指导浏览器使用安全协议(如 HTTPS 或 SSL)发送cookie。
保护“用户”cookie 的示例:
全文结束,有问题的可以留言大家探讨。
输入数据验证:虽然为了用户的方便,可以提供“客户端”层数据的数据验证,但必须使用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("<"); break; case '>': result.append(">"); break; case '"': result.append("""); break; case '\'': result.append("'"); break; case '%': result.append("%"); break; case ';': result.append(";"); break; case '(': result.append("("); break; case ')': result.append(")"); break; case '&': result.append("&"); 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.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);
全文结束,有问题的可以留言大家探讨。
发表评论
-
shell的学习笔记
2013-08-17 13:02 680最近在找工作,前些天被问起shell的问题。发现这块真是自己的 ... -
jwebap,监控web应用的jdbc,http请求,java类
2012-12-05 18:11 748最近在用jwebap。一个用来检测web应用的jdbc链接,h ... -
Tomcat的一些琐事
2012-08-29 17:58 801记录一些tomcat相关的操作问题,备忘 Tomcat “指 ... -
MySql 根据某个字段合并某一列数据
2012-06-06 09:40 0查询语句 SELECT productId, GROUP_CO ... -
Spring框架用注解进行事务控制
2012-05-18 18:07 1300今天纠结了一天呀~~就为了个注解事务控制。 其实很久以前就用过 ... -
oracle.sql.CLOB 转 String
2012-04-27 18:24 1866最近在用oracle数据库,有个oracle.sql.CLOB ... -
对内容列表按英文字母进行排序
2012-01-12 16:45 2090实现对内容列表,比如说种类,地方名按英文字母进行排序。效果如下 ... -
web开发常用组件备忘
2011-11-15 18:49 1155分享一些web开发经常用到的组件,也给自己做个备忘。 1、K ... -
IndexWriter.DeleteDocument与IndexReader.DeleteDocument区别
2011-10-31 15:28 1076转自http://www.cnblogs.com/zengen ... -
用cookie实现简单的单点登录功能
2011-08-10 17:35 2639看到篇博文,是关于单点登录的。 引用编写你自己的单点登录(SS ... -
web应用dao层的开发经验小结
2011-07-05 13:08 1122框架用多了,也有些腻。虽然struts2,spring,hib ... -
使用oscache加速你的web程序
2011-06-28 15:31 1178网上找了一下关于web开发方面可使用的缓存技术,发现oscac ... -
Html的一些小经验
2011-06-15 14:03 827写篇文章记录一下做web过程的一些小经验。打算以后想到就补充这 ... -
使用过滤器Filter解决tomcat默认编码配置下的传值乱码
2011-06-08 13:56 2179最近又拿起jsp+servlet来做项目,遇到了乱码的问题。解 ... -
【转载】MySQL索引类型一览 让MySQL高效运行起来
2011-05-24 11:20 908在网上看到篇介绍MySql索引的文章,觉得不错。转到自己博客, ... -
Tomcat设置网页超链接默认打开映射
2011-05-17 10:42 1183Tomcat设置网页超链接默认打开映射,可以修改tomcat/ ... -
关于Spring的事务管理,基于XML
2011-04-02 14:45 913在Spring中常用的事务传播行为 PROPAGATION ... -
Linux下Tomcat相关的一些命令
2011-03-29 20:29 870启动tomcat: ./startup.sh 关闭tomc ... -
String 与 InputStream互相转换
2011-01-28 11:46 968String与InputStream互转 1. String ... -
MySql数据在控制台里的导入和导出
2010-12-16 10:35 1613在windows系统下需要进入mysql安装目录中的bin目录 ...
相关推荐
J2EE企业级项目开发-3期(KC007) 8.2 Struts之数据校验与国际化文档.doc 学习资料 复习资料 教学资源
J2EE企业级项目开发-3期(KC007) 8.2 Struts之数据校验与国际化考试.doc 学习资料 复习资料 教学资源
基于J2EE的web系统的开发与设计 证以及sql身份验证是数据访问的安全性问题上的两种身份验证。 系统要求安全级别越高,需要考虑的问题就越多,只有各个方面都处
本文具体分析了Struts、Spring和Hibernate这三个开源框架各自的特征,并提出在表示层、业务逻辑层、数据持久层中合理的一些框架的特征,即可以减少开发人员重新开发各种通用功能所带来的问题、具有良好的扩展性和可...
2014最近做好的学期项目hr 带数据 JSP页面 完全能运行 带有完整的libs jar包 J2EE SSH Ajax easyUI 带有上传功能 自动菜单生成 登录验证 员工管理 薪资管理 培训管理 招聘管理 等等
J2EE作业项目 团购网是团购的网络组织平台,就是互不认识的消费者,借助互联网的“网聚人的...使用struts + hibernate架构,充分实践J2EE课程中所学的jdbc、数据校验、国际化、上传、下载、数据映射等一系列技术。
基于J2EE的B2C电子商务系统开发是一个较为复杂的项目,需要整合多种技术和组件,如Java语言、JSP/Servlet、Struts、Hibernate、Spring等框架、数据库、Web服务器等。以下是一些可能需要考虑的关键技术和步骤: 系统...
典型的J2EE三层结构,分为表现层、中间层(业务逻辑层)和数据服务层。三层体系将业务规则、数据访问及合法性校验等工作放在中间层处理。客户端不直接与数据库交互,而是通过组件与中间层建立连接,再由中间层与...
实验一 熟悉J2EE编程环境 7 一、实验目的及任务 7 二、实验环境 7 三、实验步骤 7 1、JDK150的下载、安装和配置 7 ①新增系统变量JAVA_HOME: 7 ②编辑系统变量Path: 8 2、下载、安装Tomcat web服务器 9 3、下载、...
企业版最少64MB内存,其他版本最少需要32MB内存,建议使用更多的内存。 (3)硬盘空间 完全安装(Full)需要180MB的空间,典型安装(Typical)需要170MB的空间,最小安装(Minimum)需要65MB的空间。 3.3. ...
企业版最少64MB内存,其他版本最少需要32MB内存,建议使用更多的内存。 (3)硬盘空间 完全安装(Full)需要180MB的空间,典型安装(Typical)需要170MB的空间,最小安装(Minimum)需要65MB的空间。 3.3. ...
八、 采用MVC设计模式开发一个web应用程序,项目名称为学号,要求资源文件命名规范,组织有序,通过截图方式给出程序验证结果,并提交压缩的工程文件。具体要求如下:[第八周] 1) 将第7周作业实现的版本...
采用swagger可视化出实时方法格式以及数据属性,采用阿里druid 工作流程管理:完全实现模块化,无侵入。 流程管理:动态给发布流程分配角色,无需手动写死,灵活可变 模块列表:新建、编辑、发布流程,前端实现完全...
Hibernate查询 Hibernate基础 Hibernate数据关联 javaweb开发技术 Struts标记库 Struts表单验证及异常处理 Struts国际化与Validator验证框架 Struts配置文件 Struts入门 项目实践-名片管理系统
实验一、j2EE开发环境搭建及测试 实验二、文件上传下载功能实现 实验三、Excel数据文件数据库导入导出 实验四、后台管理:登录Login开发 实验五、人事管理:邮件发送(rabbitmq)发送端开发 实验六、人事管理:邮件...
第五章 Validation(数据格式验证)..276 第六章 Internationalization(I18N:国际化)..........................283 struts1.x...283 一、开发struts1应用的基本步骤...283 二、Struts的工作流程.......................
在这个版本中,包含了企业资源规划的基本功能模块,如员工管理、项目管理、库存管理等,以及一些辅助功能,如登录验证、权限控制等。这些功能模块可以帮助学生快速了解和掌握企业资源规划系统的设计和实现过程。此外...
工作中的积累,搭建的j2ee应用快速开发手架,重点在代码重构,一些常用功能的演示,工具,插件等的整理。ps:(参考,,) springmvc、spring、hibernate为基础框架 mysql数据库 前端使用基于bootstrap的metronic组件库...
开源 bbs 源码 java 关注 JeeSite 4.0 请移步: JeeSite 企业信息化快速开发平台 ...JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的开源Java ...采用分层设计、双重验证、提交数据安全