开发安全应用程序(一)—— 开发安全 Web 应用程序

<script type="text/javascript">function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>开发安全 Web 应用程序
当只有声明性安全性不足以表述应用程序的安全性模型时,具有安全性意识的应用程序使用程序性安全性。程序性安全性由下列步骤组成:

在 servlet 或 JSP 代码中添加必需的安全性方法。
(可选)创建具有角色名字段的安全性角色引用元素。因为安全性 API isUserInRole() 可使用实际的角色名来作为参数,所以不必创建安全性角色引用元素。但是,好的做法是使用角色引用,这样可以使软件组件可重复使用。
要获取完整的代码示例,参见示例:安全 Web 应用程序代码。

示例:保护 Web 应用程序代码
此 示例说明使用程序性安全性模型的 Web 应用程序(servlet)。此示例是一种使用程序性安全性模型的方法,但不必是唯一的方法。应用程序可以以任何对该应用程序有意义的方式来使用 getUserPrincipal()、isUserInRole() 和 getRemoteUser() 方法返回的信息。然而,强烈建议您尽可能地使用声明性安全性模型。

import javax.servlet.*;

public class HelloServlet extends HttpServlet {
  public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, java.io.IOException {
  }
 
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, java.io.IOException {
    String s = "Hello";
   
    // get remote user using getUserPrincipal()
    java.security.Principal principal = request.getUserPrincipal();
    String remoteUserName = "";
   
    if (principal != null) {
    remoteUserName = principal.getName();
    }
   
    // get remote user using getRemoteUser()
    String remoteUser = request.getRemoteUser();
   
    // check if remote user is granted Mgr role
    boolean isMgr = request.isUserInRole("Mgr");
   
    // display Hello username for managers and bob.
    if (isMgr || remoteUserName.equals("bob")) {
    s = "Hello " + remoteUserName;
    }
    String message = "<html> /n" +
    "<head><title>Hello Servlet</title></head>/n" +
    "<body> /n" +
    "<h1> " + s + "</h1>/n ";
    byte[] bytes = message.getBytes();
   
    // displays "Hello" for ordinary users and
    // displays "Hello username" for managers and "bob."
    response.getOutputStream().write(bytes);
  }
}
在开发 servlet 之后,可以为 HelloServlet 创建安全性角色引用,如下所示:

<security-role-ref>
  <description>Manager</description>
  <role-name>Mgr</role-name>
</security-role-ref>


在 servlet 代码中添加必需的安全性方法。

程序性安全性由 HttpServletRequest 接口的下列方法组成:

getRemoteUser()
此方法返回客户机用来进行认证的用户名。如果尚未认证用户,则返回空。

isUserInRole (String rolename)
如果已将指定的安全性角色授予远程用户,则此方法返回 true。如果没有将指定的角色授予远程用户,或者没有认证用户,则此方法返回 false。

getUserPrincipal()
此方法返回包含远程用户名的 java.security.Principal 对象。如果没有认证用户,则返回空。

可在 servlet 的任何 doGet()、doPost()、doPut() 和 doDelete() 服务方法中添加程序 servlet 安全性方法。以下是程序性安全性 API 的用法示例:

public void doGet(HttpServletRequest request, HttpServletResponse response) {
  ...
  // to get remote user using getUserPrincipal()
  java.security.Principal principal = request.getUserPrincipal();
  String remoteUser = principal.getName();

  // to get remote user using getRemoteUser()
  remoteUser = request.getRemoteUser();

  // to check if remote user is granted Mgr role
  boolean isMgr = request.isUserInRole("Mgr");

  // use the above information in any way as needed by the application
  ...
}
创建具有角色名字段的安全性角色引用元素

此步骤是有计划地保护应用程序所必需的。如果在开发期间没有创建安全性角色引用,则确保在汇编阶段创建它。

使 用 isUserInRole() 方法时,应在部署描述符中使用包含传送给此方法的角色名的角色名元素来描述安全性角色引用。因为实际的角色是在应用程序的汇编期间创建的,所以开发者可使 用逻辑角色作为角色名,并在安全角色元素的描述中为汇编程序提供足够的线索以将该角色与实际角色链接。在汇编期间,汇编程序创建角色链接子元素以将角色名 与实际角色链接。如果使用诸如 WebSphere Studio Application Developer 之类的开发工具,则创建安全性角色引用元素是有可能的。也可以在汇编期间使用“应用程序汇编工具”来创建安全性角色引用元素。

定义逻辑角 色非常有用的情况示例是:您想使用 Web 应用程序自已的授权表(外部资源到远程用户的映射)来访问外部资源并控制对外部资源的访问。在这种情况下,可使用 getUserPrincipal() 或 getRemoteUser() 方法来获取远程用户,然后应用程序可查阅它自已的授权表来执行授权。远程用户信息还可用来从外部源(如数据库)或从企业 Bean 检索相应用户信息。同样,也可使用 isUserInRole()。

例如:

<security-role-ref>
  <description>Provide hints to assembler for linking
  this role-name to actual role here</description>
  <role-name>Mgr</role-name>
</security-role-ref>
在汇编期间,汇编程序创建如下所示的角色链接:

<security-role-ref>
  <description>Hints provided by developer to
  map role-name to role-link</description>
  <role-name>Mgr</role-name>
  <role-link>Manager</role-link>
</security-role-ref>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 背景 4 2. 编码安全 4 2.1. 输入验证 4 2.1.1. 概述 5 2.1.2. 白名单 5 2.1.3. 黑名单 5 2.1.4. 规范化 5 2.1.5. 净化 5 2.1.6. 合法性校验 6 2.1.7. 防范SQL注入 6 2.1.8. 文件校验 6 2.1.9. 访问控制 6 2.2. 输出验证 6 2.2.1. 概述 6 2.2.2. 编码场景 6 2.2.3. 净化场景 7 2.3. SQL注入 7 2.3.1. 概述 7 2.3.2. 参数化处理 7 2.3.3. 最小化授权 7 2.3.4. 敏感数据加密 7 2.3.5. 禁止错误回显 8 2.4. XSS跨站 8 2.4.1. 输入校验 8 2.4.2. 输出编码 8 2.5. XML注入 8 2.5.1. 输入校验 8 2.5.2. 输出编码 8 2.6. CSRF跨站请求伪造 8 2.6.1. Token使用 9 2.6.2. 二次验证 9 2.6.3. Referer验证 9 3. 逻辑安全 9 3.1. 身份验证 9 3.1.1. 概述 9 3.1.2. 提交凭证 9 3.1.3. 错误提示 9 3.1.4. 异常处理 10 3.1.5. 二次验证 10 3.1.6. 多因子验证 10 3.2. 短信验证 10 3.2.1. 验证码生成 10 3.2.2. 验证码限制 10 3.2.3. 安全提示 11 3.2.4. 凭证校验 11 3.3. 图灵测试 11 3.3.1. 验证码生成 11 3.3.2. 验证码使用 11 3.3.3. 验证码校验 11 3.4. 密码管理 12 3.4.1. 密码设置 12 3.4.2. 密码存储 12 3.4.3. 密码修改 12 3.4.4. 密码找回 12 3.4.5. 密码使用 12 3.5. 会话安全 13 3.5.1. 防止会话劫持 13 3.5.2. 会话标识符安全 13 3.5.3. Cookie安全设置 13 3.5.4. 防止CSRF攻击 13 3.5.5. 会话有效期 14 3.5.6. 会话注销 14 3.6. 访问控制 14 3.6.1. 跨权访问 14 3.6.2. 控制方法 14 3.6.3. 控制管理 14 3.6.4. 接口管理 15 3.6.5. 权限变更 15 3.7. 文件上传安全 15 3.7.1. 身份校验 15 3.7.2. 合法性校验 15 3.7.3. 存储环境设置 15 3.7.4. 隐藏文件路径 16 3.7.5. 文件访问设置 16 3.8. 接口安全 16 3.8.1. 网络限制 16 3.8.2. 身份认证 16 3.8.3. 完整性校验 16 3.8.4. 合法性校验 16 3.8.5. 可用性要求 17 3.8.6. 异常处理 17 4. 数据安全 17 4.1. 敏感信息 17 4.1.1. 敏感信息传输 17 4.1.2. 客户端保存 17 4.1.3. 服务端保存 17 4.1.4. 敏感信息维护 18 4.1.5. 敏感信息展示 18 4.2. 日志规范 18 4.2.1. 记录原则 18 4.2.2. 事件类型 18 4.2.3. 事件要求 18 4.2.4. 日志保护 19 4.3. 异常处理 19 4.3.1. 容错机制 19 4.3.2. 自定义错误信息 19 4.3.3. 隐藏用户信息 19 4.3.4. 隐藏系统信息 19 4.3.5. 异常状态恢复 20 4.3.6. 通信安全 20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值