Access refused to ... by SQL or Script injection protection in main.inc.php

Bonjour,
Je tente de déplacer une application qui accède à l’API REST de Dolibarr vers un conteneur Docker. La requête permet d’une part d’interroger la base des tiers, puis de générer une facture. Tout ceci fonctionnait jusqu’à maintenant en ayant le même serveur apache pour Dolibarr et l’application. J’ai mis l’adresse IP du serveur comme destinataire de la requête. Cette requête est envoyée par le PHP avec curl.
Maintenant, même si le conteneur Docker est sur la même machine, ça coince à la première requête. Voici ce que je vois dans les logs du serveur Dolibarr :

[proxy_fcgi:error] [pid 190942] [client 172.19.0.3:36590] AH01071: Got error 'PHP message: Access refused to 172.19.0.3 by SQL or Script injection protection in main.inc.php - GETPOST type=1 paramkey=0 paramvalue=sqlfilters=(t.nom like "MON CLIENT%") page=/dolibarr/htdocs/api/index.php/thirdparties?sqlfilters=%28t.nom+like+%22MON+CLIENT%25%22%29'

J’avoue que je suis perdu et je ne sais pas par quel bout prendre le problème.
A titre d’essai, j’ai désactivé le pare-feu, donc la question n’est pas de ce côté.
Une piste ?

PS: Je dois préciser aussi que je viens de faire une mise à niveau de v11 vers v16.
Il se peut donc que le souci ne vienne pas de la dockerisation, mais de la mise à niveau.
PS2: Je viens de tester sur mon ancienne installation : le problème est le même. En fait, le problème doit apparaître pour les noms recherchés qui incluent un espace. C’est le code de Dolibarr qui met en œuvre une protection en considérant qu’il y a un risque d’injection de code.
Ma fonction n’a pourtant pas l’air méchante:


        // Search for client correspondence in Dolibarr
        $curl = curl_init();
        $httpheader = ['DOLAPIKEY: ' . $apikey];
        $data = ['sqlfilters' => '(t.nom like "' . $client . '%")'];

        // Get from config
        $url = config('api.dolibarr_url') . "/thirdparties?" . http_build_query($data);
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $httpheader);
        $result = curl_exec($curl);
        curl_close($curl);
        return json_decode($result, true);

Bonjour,

Changez la requête par

(t.nom:like:'MONCLIENT%')

vous pouvez tester les requêtes via l’explorer (/api/index.php/explorer/) pour être sûr que le reste de votre script ne va pas poser souci.

1 « J'aime »

Parfait,
J’ai mis précisément:

        $data = ['sqlfilters' => "(t.nom:like:'" . $client . "%')"];