Désolé pour le lag, je suis un peu occupé en ce moment.
Le 03/06/2010 09:59, ricoh51 a écrit :ok, alors prenons un exemple simple : j'ai un espace membre, et je veux
vérifier que le pseudo n'existe pas encore au moment de l'inscription.
J'accepte tous les caractères dans un pseudo, la seule restriction est
que sa longueur doit être comprise entre 6 et 20 caractères. Je fais :
if(isset(pseudo)){ //Vérif du pseudo
$pseudo2 = mysql_real_escape_string($pseudo);
$sql="SELECT COUNT(*) AS verif_exist FROM visiteur WHERE
pseudoVisiteur='$pseudo2'";
$reponse=mysql_query($sql);
$donnees = mysql_fetch_array($reponse);
if ($donnees['verif_exist'] != 0){ // le pseudo existe déja
$erreurPseudo='Ce pseudo existe déjà.';
}
$longueur=mb_strlen($pseudo, 'UTF-8');
if(($longueur<6)||($longueur>20)){
$erreurPseudo='La longueur du pseudo doit être comprise entre 6 et 20
caractères.';
}
}
Ici tu mélange allègrement la logique métier (un pseudo a telle taille)
et la logique de contrôle (aiguillage de la requête).
malheureusement la méthode canonique sous PHP. Je ne vais pas trop m'en
éloigner pour ne pas te perdre, et te proposes plutôt ceci :
<?php
$errors = array('pseudo' => array()) ;
if(isset($pseudo)) // Cette condition n'est pas suffisante
{
$sql = sprintf('SELECT COUNT(*) AS verif_exist FROM visiteur WHERE
pseudoVisiteur = '%s''
, mysql_real_escape_string($pseudo));
mysql_free_result($result) ;
$longueur = mb_strlen($pseudo, 'UTF-8') ; // Es-tu certain d'avoir de
l'UTF-8 en entrée ?
if($longueur < 6 || $longueur > 20)
$errors['pseudo'][] = 'La longueur du pseudo doit être comprise entre 6
et 20 caractères.' ;
}
else
$errors['pseudo'][] = 'Ooops' ;echo '<p>Bonjour ' . htmlentities($_SESSION['pseudo']) . '</p>';
htmlspecialchars suffit amplement.
Ah? Peux tu développer?
<http://shiflett.org/blog/2005/dec/googles-xss-vulnerability>
Désolé pour le lag, je suis un peu occupé en ce moment.
Le 03/06/2010 09:59, ricoh51 a écrit :
ok, alors prenons un exemple simple : j'ai un espace membre, et je veux
vérifier que le pseudo n'existe pas encore au moment de l'inscription.
J'accepte tous les caractères dans un pseudo, la seule restriction est
que sa longueur doit être comprise entre 6 et 20 caractères. Je fais :
if(isset(pseudo)){ //Vérif du pseudo
$pseudo2 = mysql_real_escape_string($pseudo);
$sql="SELECT COUNT(*) AS verif_exist FROM visiteur WHERE
pseudoVisiteur='$pseudo2'";
$reponse=mysql_query($sql);
$donnees = mysql_fetch_array($reponse);
if ($donnees['verif_exist'] != 0){ // le pseudo existe déja
$erreurPseudo='Ce pseudo existe déjà.';
}
$longueur=mb_strlen($pseudo, 'UTF-8');
if(($longueur<6)||($longueur>20)){
$erreurPseudo='La longueur du pseudo doit être comprise entre 6 et 20
caractères.';
}
}
Ici tu mélange allègrement la logique métier (un pseudo a telle taille)
et la logique de contrôle (aiguillage de la requête).
malheureusement la méthode canonique sous PHP. Je ne vais pas trop m'en
éloigner pour ne pas te perdre, et te proposes plutôt ceci :
<?php
$errors = array('pseudo' => array()) ;
if(isset($pseudo)) // Cette condition n'est pas suffisante
{
$sql = sprintf('SELECT COUNT(*) AS verif_exist FROM visiteur WHERE
pseudoVisiteur = '%s''
, mysql_real_escape_string($pseudo));
mysql_free_result($result) ;
$longueur = mb_strlen($pseudo, 'UTF-8') ; // Es-tu certain d'avoir de
l'UTF-8 en entrée ?
if($longueur < 6 || $longueur > 20)
$errors['pseudo'][] = 'La longueur du pseudo doit être comprise entre 6
et 20 caractères.' ;
}
else
$errors['pseudo'][] = 'Ooops' ;
echo '<p>Bonjour ' . htmlentities($_SESSION['pseudo']) . '</p>';
htmlspecialchars suffit amplement.
Ah? Peux tu développer?
<http://shiflett.org/blog/2005/dec/googles-xss-vulnerability>
Désolé pour le lag, je suis un peu occupé en ce moment.
Le 03/06/2010 09:59, ricoh51 a écrit :ok, alors prenons un exemple simple : j'ai un espace membre, et je veux
vérifier que le pseudo n'existe pas encore au moment de l'inscription.
J'accepte tous les caractères dans un pseudo, la seule restriction est
que sa longueur doit être comprise entre 6 et 20 caractères. Je fais :
if(isset(pseudo)){ //Vérif du pseudo
$pseudo2 = mysql_real_escape_string($pseudo);
$sql="SELECT COUNT(*) AS verif_exist FROM visiteur WHERE
pseudoVisiteur='$pseudo2'";
$reponse=mysql_query($sql);
$donnees = mysql_fetch_array($reponse);
if ($donnees['verif_exist'] != 0){ // le pseudo existe déja
$erreurPseudo='Ce pseudo existe déjà.';
}
$longueur=mb_strlen($pseudo, 'UTF-8');
if(($longueur<6)||($longueur>20)){
$erreurPseudo='La longueur du pseudo doit être comprise entre 6 et 20
caractères.';
}
}
Ici tu mélange allègrement la logique métier (un pseudo a telle taille)
et la logique de contrôle (aiguillage de la requête).
malheureusement la méthode canonique sous PHP. Je ne vais pas trop m'en
éloigner pour ne pas te perdre, et te proposes plutôt ceci :
<?php
$errors = array('pseudo' => array()) ;
if(isset($pseudo)) // Cette condition n'est pas suffisante
{
$sql = sprintf('SELECT COUNT(*) AS verif_exist FROM visiteur WHERE
pseudoVisiteur = '%s''
, mysql_real_escape_string($pseudo));
mysql_free_result($result) ;
$longueur = mb_strlen($pseudo, 'UTF-8') ; // Es-tu certain d'avoir de
l'UTF-8 en entrée ?
if($longueur < 6 || $longueur > 20)
$errors['pseudo'][] = 'La longueur du pseudo doit être comprise entre 6
et 20 caractères.' ;
}
else
$errors['pseudo'][] = 'Ooops' ;echo '<p>Bonjour ' . htmlentities($_SESSION['pseudo']) . '</p>';
htmlspecialchars suffit amplement.
Ah? Peux tu développer?
<http://shiflett.org/blog/2005/dec/googles-xss-vulnerability>
merci pour ce lien, je "comprends" maintenant que la sécurité c'est
compliqué :) C'est plutôt flippant je trouve...
Existe-t-il un document du même genre qui donne l'état de l'art (en
2010) pour réaliser un site web avec un espace membre? (pseudo, mot de
passe, mail de confirmation...)
merci pour ce lien, je "comprends" maintenant que la sécurité c'est
compliqué :) C'est plutôt flippant je trouve...
Existe-t-il un document du même genre qui donne l'état de l'art (en
2010) pour réaliser un site web avec un espace membre? (pseudo, mot de
passe, mail de confirmation...)
merci pour ce lien, je "comprends" maintenant que la sécurité c'est
compliqué :) C'est plutôt flippant je trouve...
Existe-t-il un document du même genre qui donne l'état de l'art (en
2010) pour réaliser un site web avec un espace membre? (pseudo, mot de
passe, mail de confirmation...)
oui... pas bien, j'ai déjà eu des périodes d'intégrisme d'abstraction
(pas en php je débute), mais pour des petits projets comme ça, je me
demande si ça vaut bien la peine?
je ne comprends pas cette construction... je ne domine pas assez les
"tableaux" de php je crois :)
$sql = sprintf('SELECT COUNT(*) AS verif_exist FROM visiteur WHERE
pseudoVisiteur = '%s''
, mysql_real_escape_string($pseudo));
ok, ici pour un pseudo, la vérification du type (le %s) n'apporte rien
je pense, mais j'imagine que c'est une bonne habitude à prendre.
mysql_free_result($result) ;
pareil, j'imagine que c'est une bonne habitude à prendre de libérer la
mémoire.
$longueur = mb_strlen($pseudo, 'UTF-8') ; // Es-tu certain d'avoir de
l'UTF-8 en entrée ?
Ma page comporte :
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
et ma base de données est entièrement en utf-8.
echo '<p>Bonjour ' . htmlentities($_SESSION['pseudo']) . '</p>';
htmlspecialchars suffit amplement.
pfff, il faut devenir un vrai pirate pour faire un site sans trop de
trou de sécurité :(
oui... pas bien, j'ai déjà eu des périodes d'intégrisme d'abstraction
(pas en php je débute), mais pour des petits projets comme ça, je me
demande si ça vaut bien la peine?
je ne comprends pas cette construction... je ne domine pas assez les
"tableaux" de php je crois :)
$sql = sprintf('SELECT COUNT(*) AS verif_exist FROM visiteur WHERE
pseudoVisiteur = '%s''
, mysql_real_escape_string($pseudo));
ok, ici pour un pseudo, la vérification du type (le %s) n'apporte rien
je pense, mais j'imagine que c'est une bonne habitude à prendre.
mysql_free_result($result) ;
pareil, j'imagine que c'est une bonne habitude à prendre de libérer la
mémoire.
$longueur = mb_strlen($pseudo, 'UTF-8') ; // Es-tu certain d'avoir de
l'UTF-8 en entrée ?
Ma page comporte :
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
et ma base de données est entièrement en utf-8.
echo '<p>Bonjour ' . htmlentities($_SESSION['pseudo']) . '</p>';
htmlspecialchars suffit amplement.
pfff, il faut devenir un vrai pirate pour faire un site sans trop de
trou de sécurité :(
oui... pas bien, j'ai déjà eu des périodes d'intégrisme d'abstraction
(pas en php je débute), mais pour des petits projets comme ça, je me
demande si ça vaut bien la peine?
je ne comprends pas cette construction... je ne domine pas assez les
"tableaux" de php je crois :)
$sql = sprintf('SELECT COUNT(*) AS verif_exist FROM visiteur WHERE
pseudoVisiteur = '%s''
, mysql_real_escape_string($pseudo));
ok, ici pour un pseudo, la vérification du type (le %s) n'apporte rien
je pense, mais j'imagine que c'est une bonne habitude à prendre.
mysql_free_result($result) ;
pareil, j'imagine que c'est une bonne habitude à prendre de libérer la
mémoire.
$longueur = mb_strlen($pseudo, 'UTF-8') ; // Es-tu certain d'avoir de
l'UTF-8 en entrée ?
Ma page comporte :
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
et ma base de données est entièrement en utf-8.
echo '<p>Bonjour ' . htmlentities($_SESSION['pseudo']) . '</p>';
htmlspecialchars suffit amplement.
pfff, il faut devenir un vrai pirate pour faire un site sans trop de
trou de sécurité :(
Lorsqu'on envoie des données à travers une
interface, il faut toujours s'assurer d'utiliser la fonction qui filtre
le mieux la donnée.
(par exemple mysql_real_escape_string dans le cas de l'usage du module
mysql), est la seule solution valable.
Et c'est comme ça qu'on se retrouve avec des entités HTML au beau
milieu de documents PDF ou d'images sans même s'en rendre compte.
Je considère la base de données comme une source extérieure de données (une
base de données est faite pour être partagée, c'est une vue persistante
des données métiers).
Beaucoup de choses avec lesquelles je ne suis pas d'accord, mais on ne
va pas troller :p
Lorsqu'on envoie des données à travers une
interface, il faut toujours s'assurer d'utiliser la fonction qui filtre
le mieux la donnée.
(par exemple mysql_real_escape_string dans le cas de l'usage du module
mysql), est la seule solution valable.
Et c'est comme ça qu'on se retrouve avec des entités HTML au beau
milieu de documents PDF ou d'images sans même s'en rendre compte.
Je considère la base de données comme une source extérieure de données (une
base de données est faite pour être partagée, c'est une vue persistante
des données métiers).
Beaucoup de choses avec lesquelles je ne suis pas d'accord, mais on ne
va pas troller :p
Lorsqu'on envoie des données à travers une
interface, il faut toujours s'assurer d'utiliser la fonction qui filtre
le mieux la donnée.
(par exemple mysql_real_escape_string dans le cas de l'usage du module
mysql), est la seule solution valable.
Et c'est comme ça qu'on se retrouve avec des entités HTML au beau
milieu de documents PDF ou d'images sans même s'en rendre compte.
Je considère la base de données comme une source extérieure de données (une
base de données est faite pour être partagée, c'est une vue persistante
des données métiers).
Beaucoup de choses avec lesquelles je ne suis pas d'accord, mais on ne
va pas troller :p
Lorsqu'on envoie des données à travers une interface, il faut toujours
s'assurer d'utiliser la fonction qui filtre le mieux la donnée.
Et donc si tu as une webapp qui doit parler à plusieurs SGBDR, il est
donc nul et non avenu de parler de mysql_realmachin ou quoi que ce soit
d'autre. Ce que je veux dire par querelle de clocher c'est que 10
développeurs différents donneront 10 manières différentes de gérer
l'échappement des quotes en SQL selon qu'ils ont l'habitude de
travailler avec mysql, oracle, sybase (qui n'échape pas avec mais avec
une autre '), et je ne parle pas des bidouilles avec access ou autres.
(par exemple mysql_real_escape_string dans le cas de l'usage du module
mysql), est la seule solution valable.
Et si tu as Sybase c'est mort.
Et c'est comme ça qu'on se retrouve avec des entités HTML au beau
milieu de documents PDF ou d'images sans même s'en rendre compte.
Et si on ne le fait pas c'est comme ça comme se retrouve comme un con
avec un PDF qui est en train d'embarquer du JS offensif et est devenu
vecteur d'attaque. Pas plus tard qu'il y a trois jours, l'ISC rappelait
que 28% des attaques de malware sont désormais sur vecteur PDF...
http://isc.sans.edu/diary.html?date 10-06-09
Troisième article.
C'est une possibilité, je dis juste que cette approche nécessite un
niveau élevé de conscience du danger qu'elle
implique et qu'il est **évident** qu'un jour une autre personne qui
travaille avec cette base, aujourd'hui ou après ton départ, se fera
tarter parce que c'est pas "naturellement sécurisé" comme approche et
surtout non intuitif. Une fois de plus: tout l'enjeu est de comprendre
ce que l'on fait, avantages et inconvénients.
Beaucoup de choses avec lesquelles je ne suis pas d'accord, mais on ne
va pas troller :p
On peut aussi discuter sans troller... Je n'ai pas la parole divine,
loin s'en faut.
Lorsqu'on envoie des données à travers une interface, il faut toujours
s'assurer d'utiliser la fonction qui filtre le mieux la donnée.
Et donc si tu as une webapp qui doit parler à plusieurs SGBDR, il est
donc nul et non avenu de parler de mysql_realmachin ou quoi que ce soit
d'autre. Ce que je veux dire par querelle de clocher c'est que 10
développeurs différents donneront 10 manières différentes de gérer
l'échappement des quotes en SQL selon qu'ils ont l'habitude de
travailler avec mysql, oracle, sybase (qui n'échape pas avec mais avec
une autre '), et je ne parle pas des bidouilles avec access ou autres.
(par exemple mysql_real_escape_string dans le cas de l'usage du module
mysql), est la seule solution valable.
Et si tu as Sybase c'est mort.
Et c'est comme ça qu'on se retrouve avec des entités HTML au beau
milieu de documents PDF ou d'images sans même s'en rendre compte.
Et si on ne le fait pas c'est comme ça comme se retrouve comme un con
avec un PDF qui est en train d'embarquer du JS offensif et est devenu
vecteur d'attaque. Pas plus tard qu'il y a trois jours, l'ISC rappelait
que 28% des attaques de malware sont désormais sur vecteur PDF...
http://isc.sans.edu/diary.html?date 10-06-09
Troisième article.
C'est une possibilité, je dis juste que cette approche nécessite un
niveau élevé de conscience du danger qu'elle
implique et qu'il est **évident** qu'un jour une autre personne qui
travaille avec cette base, aujourd'hui ou après ton départ, se fera
tarter parce que c'est pas "naturellement sécurisé" comme approche et
surtout non intuitif. Une fois de plus: tout l'enjeu est de comprendre
ce que l'on fait, avantages et inconvénients.
Beaucoup de choses avec lesquelles je ne suis pas d'accord, mais on ne
va pas troller :p
On peut aussi discuter sans troller... Je n'ai pas la parole divine,
loin s'en faut.
Lorsqu'on envoie des données à travers une interface, il faut toujours
s'assurer d'utiliser la fonction qui filtre le mieux la donnée.
Et donc si tu as une webapp qui doit parler à plusieurs SGBDR, il est
donc nul et non avenu de parler de mysql_realmachin ou quoi que ce soit
d'autre. Ce que je veux dire par querelle de clocher c'est que 10
développeurs différents donneront 10 manières différentes de gérer
l'échappement des quotes en SQL selon qu'ils ont l'habitude de
travailler avec mysql, oracle, sybase (qui n'échape pas avec mais avec
une autre '), et je ne parle pas des bidouilles avec access ou autres.
(par exemple mysql_real_escape_string dans le cas de l'usage du module
mysql), est la seule solution valable.
Et si tu as Sybase c'est mort.
Et c'est comme ça qu'on se retrouve avec des entités HTML au beau
milieu de documents PDF ou d'images sans même s'en rendre compte.
Et si on ne le fait pas c'est comme ça comme se retrouve comme un con
avec un PDF qui est en train d'embarquer du JS offensif et est devenu
vecteur d'attaque. Pas plus tard qu'il y a trois jours, l'ISC rappelait
que 28% des attaques de malware sont désormais sur vecteur PDF...
http://isc.sans.edu/diary.html?date 10-06-09
Troisième article.
C'est une possibilité, je dis juste que cette approche nécessite un
niveau élevé de conscience du danger qu'elle
implique et qu'il est **évident** qu'un jour une autre personne qui
travaille avec cette base, aujourd'hui ou après ton départ, se fera
tarter parce que c'est pas "naturellement sécurisé" comme approche et
surtout non intuitif. Une fois de plus: tout l'enjeu est de comprendre
ce que l'on fait, avantages et inconvénients.
Beaucoup de choses avec lesquelles je ne suis pas d'accord, mais on ne
va pas troller :p
On peut aussi discuter sans troller... Je n'ai pas la parole divine,
loin s'en faut.