On Mon, Dec 15, 2003 at 11:17:45PM +0100, Philippe Ney wrote:
> Escaper aussi les ' ou les " (je ne sais plus exactement) en cas d'�dition
> multiple pour pas qu'ils se multiplient tout seul comme des grands.

Je pr�f�re le concept de binding: l'id�e �tant qu'au lieu de passer du
traitement de texte SQL on passe des *variables* aux routines d'acc�s
aux bases de donn�es.

Ces variables sont alors transmises au moteur SQL d'une mani�re s�re
(par r�f�rence ou par escaping sp�cifique � chaque base de donn�es).

C'est notamment support� par Perl/DBI, et je m'�tonne que d'autres
langages n'aient pas encore impl�ment� cela.

Exemple:

   if (do_query($dbh,
                'SELECT id FROM event '
                . 'WHERE (code = ?) '
                . 'AND (latest_inscription_date >= CURRENT_DATE)',
                [EMAIL PROTECTED],
                [EMAIL PROTECTED],
                [ $event_code ],
                undef,
                $error_reason_reference)) {

ici $event_code n'a pas besoin d'�tre contr�l� vu qu'il est associ�
� la requ�te par binding ('?') ... encore que cela ne g�ne jamais
de le faire.

J'ai con�u quelques wrappers autour de CGI et de DBI qui permettent
de d�finir des forms par des structures:

      my %person_struct
         = (1 => { 'name'  => 'email_address',
                   'descr' => 'Adresse e-mail',
                   'type'  => 'textfield',
                   'specification' => '[EMAIL PROTECTED]',
                   'check' => \&form_valid_email,
                 },
            2 => { 'name'  => 'type',
                   'descr' => 'Type',
                   'type'  => 'list',
                   'values' => { 'type' => 'list',
                                 'items' => { 'pop_user' => 'Compte POP/IMAP',
                                              'redirection' => 'Redirection' }
                               },
                   'check' => \&form_valid_in_list_values
                 },
            3 => { 'name' => 'country',
                   'descr' => 'Pays',
                   'type' => 'list',
                   'values' => { 'type' => 'function',
                                 'function' => \&form_sql_query,
                                 'dbh' => $dbh,
                                 'query'
                                    => "SELECT id, name || ' (' || CAST(id AS VARCHAR) 
|| ')' as description FROM country",
                                 'label' => 'id',
                                 'value' => 'description',
                                 'default' => 'CH'
                               },
                   'check' => \&form_valid_in_list_values
                 });

La g�n�ration de la form se fait par la structure:

         $what = form_create($query,
                             \%person_struct,
                             $myself,
                             { 'mode' => 'create' },
                             $dont_clean,
                             \$error_reason);

Une fois la form trait�e, on peut appeler une fonction de validation
qui v�rifie que tous les param�tres n�cessaires (non optionnels) sont
l� et que leur contenu est correct.  La validation peut aussi se faire
en dernier recours dans la base de donn�es.

            if (form_validate_input($query,
                                    \%person_struct,
                                    \%param_hash,
                                    [EMAIL PROTECTED])) {

Si l'application est totalement form-driven, tous ces tests
peuvent se faire automatiquement.

Le traitement de texte SQL est une des causes les plus fr�quentes
d'attaques; les m�thodes automatis�es (genre magic_quotes de MySQL) sont
souvent plus probl�matiques vu qu'elles provoquent pas mal de probl�me.

Un autre probl�me est que toute valeur sous contr�le de l'utilisateur
(p.ex. r�sultat d'une base de donn�es) doit �tre prot�g�e � la sortie
(uri_escape() pour les URLs; encode_entities() pour le texte HTML).

Sinon des attaques de cross-scripting sont possibles.

Un autre probl�me tr�s fr�quent en PHP se pose lorsque l'espace des
variables du script est le m�me que l'espace des variables du forms: un
attaquant peut alors modifier ou du moins initialiser n'importe quelle
variable du script.

PS: les diff�rents packages pr�sent�s sont disponibles en package
    Debian sur packages.cril.ch, et en source sur cvs.alphanet.ch
    schaefer/public/packages et sont GPL. Ces scripts ont �t�
    cr��s principalement pour am�liorer la s�curit� et la maintenabilit�
    de code (�viter de retaper). Pas pour la beaut� visuelle
    ou l'efficacit�.

    gppds
       Acc�s simplifi� � PostgreSQL

    cril-perl-support
       Module de configuration, de logging et diverses autres petites
       choses

    cgi-support
       G�n�ration de form, pr�sentation simple de r�sultats, validation.

    inscription
       Exemple d'impl�mentation simple (pas encore parfaite, il y a
       encore du travail pour supprimer le code glue).

PS/2: il y a d'autres modules tr�s sympas d'acc�s SQL en Perl sur CPAN,
      notamment un qui �vite compl�tement le traitement de texte,
      mais je n'ai plus la r�f�rence.

_______________________________________________
gull mailing list
[EMAIL PROTECTED]
http://lists.alphanet.ch/mailman/listinfo/gull

Répondre à