Pare-feu et formulaires avec champ 'url'

Carl

New Member
#1
Bonjour,

J'ai une application PHP Symfony (projet pour l'école) où il y a un formulaire avec un champ qui doit être rempli avec l'url d'un image disponible en ligne.
Quand je remplis et j'essaie de soumettre le formulaire le pare-feu détecte un 'Remote File Injection Attack' (id 340162).
J'ai cherché à 'assainir' l'entrée avec une fonction comme 'htmlentities' cependant je n'y arrive pas comme le formulaire est fait avec Twig/Symfony.

Quand j'essaie de mettre le filtre après le 'row' entier :
{{ form_row(formformation.miniature)|url_encode() }}
... c'est le champ entier qui s'affiche à l'utilisateur en forme 'encodé' :

1648225936213.png
Si je met le filtre à l'intérieur du 'row' :
{{ form_row(formformation.miniature|url_encode()) }}
... j'ai un message d'erreur comme quoi il attend un string en paramètre et non pas un objet.

Cela fait maintenant un bon moment que je cherche, savez-vous comment résoudre ce problème ?
Merci par avance,
Carl
 

PH-Marc-André.B.

Conseiller technique
Membre du personnel
#2
Bonjour,

Effectivement avec le service World Lite la protection WAF applicative n'est malheureusement pas personnalisable, la solution simple aurait été de désactiver la règle problématique ayant pour ID ( 340162 )


remote file injection attempt in args (ae)

À ce moment là il faudra considérer retirer le champ problématique du formulaire et penser à une façon alternative de partager le l'URL relative à l'image.

N'ayant pas tous les détails sur le code du formulaire serait-ce possible de nous en partager plus?


Ou alors vous serait-ce possible alors de permettre le téléversement d'une image alternativement au lieu d'une URL?
 

Carl

New Member
#3
Bonjour Marc-André,

Malheureusement (contraintes imposées, projet pour l'école etc.) je ne peux changer l'implémentation de ce champ.

Le champ fait partie de ce formulaire :

PHP:
{{ form_start(formformation) }}
    <div class="row mt-3">
        <div class="col">
            {{ form_row(formformation.title) }}
            {{ form_row(formformation.publishedAt) }}
            {{ form_row(formformation.niveau) }}
        </div>
        <div class="col">
            {{ form_row(formformation.picture) }}
            {{ form_row(formformation.miniature) }}
            {{ form_row(formformation.videoId) }}
        </div>
    </div>
    <div class="row">
        <div class="col">
            {{ form_row(formformation.description) }}
        </div>
    </div>
{{ form_end(formformation) }}
Ensuite les champs renvoient à l'entité 'formations' dont voici un extrait :

PHP:
    /**
     * URL qui pointe vers l'image 'miniature' d'une formation, affiché sur les pages qui listent les formations. Peut être vide.
     * @Assert\Length(max=46,maxMessage = "L'url de la miniature ne peut pas excéder {{ limit }} caractères")
     * @ORM\Column(type="string", length=46, nullable=true)
     */
    private $miniature;

    /**
     * URL qui pointe vers l'image 'picture' d'une formation, affiché sur la page qui affiche les détails d'une formation.
     * @Assert\Length(max=48,maxMessage = "L'url de l'image ne peut pas excéder {{ limit }} caractères")
     * @ORM\Column(type="string", length=48, nullable=true)
     */
    private $picture;
Ce qui est étonnant, c'est que le champ 'picture' à exactement le même fonctionnement mais ne déclenche pas le pare-feu...
Dites-moi si vous avez besoin de plus de code :) (je ne veux pas inonder le forum non plus)
Merci !
Carl
 

Carl

New Member
#4
.. Ah oui, voici le 'formType' :

PHP:
class FormationType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options): void {
        $builder
                ->add('publishedAt', DateType::class, [
                    'widget'=>'choice',
                    'format' => 'dd-MMM-yyyy',
                    'label'=>'Parution'
                ])
                ->add('title', TextType::class, [
                    'required'=>true,
                    'label'=>'Titre'
                ])
                ->add('description', TextareaType::class, [
                    'attr' => array('style' => 'height: 20vh'),
                    'required'=>false
                ])
                ->add('miniature', TextType::class, [
                    'label' =>'Miniature (URL, taille 120x90 pixels)',
                    'required'=>false
                ])
                ->add('picture', TextType::class, [
                    'label'=>'Image (URL, taille maximale 640x480 pixels)',
                    'required'=>false
                ])
                ->add('videoId', TextType::class, [
                    'required'=>false
                ])
                ->add('niveau', EntityType::class, [
                    'class' => Niveau::class,
                    'choice_label' => 'libelle',
                    'required'=>true
                    ])
                ->add('Enregistrer', SubmitType::class)
        ;
    }
 

PH-Nick

Support technique Niv 3
Membre du personnel
#5
Bonjour,

Nous comprenons tout à fait, par contre le World lite, ne permet pas de désactivé le pare-feu WAF ou une règle de celui-ci.

Si vous passez sur le plan The World (offert à 50% la première année, quand vous passez de world Lite vers The World) vous allez pouvoir.

Merci
 
Haut