如何修复质量分配:java中的不安全的Binder配置(API滥用,结构)

时间:2017-12-22 17:43:15

标签: java spring spring-mvc fortify mass-assignment

我有一个Controller类,其中包含以下两种查找医生的方法(上下文已更改)。获得 批量分配:两种方法都存在不安全的Binder配置(API滥用,结构)错误。

@Controller
@RequestMapping(value = "/findDocSearch")
public class Controller {

    @Autowired
    private IFindDocService findDocService;

    @RequestMapping(value = "/byName", method = RequestMethod.GET)
    @ResponseBody
    public List<FindDocDTO> findDocByName(FindDocBean bean) {
        return findDocService.retrieveDocByName(bean.getName());
    }

    @RequestMapping(value = "/byLoc", method = RequestMethod.GET)
    @ResponseBody
    public List<FindDocDTO> findDocByLocation(FindDocBean bean) {
        return findDocService.retrieveDocByZipCode(bean.getZipcode(),
        bean.getDistance());
    }
}

我的Bean是:

public class FindDocBean implements Serializable {
    private static final long serialVersionUID = -1212xxxL;

    private String name;
    private String zipcode;
    private int distance;

    @Override
    public String toString() {
        return String.format("FindDocBean[name: %s, zipcode:%s, distance:%s]",
                name, zipcode, distance);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getZipcode() {
        return zipcode;
    }

    public void setZipcode(String zipcode) {
        this.zipcode = zipcode;
    }

    public int getDistance() {
        return distance;
    }

    public void setDistance(int distance) {
        this.distance = distance;
    }

根据目前为止发现的所有建议,他们建议仅使用以下内容限制bean所需的参数:

final String[] DISALLOWED_FIELDS = new String[]{"bean.name", "bean.zipcode", };

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.setDisallowedFields(DISALLOWED_FIELDS);

但是我的问题是bean的所有3个参数都将用在Controller上提供的任何一个方法中。

有人可以为此建议一些解决方案。提前谢谢。

4 个答案:

答案 0 :(得分:4)

InitBinder可用于方法。你可以试试这个。

    <input type="text" name="edDuration" id="edDuration" pattern="^(2[0-3]|[01]?[0-9]?[0-9]:([1-5]{1}[0-9])$)" title="Format: hh:mm" style="position:relative;" value="000:00" maxlength="6" placeholder="000:00" onchange="myFunc">

答案 1 :(得分:1)

我遇到了同样的问题,然后我在同一个控制器类中添加了以下代码:

@InitBinder
public void populateCustomerRequest(WebDataBinder binder) {
    binder.setDisallowedFields(new String[]{});
}

现在它对我来说很好,并且质量分配问题已得到修复。

答案 2 :(得分:0)

简单的问题 - 你的映射器如何实现bean的实例化? Here是答案/示例。您可以按query parameterheader传递该数据。然而,那会很奇怪。更好的方法是使用@QueryParam提供位置或名称的方法。这样,保护您的应用程序将更容易。

作为旁注,查询的长度有限,因此如果您的搜索表单很大且很奇怪,@POST可能是个好主意,这样您就可以传递所有数据。为此,一个简单的例子就是矫枉过正。

答案 3 :(得分:0)

这看起来像是一个不幸的误报。此错误背后的规则是为了避免从Web请求中意外填充对象中存在但未打算(未经验证)用户输入的属性。一个示例是创建资源的POST请求。如果请求处理程序获取完整资源对象并仅填充缺少的属性,则恶意用户可以填充她无法编辑的字段。

然而,这种情况与该计划不符。您只需使用相同的机制来捕获不同的参数。此外,甚至不会读取已填充的属性。在

GET http://yourhost/findDocSearch/byName?name=Abuse&zipCode=11111

只会忽略附加的zipCode。因此,此处不存在假定的风险。

修复警告,您可以将其标记为误报(如果在您的设置中可以这样做)。如果这不可能,您也可以直接将查询参数映射到方法参数。因为你只有有限的参数,不应该伤害太多。如果这也不是选项,您可能需要弄清楚代码分析使用的确切算法来确定它将识别哪些检查。不幸的是,大多数扫描仪只能发现一组有限的方法来进行输入验证。