web-dev-qa-db-fra.com

Comment résoudre un problème d'affectation en masse: configuration non sécurisée du classeur (abus d'API, structure) en java

J'ai une classe de contrôleur avec les deux méthodes ci-dessous pour trouver un médecin (le contexte a changé). Obtention de la Affectation en masse: configuration de classeur non sécurisée (API Abuse, Structural) error sur les deux méthodes. 

@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());
    }
}

et mon haricot est:

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;
    }

Selon toutes les suggestions trouvées jusqu'à présent, ils suggèrent de limiter le haricot avec les paramètres requis uniquement par quelque chose comme ci-dessous:

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

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

Mais mon problème est que tous les 3 paramètres du bean seront utilisés dans l’une des méthodes fournies par Controller.

Quelqu'un peut-il s'il vous plaît suggérer une solution pour cela. Merci d'avance.

4
dildeepak

InitBinder peut être utilisé pour les méthodes. Vous pouvez essayer ça.

@InitBinder("findDocByName")
public void initBinderByName(WebDataBinder binder) {
    binder.setDisallowedFields(new String[]{"distance","zipcode"});
}


@InitBinder("findDocByLocation")
public void initBinderByZipCode(WebDataBinder binder) {
    binder.setDisallowedFields(new String[]{"distance","name"});
}
3
Mehmet Sunkur

Cela ressemble à un faux positif malheureux. La règle qui sous-tend cette erreur est faite pour éviter que les propriétés présentes dans un objet mais non destinées à être entrées (non validées) soient accidentellement remplies à partir d'une requête Web. Un exemple serait une demande POST créant une ressource. Si le gestionnaire de demandes utilise l'intégralité de l'objet de ressource et ne remplit que les propriétés manquantes, un utilisateur malveillant pourrait renseigner des champs qu'il ne devrait pas pouvoir modifier.

Ce cas ne correspond toutefois pas au schéma. Vous utilisez simplement le même mécanisme pour capturer vos différents arguments. Les propriétés additionnées ne seront même pas lues. Dans

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

le zipCode supplémentaire serait simplement ignoré. Par conséquent, le risque assumé n'est pas présent ici.

Pour corriger l'avertissement, vous pouvez le marquer comme un faux positif (si cela est possible dans votre configuration). Si cela n’est pas possible, vous pouvez également mapper directement les paramètres de requête aux arguments de méthode. Comme vous avez seulement des paramètres limités qui ne devraient pas nuire beaucoup. Si cela n’est pas non plus une option, vous devrez probablement déterminer l’algorithme exact utilisé par votre analyse de code pour déterminer les contrôles qu’elle reconnaîtra. Malheureusement, la plupart des scanners ne peuvent découvrir qu'un nombre limité de méthodes de validation des entrées.

0

je faisais face au même problème, puis j'ai ajouté le code ci-dessous dans la même classe de contrôleur de repos:

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

maintenant, cela fonctionne bien pour moi et le problème des assignations de masse a été corrigé.

0
Suraj Sharma

Question simple: comment votre mappeur peut-il instancier le bean? Ici est réponse/exemple. Vous pouvez transmettre ces données par query parameter ou dans header. Cependant, ce serait étrange. Mieux vaut avoir ces méthodes avec @QueryParam fournissant l'emplacement ou le nom. De cette façon, il sera plus facile de protéger votre application. 

En outre, la longueur de la requête est limitée. Par conséquent, si votre formulaire de recherche est volumineux et étrange, @POST peut être une bonne idée et ainsi vous pouvez transmettre toutes les données. Pour cela, un exemple simple serait exagéré. 

0
Michał Zaborowski