当前位置:   article > 正文

绑定敏感字段_直接绑定敏感字段

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

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

@RequestMapping("/login" )  
public String login(User user) {  
  ...  
}
  • 1
  • 2
  • 3
  • 4

其中,User 类定义为:

public class User {  
  private String username;  
  private String address;  
  private int age;  
  private boolean admin;  
  ...  
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

当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) {  
  ...  
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

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

在使用@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;  
  ...  
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

同理,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;  
    }  
    ...  
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

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

private boolean admin;  
private void setAdmin(boolean admin)  {  
   this.admin = admin;  
}
  • 1
  • 2
  • 3
  • 4

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/847252
推荐阅读
相关标签
  

闽ICP备14008679号