绑定敏感字段

目前大部分WEB框架支持将HTTP请求参数与类的属性相匹配的而生成一个对象。因此,攻击者能够将值放入HTTP请求参数中从而绑定系统对象。

例如:在以下代码片段中, Spring MVC可以将 HTTP请求参数绑定到 User属性:

@RequestMapping("/login" )  
public String login(User user) {  
  ...  
}

其中,User 类定义为:

public class User {  
  private String username;  
  private String address;  
  private int age;  
  private boolean admin;  
  ...  
}

当Spring MVC未配置为禁止绑定敏感属性,则攻击者可能会通过发送以下使普通用户变为管理员。
name=张三&address=北京&age=22&admin=true

解决办法:
当程序将非将HTTP请求参数直接绑定给对象时,应该要控制绑定到对象的属性,防止暴露敏感属性。
例1:在以下代码片段中,在 Spring MVC(3.0版本至最新)禁止绑定敏感属性。

@InitBinder  
public void initBinder(WebDataBinder binder) {  
    binder.setDisallowedFields(new String[]{"admin"});  
}  
@RequestMapping("/login" )  
public String login(User user) {  
  ...  
}

例2:在 Spring MVC(2.X版本)禁止绑定敏感属性。

@Override  
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {  
    binder.setDisallowedFields(new String[]{"admin"});  
}

在使用@RequestBody注释参数的 Spring MVC应用程序中,绑定过程由HttpMessageConverter进行处理,这些实例使用Jackson和JAXB等库将 HTTP请求参数转换为Java对象。这些库提供了注释来控制应允许或禁止的字段。例如对于Jackson,可以使用@JsonIgnore注释禁止将某个字段绑定到请求。
例3:在以下代码片段中,Jackson禁止绑定敏感属性。

@RequestMapping(value="/add/user", method=RequestMethod.POST, consumes="text/html")  
public void addEmployee(@RequestBody User user){  
    ...  
}  
public class User {  
  private String username;  
  private String address;  
  @JsonIgnore  
  private boolean admin;  
  private int age;  
  ...  
}

同理,Jackson还可以使用@JsonIgnoreProperties、@JsonIgnoreTyp和 @JsonInclude等注解告诉框架忽略这些属性,使用JAXB使用@XmlAccessorType、@XmlAttribute、@XmlElement和 @XmlTransient等注解告诉框架忽略这些属性,然后使用@XmlAttribute和@XmlElement等注解选择应绑定的字段。
例4:在以下代码片段中,Jackson使用@XmlAttribute选择要绑定的字段。

@XmlRootElement  
@XmlAccessorType(XmlAccessType.NONE)  
public class User {  
    private String username;  
    private String address;  
    @JsonIgnore  
    private boolean admin;  
    private int age;  
    @XmlAttribute  
    public String getUsername() {  
        return username;  
    }  
    public void setUsername(String username) {  
        this.username = username;  
    }  
    @XmlAttribute  
    public String getAddress() {  
        return address;  
    }  
    public void setAddress(String address) {  
        this.address = address;  
    }  
    private boolean isAdmin()  {  
       return admin;  
    }  
    private void setAdmin(boolean admin)  {  
       this.admin = admin;  
    }  
    ...  
}

例5:在以下代码片段中,在Struts可以将某个属性的setter方法设置为私有从而禁止绑定敏感属性。

private boolean admin;  
private void setAdmin(boolean admin)  {  
   this.admin = admin;  
}

还有另一种方法是使用将 HTTP请求参数绑定到仅含有 Web表单或 API中定义的属性DTO对象中,再将其映射到User中,防止敏感字段暴露。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值