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