《Head First Servlets & JSP》-12-Web应用安全

serlvet安全的4大要素

认证、授权、机密性和数据完整性。

容器完成认证和授权的过程

代码中不要有安全信息

大多数Web应用,大多数情况下Web应用的安全约束都应该以声明方式处理,即在部署描述文档中指定。原因如下:

谁不想更多地采用XML呢

通常能自然地映射到公司IT部门现有的任务角色

你可以用更灵活的方式使用以前servlet

应用开发人员可以重servlet不用去碰源代码

随着应用的扩展,可以减少可能的维护

还有一点,这正好能体现容器的价值

支持基于组件的开发思想

谁来实现Web应用中的安全?

-servlet提供者只需要关注业务

  • 应用管理员只需要确定应用中有哪些角色(如tomcat中的conf/tomcat-users.xml)
  • 主要任务由部署人员承担:确定哪些角色可以访问哪些servlet

授权的步骤

  • 安全领域

    安全领域即存储认证信息的地方,如tomcat的tomcat-users.xml会在启动时读入内存,则成为内存领域。(测试时可以在该文件存放角色认证信息,生产环境则一般不推荐,而是用LDAP或关系数据库存放)。

  • tomcat-users.xml文件

  • 启动认证

    要让容器询问用户名和口令,需要在DD中如下配置,才能进行认证:

  • 授权第一步:定义角色

    把开发商(Tomcat)特定的“用户”文件的角色映射到部署描述文件中建立的角色。

    如开发商特定的tomcat-users.xml中的role元素:

    以及servlet规范:web.xml中的DD security-role元素:

  • 授权第二步:定义资源/方法约束security-constraint

    以声明的方式指定一个给定的资源/方法组合中能由特定角色的用户所访问。

    在DD的security-constraint元素:

    关于security-constraint子元素web-resource-collection的要点:

    <web-resource-collection>元素有两个主要的子元素:url-pattern(一个或多个)和http-method(可选,0个或多个);

    URL模式和HTTP方法一同定义受限资源请求;

    web-resource-name元素是必要的,就算你自己可能不会用它(可以认为它要由IDE使用,或留待将来使用);

    description元素是可选的;

    url-pattern元素使用servlet标准命名和映射规则(有关URL模式的详细内容可以去看关于“部署’那一章);

    必须至少指定一个url-pattern,不过也可以有多个;

    http-method元素的合法方法包括:GET、POST、PUT、TRACE、DELETE、HEAD和OPTIONS;

    如果没有指定任何HTTP方法,那么所有方法都是受约束的!!;

    如果确实指定了http-method,则只有所指定的方法是受约束的。换言之,一旦指定了一个http-method,就会自动使未指定的HTTP方法不受约束;

    一个security-constraint中可以有多个web-resource-collection元素;

    auth-constraint元素应用于security-constraint中的所有web-resource-collection元素。

    auth-constraint元素并不是定义哪些角色可以访问web-resource-collection中的资源,相反,它只是定义了哪些角色可以做出受约束的请求。

关于security-constraint子元素auth-constraint子元素:

auth-constraint规则:

在security-constraint元素中,auth-constraint元素是可选的;

如果存在一个auth-constraint,容器必须对相关URL进行认证;

如不存在auth-constraint,容器运行不经认证就能访问这些URL;

为提高可读性,可以在auth-constraint中增加一个description元素。

role-name规则:

在auth-constraint元素中,role-name元素是可选的;

如果存在role-name元素,它们会告诉容器哪些角色得到许可;

如果存在一个auth-constraint元素,但是没有任何role-name子元素,那么所有用户都遭到拒绝;

如果有<role-name>*</role-name>,那么所有用户都是允许的;

角色名区分大小写。

多个security-constraint/auth-constraint元素的对决

`

  1. 合并单个的角色名时,所列的所有角色名都允许访

    问;

  2. 角色名“*”与其他设置合少t–时,所有人都允许访

    问;

  3. 空的(空的不是没有)auth-constraint标记与其他设置合并时,所有人都不允许访问!换句话说,空的auth-constraint就是最后“宣判”!
  4. 如果某个security-constraint素没有auth-constraint元素,它与其他设置合并时,所有人都允许访问。

    `

    两个不同的非空auth-constraint元素应用于同一个受限资源,那么两个auth-constraint元素中所有角色的并集都运行访问。

    受限访问,指的是客户不能访问,但是Web应用的其他部分时可以的。

看看认证

  • 4中认证类型

    基本认证、摘要认证、客户证书认证和表单认证。

  • 实现认证

    在DD中声明认证机制,主要是login-config元素

认证类型小结

基于表单的认证

表单登录,可以定制自己的登录表单页面,而不是用其他3中认证所有的浏览器登录窗口。

表单登录安全保证:HTTPS

要实现数据机密性和/或完整性时,J2EE规范可以保证所传输的数据会经过一个“有保护的传输层连接”,即容器不必使用任何特定的协议来处理安全传输。(实际中几乎都会使用SSL之上的HTTPS协议。)

数据保护要有一些开销,且不会对应用中的每个请求和响应都加密,因此使用——以声明方式保守地实现数据机密性和完整性:

数据保护

  • 未经认证的客户请求一个没有传输保证的受限资源

  • 未经认证的客户请求一个受限资源,这个资源有机密性传输保证

《Head First Servlets & JSP》-12-Web应用安全

时间: 2024-10-07 01:24:57

《Head First Servlets & JSP》-12-Web应用安全的相关文章

《Head First Servlets & JSP》-13-过滤器和包装器

过滤器是什么 与servlet非常类似,过滤器就是java组件,请求发送到servlet之前,可以用过滤器截获和处理清求,另外 servlet结束工作之后,在响应发回给客户之前,可以用过滤器处理响应. 容器根据DD中的声明来确定何时调用过滤器.在DD中,部署人员要建映射.明确对于哪个请求URL模式要调用哪些过滤器.所以,要由部署人员(而不是程序员)来确定哪些请求或响应应当由哪些过滤器处理. 过滤器要做的事情 只有一个过滤器接口:Filter,根据使用方式,可完成诸如以下工作: 请求过滤器可以完成

《Head First Servlets & JSP》-8-无脚本的JSP

以前servlet和JSP交互的代码 servlet代码示例: JSP代码示例: 若属性不是一个String而是一个Bean呢? 一个简单的JavaBean servlet代码示例: JSP代码示例: 或者这么写: JSP中不要出现脚本 使用标准动作的JSP 标准动作jsp:useBean详解 scope默认是page作用域,那么在上述示例代码中可能出现问题:找不到person对象! 标准动作jsp:getProperty详解 jsp:useBean还可以创建一个bean 以下标准动作标记: 会

《Head First Servlets & JSP》-5-属性和监听

Servlet初始化参数 在DD文件(web.xml)中 Servlet参数在 在Servlet代码中 在Servlet初始化之前不能使用Servlet初始化参数 一旦有了一个ServletConfig引用,就可以调用getInitParameter()方法,不过 不能从构造函数调用这个方法!因为容器只调用构造函数还未调用init()之前,它还不算一个完整的Servlet(薛定谔Servlet). Servlet初始化参数只能赌一次--就是在容器初始化Servlet的时候 容器建立一个Servl

《Head First Servlets & JSP》-2-概述

什么是容器 Servlet没有main()方法,他们受控于另一个Java应用,这个java应用称为容器(Container). Web服务器应用(如Apache)得到一个指向Servlet的请求(如何判断是一个Servlet请求而不是一个静态HTML页面请求?)时,服务器不是把这个请求交给Servlet本身,而是交给部署该Servlet的容器.由容器向Servlet提供HTTP请求和响应,而且要由容器调用Servlet的方法(如doPost()或deGet()). 注意,我们目前使用Tomcat

《Head First Servlets & JSP》-11-Web应用部署

Web目录 WAR文件 WAR文件只是Web应用结构的一个快照,采用了一种更可移植的压缩形式. 建立WAR文件时,就是把整个Web应用结构(去掉Web应用上下文目录,就是把WEB-INF之上的一级目录去掉)压缩起来,给定一个.war扩展名. 容器如何知道Web应用的名字/上下文呢?Tomcat中,WAR文件名就是了! 在一个WAR文件中,可以在META-INF/MANIFEST.MF文件中声明库依赖性(和直接放在WEB-INF/lib下有何区别?后文见分晓). 部署后的WAR文件的样子 使静态内

《Head First Servlets & JSP》-3-1st servlet MVC demo

项目结构 用户首页 form.html <html> <body> <h1 align='center'>Beer Selection Page</h1> <form method="post" action="SelectBeer.do"> Select <p> Color: <select name="color" size="1"> &l

《Head First Servlets & JSP》-6-会话管理

容器怎么知道客户是谁 Http协议是无状态连接,客户浏览器与服务器建立连接.发出请求.得到响应,然后关闭连接.即,连接只针对一个请求/响应. 对容器而言,每个请求都来自于一个新的客户. 客户需要一个唯一的会话ID IP不能唯一标示Internet上特定的用户 比如公司网络内的用户为一个IP:而IP地址也只是路由的地址:用户换了一台设备的情况: 客户和容器如何交互会话ID信息 容器必须以某种方式吧会话ID作为响应的一部分交给客户,而客户必须把会话ID作为请求的一部分发回: 最简单而且最常用的方式是

《Head First Servlets & JSP》-10-定制标记开发

标记文件:很想include,但是比include更好 建立和使用标记文件的最简方法 取一个被包含文件(如Header.jsp),把它重命名为带有一个.tag扩展名(Header.tag): 把标记文件(Header.tag)放在WEB-INF目录下一个名为tags的目录中: 在JSP中放一个taglib指令(有一个tagdir属性),并调用这个标记: 如何向标记文件发送参数? 对于标记文件,发送的不是请求参数,而是标记属性! 在JSP中调用标记: 在标记文件中使用属性: 如何定义标记文件中所需

《Head First Servlets & JSP》-6-会话管理-listener etc. demo

工程结构 上下文参数示例 示例程序展示了如何从上下文读取参数,并在上下文监听器中生成属性对象和在上下文中设置属性. 建立一个简单的JavaBean对象作为属性:Dog.java package com.example.entities; /** * Created by LTN on 2016/11/2. */ public class Dog { private String breed; public Dog(String breed) { this.breed = breed; } pub

《Head First Servlets & JSP》-7-使用JSP

学习的知识点 JSP,最后会变成一个servlet JSP最终或变成一个完整的servlet在Web应用中运行,只不过这个servlet类会由容器写好. JSP中的scriptlet 所谓scriptlet就是放在<%-%>标记中的java代码.如: <% out.println(com.inspur.Counter.getCount()); %> JSP中的指令 JSP指令和scriptlet区别在于:多了一个@符号.注意中间无空格. 使用page指令导入包 导入一个包: <