J'ai vraiment du mal à voir le problème : tous les langages raisonnables
sont capables de manipuler des chaînes de caractères « inertes », qui ne
provoqueront pas d'exécution surprise. C'est le cas du HTML par remplacement
de <, > et & par des entités nommées ; c'est le cas de PostgreSQL (les
champs de type text, char, varchar, et les blob), et j'ose espérer que les
autres gestionnaires de bases de données sont dans le même cas ; c'est le
cas de perl (une variable de type scalaire), et j'ose espérer que PHP ne
diffère pas là-dessus.
Donc pour répondre au cas évoqué plus haut : si dans un formulaire
l'utilisateur tape « <script type='text/javascript'> » on reçoit
« %3cscript+type=%27text%2fjavascript%27%3e » (si c'est un GET), qu'on
transforme immédiatement en « <script type='text/javascript'> » parfaitement
inerte. Pour l'envoyer au serveur de bases de données, on l'écrit
« '<script type='text/javascript'>' » (car < et > ne sont pas des
caractères spéciaux pour SQL, mais ' l'est), qui le décode assez rapidement
en « <script type='text/javascript'> » (toujours la même chose, toujours
inerte) et le stocke.
Quand on consulte la valeur, après décodage de la réponse SQL, on obtient à
nouveau la chaîne inerte « <script type='text/javascript'> ». Et si on veut
l'envoyer dans une page web, on encode ça en « <script
type='text/javascript'> », rien de plus.
Mais
idéalement, il faudrait _quand même_ décomposer ça suivant la grammaire du
sous-ensemble de HTML choisi, et recomposer ensuite le HTML à l'envoi.
_peut_ même s'en sortir (par exemple avec un traitement par expressions
rationnelles qui du style s{<(?!/?(:?em|b)>)/</g (c'est crade, ça laisse
traîner les >, ce qui est légal il me semble mais pas beau ; ne pas
réutiliser ce code en vrai !) pour n'autoriser que <em>, </em>, <b> et </b>
et rendre inerte toute autre balise). Mais c'est casse-figure.
J'ai vraiment du mal à voir le problème : tous les langages raisonnables
sont capables de manipuler des chaînes de caractères « inertes », qui ne
provoqueront pas d'exécution surprise. C'est le cas du HTML par remplacement
de <, > et & par des entités nommées ; c'est le cas de PostgreSQL (les
champs de type text, char, varchar, et les blob), et j'ose espérer que les
autres gestionnaires de bases de données sont dans le même cas ; c'est le
cas de perl (une variable de type scalaire), et j'ose espérer que PHP ne
diffère pas là-dessus.
Donc pour répondre au cas évoqué plus haut : si dans un formulaire
l'utilisateur tape « <script type='text/javascript'> » on reçoit
« %3cscript+type=%27text%2fjavascript%27%3e » (si c'est un GET), qu'on
transforme immédiatement en « <script type='text/javascript'> » parfaitement
inerte. Pour l'envoyer au serveur de bases de données, on l'écrit
« '<script type='text/javascript'>' » (car < et > ne sont pas des
caractères spéciaux pour SQL, mais ' l'est), qui le décode assez rapidement
en « <script type='text/javascript'> » (toujours la même chose, toujours
inerte) et le stocke.
Quand on consulte la valeur, après décodage de la réponse SQL, on obtient à
nouveau la chaîne inerte « <script type='text/javascript'> ». Et si on veut
l'envoyer dans une page web, on encode ça en « <script
type='text/javascript'> », rien de plus.
Mais
idéalement, il faudrait _quand même_ décomposer ça suivant la grammaire du
sous-ensemble de HTML choisi, et recomposer ensuite le HTML à l'envoi.
_peut_ même s'en sortir (par exemple avec un traitement par expressions
rationnelles qui du style s{<(?!/?(:?em|b)>)/</g (c'est crade, ça laisse
traîner les >, ce qui est légal il me semble mais pas beau ; ne pas
réutiliser ce code en vrai !) pour n'autoriser que <em>, </em>, <b> et </b>
et rendre inerte toute autre balise). Mais c'est casse-figure.
J'ai vraiment du mal à voir le problème : tous les langages raisonnables
sont capables de manipuler des chaînes de caractères « inertes », qui ne
provoqueront pas d'exécution surprise. C'est le cas du HTML par remplacement
de <, > et & par des entités nommées ; c'est le cas de PostgreSQL (les
champs de type text, char, varchar, et les blob), et j'ose espérer que les
autres gestionnaires de bases de données sont dans le même cas ; c'est le
cas de perl (une variable de type scalaire), et j'ose espérer que PHP ne
diffère pas là-dessus.
Donc pour répondre au cas évoqué plus haut : si dans un formulaire
l'utilisateur tape « <script type='text/javascript'> » on reçoit
« %3cscript+type=%27text%2fjavascript%27%3e » (si c'est un GET), qu'on
transforme immédiatement en « <script type='text/javascript'> » parfaitement
inerte. Pour l'envoyer au serveur de bases de données, on l'écrit
« '<script type='text/javascript'>' » (car < et > ne sont pas des
caractères spéciaux pour SQL, mais ' l'est), qui le décode assez rapidement
en « <script type='text/javascript'> » (toujours la même chose, toujours
inerte) et le stocke.
Quand on consulte la valeur, après décodage de la réponse SQL, on obtient à
nouveau la chaîne inerte « <script type='text/javascript'> ». Et si on veut
l'envoyer dans une page web, on encode ça en « <script
type='text/javascript'> », rien de plus.
Mais
idéalement, il faudrait _quand même_ décomposer ça suivant la grammaire du
sous-ensemble de HTML choisi, et recomposer ensuite le HTML à l'envoi.
_peut_ même s'en sortir (par exemple avec un traitement par expressions
rationnelles qui du style s{<(?!/?(:?em|b)>)/</g (c'est crade, ça laisse
traîner les >, ce qui est légal il me semble mais pas beau ; ne pas
réutiliser ce code en vrai !) pour n'autoriser que <em>, </em>, <b> et </b>
et rendre inerte toute autre balise). Mais c'est casse-figure.
Autrement dit ma question est : comment *rendre* inerte un code
offensif, dont je ne connais pas la nature par définition (JS, VB, aspx,
active-X, applet-java, cobol-objet embarqué déguisé en concombre masqué,
etc...)
On le stocke et donc quand on le demande à la base elle va bien renvoyer
du code JS valide n'est-ce pas ? C'est justement ça que je veux éviter.
Oui mais non, parce qu'il faut penser à le faire dans TOUTES les
applications qui accèdent à la base.
Est-ce que ce
brave IE (au hasard....) ne serait pas capable de recoller les morceaux
si on lui donne un activeX sous une forme ou sous une autre qui serait
immunisée à une transformation en html entities ?
Donc si je comprends bien : ou on utilise des balises "propriétaires" ou
pas (en les calquant par exemple sur un autre langage incompatible avec
html), mais dans tous les cas, on ne transforme pas en entités html un
certain nombre de balises qu'on a spécifiquement autorisées.
Pourquoi est-ce casse figure ?
Autrement dit ma question est : comment *rendre* inerte un code
offensif, dont je ne connais pas la nature par définition (JS, VB, aspx,
active-X, applet-java, cobol-objet embarqué déguisé en concombre masqué,
etc...)
On le stocke et donc quand on le demande à la base elle va bien renvoyer
du code JS valide n'est-ce pas ? C'est justement ça que je veux éviter.
Oui mais non, parce qu'il faut penser à le faire dans TOUTES les
applications qui accèdent à la base.
Est-ce que ce
brave IE (au hasard....) ne serait pas capable de recoller les morceaux
si on lui donne un activeX sous une forme ou sous une autre qui serait
immunisée à une transformation en html entities ?
Donc si je comprends bien : ou on utilise des balises "propriétaires" ou
pas (en les calquant par exemple sur un autre langage incompatible avec
html), mais dans tous les cas, on ne transforme pas en entités html un
certain nombre de balises qu'on a spécifiquement autorisées.
Pourquoi est-ce casse figure ?
Autrement dit ma question est : comment *rendre* inerte un code
offensif, dont je ne connais pas la nature par définition (JS, VB, aspx,
active-X, applet-java, cobol-objet embarqué déguisé en concombre masqué,
etc...)
On le stocke et donc quand on le demande à la base elle va bien renvoyer
du code JS valide n'est-ce pas ? C'est justement ça que je veux éviter.
Oui mais non, parce qu'il faut penser à le faire dans TOUTES les
applications qui accèdent à la base.
Est-ce que ce
brave IE (au hasard....) ne serait pas capable de recoller les morceaux
si on lui donne un activeX sous une forme ou sous une autre qui serait
immunisée à une transformation en html entities ?
Donc si je comprends bien : ou on utilise des balises "propriétaires" ou
pas (en les calquant par exemple sur un autre langage incompatible avec
html), mais dans tous les cas, on ne transforme pas en entités html un
certain nombre de balises qu'on a spécifiquement autorisées.
Pourquoi est-ce casse figure ?
Ce source unique simplifie grandement la maintenance (tout est au même
endroit) et est plus lisible qu'une multitude de fichiers disséminés un
peu partout dont on oublie le fil à force de passer de l'un à l'autre.
Dans sécurité il y a simplicité et bon sens.
Donc c'est dans cette "simplicité" apportée par cette méthode de
développement que se trouve le "plus" de sécurité ou j'ai loupé autre
chose ?
Sur le fond je suis plutôt d'accord avec db.
Autant je m'oppose à son système d'état *si* celui ci empêche un surf
Attention j'ai bien précisé que le site doit l'accepter.
agréable autant l'idée de ne pas avoir à fouiller à droite et à gauche
pour une modif même mineure favorise la maintenance et donc (amha) la
sécurité.
(...)
Par contre (db me corrigera si je me trompe! :) ) db voit aussi un plus
sécurité sur le côté mono-état (automate) de son appli.
mono-état est faux. Inutile de parler d'automate s'il n'y a qu'un seul état.
Ce n'est pas
faux mais je pense qu'on peut faire aussi sur en posant moins de
contrainte sur l'utilisateur (par contre le concepteur a intérêt à bien
cogiter avant de se lancer!)[1]
C'est bien là un gros souci. Il est TRES TRES rare que le concepteur
; << je suis confu, la procédure que je vous ai livrée en avant-projet
n'est plus en vigueur depuis 6 mois, c'est Chantal mon assistante qui me
[paragraphe sur les exceptions]M'enfin ce n'est pas le sujet.
Agreed.
Disagreed :) Voir plus basMême si en PHP je crains que ça ne conduise à de belles horreurs
car il va falloir faire la chasse aux exceptions non catchées lors des
tests unitaires (à la charge des développeurs donc) vu que ce n'est pas
un langage compilé. Faudra que je vérifie si en lançant un php -q
toto.php le moteur est capable de signaler les exceptions non catchées.
Le non traitement des erreurs (par exceptions ou pas) peut être un
facteur important d'insécurité. Il arrive (trop) fréquement qu'en
surfant sur un site on tombe sur un jouli rapport d'erreur créé par le
moteur de l'appli avec les scripts et les chemins qui vont avec (merci
pour l'info, sans compter que ça permet souvent d'identifier le
framework qu'il y a derrière) quand ce n'est pas le nom des tables, des
champs, voire un tuple complet :)
Oui, ok mais bon quand on développe on essaye d'aller jusqu'au bout de la
Ce source unique simplifie grandement la maintenance (tout est au même
endroit) et est plus lisible qu'une multitude de fichiers disséminés un
peu partout dont on oublie le fil à force de passer de l'un à l'autre.
Dans sécurité il y a simplicité et bon sens.
Donc c'est dans cette "simplicité" apportée par cette méthode de
développement que se trouve le "plus" de sécurité ou j'ai loupé autre
chose ?
Sur le fond je suis plutôt d'accord avec db.
Autant je m'oppose à son système d'état *si* celui ci empêche un surf
Attention j'ai bien précisé que le site doit l'accepter.
agréable autant l'idée de ne pas avoir à fouiller à droite et à gauche
pour une modif même mineure favorise la maintenance et donc (amha) la
sécurité.
(...)
Par contre (db me corrigera si je me trompe! :) ) db voit aussi un plus
sécurité sur le côté mono-état (automate) de son appli.
mono-état est faux. Inutile de parler d'automate s'il n'y a qu'un seul état.
Ce n'est pas
faux mais je pense qu'on peut faire aussi sur en posant moins de
contrainte sur l'utilisateur (par contre le concepteur a intérêt à bien
cogiter avant de se lancer!)[1]
C'est bien là un gros souci. Il est TRES TRES rare que le concepteur
; << je suis confu, la procédure que je vous ai livrée en avant-projet
n'est plus en vigueur depuis 6 mois, c'est Chantal mon assistante qui me
[paragraphe sur les exceptions]
M'enfin ce n'est pas le sujet.
Agreed.
Disagreed :) Voir plus bas
Même si en PHP je crains que ça ne conduise à de belles horreurs
car il va falloir faire la chasse aux exceptions non catchées lors des
tests unitaires (à la charge des développeurs donc) vu que ce n'est pas
un langage compilé. Faudra que je vérifie si en lançant un php -q
toto.php le moteur est capable de signaler les exceptions non catchées.
Le non traitement des erreurs (par exceptions ou pas) peut être un
facteur important d'insécurité. Il arrive (trop) fréquement qu'en
surfant sur un site on tombe sur un jouli rapport d'erreur créé par le
moteur de l'appli avec les scripts et les chemins qui vont avec (merci
pour l'info, sans compter que ça permet souvent d'identifier le
framework qu'il y a derrière) quand ce n'est pas le nom des tables, des
champs, voire un tuple complet :)
Oui, ok mais bon quand on développe on essaye d'aller jusqu'au bout de la
Ce source unique simplifie grandement la maintenance (tout est au même
endroit) et est plus lisible qu'une multitude de fichiers disséminés un
peu partout dont on oublie le fil à force de passer de l'un à l'autre.
Dans sécurité il y a simplicité et bon sens.
Donc c'est dans cette "simplicité" apportée par cette méthode de
développement que se trouve le "plus" de sécurité ou j'ai loupé autre
chose ?
Sur le fond je suis plutôt d'accord avec db.
Autant je m'oppose à son système d'état *si* celui ci empêche un surf
Attention j'ai bien précisé que le site doit l'accepter.
agréable autant l'idée de ne pas avoir à fouiller à droite et à gauche
pour une modif même mineure favorise la maintenance et donc (amha) la
sécurité.
(...)
Par contre (db me corrigera si je me trompe! :) ) db voit aussi un plus
sécurité sur le côté mono-état (automate) de son appli.
mono-état est faux. Inutile de parler d'automate s'il n'y a qu'un seul état.
Ce n'est pas
faux mais je pense qu'on peut faire aussi sur en posant moins de
contrainte sur l'utilisateur (par contre le concepteur a intérêt à bien
cogiter avant de se lancer!)[1]
C'est bien là un gros souci. Il est TRES TRES rare que le concepteur
; << je suis confu, la procédure que je vous ai livrée en avant-projet
n'est plus en vigueur depuis 6 mois, c'est Chantal mon assistante qui me
[paragraphe sur les exceptions]M'enfin ce n'est pas le sujet.
Agreed.
Disagreed :) Voir plus basMême si en PHP je crains que ça ne conduise à de belles horreurs
car il va falloir faire la chasse aux exceptions non catchées lors des
tests unitaires (à la charge des développeurs donc) vu que ce n'est pas
un langage compilé. Faudra que je vérifie si en lançant un php -q
toto.php le moteur est capable de signaler les exceptions non catchées.
Le non traitement des erreurs (par exceptions ou pas) peut être un
facteur important d'insécurité. Il arrive (trop) fréquement qu'en
surfant sur un site on tombe sur un jouli rapport d'erreur créé par le
moteur de l'appli avec les scripts et les chemins qui vont avec (merci
pour l'info, sans compter que ça permet souvent d'identifier le
framework qu'il y a derrière) quand ce n'est pas le nom des tables, des
champs, voire un tuple complet :)
Oui, ok mais bon quand on développe on essaye d'aller jusqu'au bout de la
(re)bonjour,
Merci pour cette explication sur les principes mis en oeuvre. Je pense
avoir compris (à peu près) le résultat, mais j'ai du mal à voir en quoi
ça apporte un "plus" de sécurité.
L'histoire du script unique (*) apporte un gain indirect.
Justement c'est là que ça coince : la mesure du possible. Sans rentrer
dans un probème de confort de l'utilisateur, il y a des zones de type
"données mortes" (genre textearea stockées en TEXT ou BLOB ou je sais
pas quoi en base parce l'application en a besoin) mais dans lesquels à
part les ~ ^ et à la limite | tous les autres caractères sont
explicitement autorisés arce que l'utilisateur peut parfaitement avoir
BESOIN de les saisir.
Je sais que ce type de saisie ouverte doit être acceptée parfois (Wiki,
Donc tu détermines l'état courant en fonction d'un arbre de décision
(les switch et sous-switch) selon les données reçues du monde extérieur
par l'url/post. Mais en quoi est-ce que ça te blinde contre une
injection SQL quand tu dois aller faire une requête en SGBD pour
vérifier que le login et le mot de passe que tu as reçus de ton
formulaire sont corrects ? Je conçois qu'on puise y voir une propreté ou
une simplicité de codage (chacun voit midi à sa porte) mais je ne vois
pas où est la valeur ajoutée en termes de sécurité.
Voir plus haut. Cette section n'avait pas trait à la sécurité directement.
Ce source unique simplifie grandement la maintenance (tout est au même
endroit) et est plus lisible qu'une multitude de fichiers disséminés un
peu partout dont on oublie le fil à force de passer de l'un à l'autre.
Dans sécurité il y a simplicité et bon sens.
Donc c'est dans cette "simplicité" apportée par cette méthode de
développement que se trouve le "plus" de sécurité ou j'ai loupé autre
chose ?
Entre autres oui, voir plus haut.
Le pb du premier vol d'Ariane V était, si mes souvenirs sont bons, une
consigne de vol (vitesse horizontale) qui n'avait pas été changée par
rapport à Ariane IV. Même sans gestion par exception la catastrophe était
annoncée.
Si la mienne est bonne aussi, c'était une exception mathématique non
trappée qui s'est propagée jusqu'au niveau le plus haut et là il n'y a
plus eut qu'une seule chose à faire : transformer le biniou en gros
pétard de feu d'artifice du 14 juillet.
Il serait arrivé la même chose dans le cas d'une gestion d'erreur locale si
Pour la petite histoire ce n'est pas forcément une querelle de
presbytères mais une question de priorité. Gérer les erreurs au niveau le
plus bas c'est sans doute intellectuellement satisfaisant mais conduit
irrémédiablement à un code lourd.
Pour moi ça dépend du type d'applications et de la gravité des erreurs.
Prenons par exemple l'échec de connexion au SGBD. Dans beaucoup de cas,
et presque tout le temps si on est pas en daemon, on va de toutes façons
arrêter le programme sans autre forme de procès.
Arrêter la requête tu veux dire ? N'oublies pas que nous parlons
M'enfin ce n'est pas le sujet.
Agreed. Même si en PHP je crains que ça ne conduise à de belles horreurs
car il va falloir faire la chasse aux exceptions non catchées lors des
tests unitaires (à la charge des développeurs donc) vu que ce n'est pas
un langage compilé. Faudra que je vérifie si en lançant un php -q
toto.php le moteur est capable de signaler les exceptions non catchées.
C'est l'intérêt du throws de Java du reste.
(re)bonjour,
Merci pour cette explication sur les principes mis en oeuvre. Je pense
avoir compris (à peu près) le résultat, mais j'ai du mal à voir en quoi
ça apporte un "plus" de sécurité.
L'histoire du script unique (*) apporte un gain indirect.
Justement c'est là que ça coince : la mesure du possible. Sans rentrer
dans un probème de confort de l'utilisateur, il y a des zones de type
"données mortes" (genre textearea stockées en TEXT ou BLOB ou je sais
pas quoi en base parce l'application en a besoin) mais dans lesquels à
part les ~ ^ et à la limite | tous les autres caractères sont
explicitement autorisés arce que l'utilisateur peut parfaitement avoir
BESOIN de les saisir.
Je sais que ce type de saisie ouverte doit être acceptée parfois (Wiki,
Donc tu détermines l'état courant en fonction d'un arbre de décision
(les switch et sous-switch) selon les données reçues du monde extérieur
par l'url/post. Mais en quoi est-ce que ça te blinde contre une
injection SQL quand tu dois aller faire une requête en SGBD pour
vérifier que le login et le mot de passe que tu as reçus de ton
formulaire sont corrects ? Je conçois qu'on puise y voir une propreté ou
une simplicité de codage (chacun voit midi à sa porte) mais je ne vois
pas où est la valeur ajoutée en termes de sécurité.
Voir plus haut. Cette section n'avait pas trait à la sécurité directement.
Ce source unique simplifie grandement la maintenance (tout est au même
endroit) et est plus lisible qu'une multitude de fichiers disséminés un
peu partout dont on oublie le fil à force de passer de l'un à l'autre.
Dans sécurité il y a simplicité et bon sens.
Donc c'est dans cette "simplicité" apportée par cette méthode de
développement que se trouve le "plus" de sécurité ou j'ai loupé autre
chose ?
Entre autres oui, voir plus haut.
Le pb du premier vol d'Ariane V était, si mes souvenirs sont bons, une
consigne de vol (vitesse horizontale) qui n'avait pas été changée par
rapport à Ariane IV. Même sans gestion par exception la catastrophe était
annoncée.
Si la mienne est bonne aussi, c'était une exception mathématique non
trappée qui s'est propagée jusqu'au niveau le plus haut et là il n'y a
plus eut qu'une seule chose à faire : transformer le biniou en gros
pétard de feu d'artifice du 14 juillet.
Il serait arrivé la même chose dans le cas d'une gestion d'erreur locale si
Pour la petite histoire ce n'est pas forcément une querelle de
presbytères mais une question de priorité. Gérer les erreurs au niveau le
plus bas c'est sans doute intellectuellement satisfaisant mais conduit
irrémédiablement à un code lourd.
Pour moi ça dépend du type d'applications et de la gravité des erreurs.
Prenons par exemple l'échec de connexion au SGBD. Dans beaucoup de cas,
et presque tout le temps si on est pas en daemon, on va de toutes façons
arrêter le programme sans autre forme de procès.
Arrêter la requête tu veux dire ? N'oublies pas que nous parlons
M'enfin ce n'est pas le sujet.
Agreed. Même si en PHP je crains que ça ne conduise à de belles horreurs
car il va falloir faire la chasse aux exceptions non catchées lors des
tests unitaires (à la charge des développeurs donc) vu que ce n'est pas
un langage compilé. Faudra que je vérifie si en lançant un php -q
toto.php le moteur est capable de signaler les exceptions non catchées.
C'est l'intérêt du throws de Java du reste.
(re)bonjour,
Merci pour cette explication sur les principes mis en oeuvre. Je pense
avoir compris (à peu près) le résultat, mais j'ai du mal à voir en quoi
ça apporte un "plus" de sécurité.
L'histoire du script unique (*) apporte un gain indirect.
Justement c'est là que ça coince : la mesure du possible. Sans rentrer
dans un probème de confort de l'utilisateur, il y a des zones de type
"données mortes" (genre textearea stockées en TEXT ou BLOB ou je sais
pas quoi en base parce l'application en a besoin) mais dans lesquels à
part les ~ ^ et à la limite | tous les autres caractères sont
explicitement autorisés arce que l'utilisateur peut parfaitement avoir
BESOIN de les saisir.
Je sais que ce type de saisie ouverte doit être acceptée parfois (Wiki,
Donc tu détermines l'état courant en fonction d'un arbre de décision
(les switch et sous-switch) selon les données reçues du monde extérieur
par l'url/post. Mais en quoi est-ce que ça te blinde contre une
injection SQL quand tu dois aller faire une requête en SGBD pour
vérifier que le login et le mot de passe que tu as reçus de ton
formulaire sont corrects ? Je conçois qu'on puise y voir une propreté ou
une simplicité de codage (chacun voit midi à sa porte) mais je ne vois
pas où est la valeur ajoutée en termes de sécurité.
Voir plus haut. Cette section n'avait pas trait à la sécurité directement.
Ce source unique simplifie grandement la maintenance (tout est au même
endroit) et est plus lisible qu'une multitude de fichiers disséminés un
peu partout dont on oublie le fil à force de passer de l'un à l'autre.
Dans sécurité il y a simplicité et bon sens.
Donc c'est dans cette "simplicité" apportée par cette méthode de
développement que se trouve le "plus" de sécurité ou j'ai loupé autre
chose ?
Entre autres oui, voir plus haut.
Le pb du premier vol d'Ariane V était, si mes souvenirs sont bons, une
consigne de vol (vitesse horizontale) qui n'avait pas été changée par
rapport à Ariane IV. Même sans gestion par exception la catastrophe était
annoncée.
Si la mienne est bonne aussi, c'était une exception mathématique non
trappée qui s'est propagée jusqu'au niveau le plus haut et là il n'y a
plus eut qu'une seule chose à faire : transformer le biniou en gros
pétard de feu d'artifice du 14 juillet.
Il serait arrivé la même chose dans le cas d'une gestion d'erreur locale si
Pour la petite histoire ce n'est pas forcément une querelle de
presbytères mais une question de priorité. Gérer les erreurs au niveau le
plus bas c'est sans doute intellectuellement satisfaisant mais conduit
irrémédiablement à un code lourd.
Pour moi ça dépend du type d'applications et de la gravité des erreurs.
Prenons par exemple l'échec de connexion au SGBD. Dans beaucoup de cas,
et presque tout le temps si on est pas en daemon, on va de toutes façons
arrêter le programme sans autre forme de procès.
Arrêter la requête tu veux dire ? N'oublies pas que nous parlons
M'enfin ce n'est pas le sujet.
Agreed. Même si en PHP je crains que ça ne conduise à de belles horreurs
car il va falloir faire la chasse aux exceptions non catchées lors des
tests unitaires (à la charge des développeurs donc) vu que ce n'est pas
un langage compilé. Faudra que je vérifie si en lançant un php -q
toto.php le moteur est capable de signaler les exceptions non catchées.
C'est l'intérêt du throws de Java du reste.
Le fait d'avoir un seul script (*) à maintenir, facilite déjà la maintenance
(sic) puis le déverminage et accessoirement la mise en place de
points de contrôle en vue de pister.
Dans ce que j'ai écrit les gains directs sont apportés :
- par la configuration du serveur Web en vue de rediriger SYSTEMATIQUEMENT
sur la page d'accueil : cela interdit toute saisie d'un URL quelconque
(avec des ? et des & en vue d'une injection SQL par exemple) ;
- par le filtrage des entrées.
Je sais que ce type de saisie ouverte doit être acceptée parfois (Wiki,
forums). Sans aller jusqu'à recoder un interpréteur je pense qu'une
translation est peut-être une solution.
Je m'explique. Le système de filtrage explicité auparavant intervient dès la
soumission du formulaire en éléminant les caractères inacceptables. On peut
très bien imaginer qu'au lieu de les éliminer dans le cas d'une zone
ouverte il les translate ( ex : ';' devient 0xff, '$' devient 0xfe, etc)
voire les coder sur 2 octets (UTF-8)).
Voir plus haut. Cette section n'avait pas trait à la sécurité directement.
Elle était présente en réponse à ta demande d'explications sur la
cinématique de la chose.
A moins que tu ne veuilles signifier que l'on voit davantage les problèmes
avec une gestion locale qu'avec une gestion par exception ? Ce qui n'est
pas faux je te l'accorde.
Pour la petite histoire ce n'est pas forcément une querelle de
presbytères mais une question de priorité. Gérer les erreurs au niveau le
plus bas c'est sans doute intellectuellement satisfaisant mais conduit
irrémédiablement à un code lourd.
Pour moi ça dépend du type d'applications et de la gravité des erreurs.
Prenons par exemple l'échec de connexion au SGBD. Dans beaucoup de cas,
et presque tout le temps si on est pas en daemon, on va de toutes façons
arrêter le programme sans autre forme de procès.
Arrêter la requête tu veux dire ?
N'oublies pas que nous parlons
d'applications Web et que s'il y a un pépin sur le SGBD le serveur
d'applications lui est toujours vivant
et qu'il doit donc prendre en charge
cet évènement est en avertir proprement l'internaute ainsi que
l'administrateur (éviter le message trop souvent vu sur les IIS : SQL
server Error 0x80EF000C ...(j'invente) par exemple).
Dans les 2 règles exposées le filtrage est évident. Le filtrage des URL,
lorqu'il est possible (lorsqu'on peut se passer des GET), est un sacré
bienfaiteur en terme de sécurité mais le site doit suivre (conservation
d'états).
Le fait d'avoir un seul script (*) à maintenir, facilite déjà la maintenance
(sic) puis le déverminage et accessoirement la mise en place de
points de contrôle en vue de pister.
Dans ce que j'ai écrit les gains directs sont apportés :
- par la configuration du serveur Web en vue de rediriger SYSTEMATIQUEMENT
sur la page d'accueil : cela interdit toute saisie d'un URL quelconque
(avec des ? et des & en vue d'une injection SQL par exemple) ;
- par le filtrage des entrées.
Je sais que ce type de saisie ouverte doit être acceptée parfois (Wiki,
forums). Sans aller jusqu'à recoder un interpréteur je pense qu'une
translation est peut-être une solution.
Je m'explique. Le système de filtrage explicité auparavant intervient dès la
soumission du formulaire en éléminant les caractères inacceptables. On peut
très bien imaginer qu'au lieu de les éliminer dans le cas d'une zone
ouverte il les translate ( ex : ';' devient 0xff, '$' devient 0xfe, etc)
voire les coder sur 2 octets (UTF-8)).
Voir plus haut. Cette section n'avait pas trait à la sécurité directement.
Elle était présente en réponse à ta demande d'explications sur la
cinématique de la chose.
A moins que tu ne veuilles signifier que l'on voit davantage les problèmes
avec une gestion locale qu'avec une gestion par exception ? Ce qui n'est
pas faux je te l'accorde.
Pour la petite histoire ce n'est pas forcément une querelle de
presbytères mais une question de priorité. Gérer les erreurs au niveau le
plus bas c'est sans doute intellectuellement satisfaisant mais conduit
irrémédiablement à un code lourd.
Pour moi ça dépend du type d'applications et de la gravité des erreurs.
Prenons par exemple l'échec de connexion au SGBD. Dans beaucoup de cas,
et presque tout le temps si on est pas en daemon, on va de toutes façons
arrêter le programme sans autre forme de procès.
Arrêter la requête tu veux dire ?
N'oublies pas que nous parlons
d'applications Web et que s'il y a un pépin sur le SGBD le serveur
d'applications lui est toujours vivant
et qu'il doit donc prendre en charge
cet évènement est en avertir proprement l'internaute ainsi que
l'administrateur (éviter le message trop souvent vu sur les IIS : SQL
server Error 0x80EF000C ...(j'invente) par exemple).
Dans les 2 règles exposées le filtrage est évident. Le filtrage des URL,
lorqu'il est possible (lorsqu'on peut se passer des GET), est un sacré
bienfaiteur en terme de sécurité mais le site doit suivre (conservation
d'états).
Le fait d'avoir un seul script (*) à maintenir, facilite déjà la maintenance
(sic) puis le déverminage et accessoirement la mise en place de
points de contrôle en vue de pister.
Dans ce que j'ai écrit les gains directs sont apportés :
- par la configuration du serveur Web en vue de rediriger SYSTEMATIQUEMENT
sur la page d'accueil : cela interdit toute saisie d'un URL quelconque
(avec des ? et des & en vue d'une injection SQL par exemple) ;
- par le filtrage des entrées.
Je sais que ce type de saisie ouverte doit être acceptée parfois (Wiki,
forums). Sans aller jusqu'à recoder un interpréteur je pense qu'une
translation est peut-être une solution.
Je m'explique. Le système de filtrage explicité auparavant intervient dès la
soumission du formulaire en éléminant les caractères inacceptables. On peut
très bien imaginer qu'au lieu de les éliminer dans le cas d'une zone
ouverte il les translate ( ex : ';' devient 0xff, '$' devient 0xfe, etc)
voire les coder sur 2 octets (UTF-8)).
Voir plus haut. Cette section n'avait pas trait à la sécurité directement.
Elle était présente en réponse à ta demande d'explications sur la
cinématique de la chose.
A moins que tu ne veuilles signifier que l'on voit davantage les problèmes
avec une gestion locale qu'avec une gestion par exception ? Ce qui n'est
pas faux je te l'accorde.
Pour la petite histoire ce n'est pas forcément une querelle de
presbytères mais une question de priorité. Gérer les erreurs au niveau le
plus bas c'est sans doute intellectuellement satisfaisant mais conduit
irrémédiablement à un code lourd.
Pour moi ça dépend du type d'applications et de la gravité des erreurs.
Prenons par exemple l'échec de connexion au SGBD. Dans beaucoup de cas,
et presque tout le temps si on est pas en daemon, on va de toutes façons
arrêter le programme sans autre forme de procès.
Arrêter la requête tu veux dire ?
N'oublies pas que nous parlons
d'applications Web et que s'il y a un pépin sur le SGBD le serveur
d'applications lui est toujours vivant
et qu'il doit donc prendre en charge
cet évènement est en avertir proprement l'internaute ainsi que
l'administrateur (éviter le message trop souvent vu sur les IIS : SQL
server Error 0x80EF000C ...(j'invente) par exemple).
Dans les 2 règles exposées le filtrage est évident. Le filtrage des URL,
lorqu'il est possible (lorsqu'on peut se passer des GET), est un sacré
bienfaiteur en terme de sécurité mais le site doit suivre (conservation
d'états).
Je sais que ce type de saisie ouverte doit être acceptée parfois (Wiki,
forums). Sans aller jusqu'à recoder un interpréteur je pense qu'une
translation est peut-être une solution.
Je m'explique. Le système de filtrage explicité auparavant intervient dès la
soumission du formulaire en éléminant les caractères inacceptables. On peut
très bien imaginer qu'au lieu de les éliminer dans le cas d'une zone
ouverte il les translate ( ex : ';' devient 0xff, '$' devient 0xfe, etc)
voire les coder sur 2 octets (UTF-8)).
Je sais que ce type de saisie ouverte doit être acceptée parfois (Wiki,
forums). Sans aller jusqu'à recoder un interpréteur je pense qu'une
translation est peut-être une solution.
Je m'explique. Le système de filtrage explicité auparavant intervient dès la
soumission du formulaire en éléminant les caractères inacceptables. On peut
très bien imaginer qu'au lieu de les éliminer dans le cas d'une zone
ouverte il les translate ( ex : ';' devient 0xff, '$' devient 0xfe, etc)
voire les coder sur 2 octets (UTF-8)).
Je sais que ce type de saisie ouverte doit être acceptée parfois (Wiki,
forums). Sans aller jusqu'à recoder un interpréteur je pense qu'une
translation est peut-être une solution.
Je m'explique. Le système de filtrage explicité auparavant intervient dès la
soumission du formulaire en éléminant les caractères inacceptables. On peut
très bien imaginer qu'au lieu de les éliminer dans le cas d'une zone
ouverte il les translate ( ex : ';' devient 0xff, '$' devient 0xfe, etc)
voire les coder sur 2 octets (UTF-8)).
S'il est dans les spécifications d'autoriser tel ou tel caractère, il faut
l'autoriser, et la seule manière de le faire est de les remplacer par leur
forme inerte.
(Et comme cette forme inerte dépend de ce à quoi on envoit ces caractères,
il ne faut le faire qu'au moment où on sait ce qu'on va en faire.)
S'il est dans les spécifications d'autoriser tel ou tel caractère, il faut
l'autoriser, et la seule manière de le faire est de les remplacer par leur
forme inerte.
(Et comme cette forme inerte dépend de ce à quoi on envoit ces caractères,
il ne faut le faire qu'au moment où on sait ce qu'on va en faire.)
S'il est dans les spécifications d'autoriser tel ou tel caractère, il faut
l'autoriser, et la seule manière de le faire est de les remplacer par leur
forme inerte.
(Et comme cette forme inerte dépend de ce à quoi on envoit ces caractères,
il ne faut le faire qu'au moment où on sait ce qu'on va en faire.)
La bonne manière de faire ça est de passer systématiquement par une
bibliothèque, écrite une fois pour toutes, et qui fait les choses comme on
le souhaite.
La bonne manière de faire ça est de passer systématiquement par une
bibliothèque, écrite une fois pour toutes, et qui fait les choses comme on
le souhaite.
La bonne manière de faire ça est de passer systématiquement par une
bibliothèque, écrite une fois pour toutes, et qui fait les choses comme on
le souhaite.
Est-ce que je résume ton point de vue en disant ceci :
Il faut rendre inerte du code offensif pouvant potentiellement être
dangereux lors de sa relecture ultérieure par une application. Comme les
trsnformations nécessaire à le rendre inerte dépendent de l'application
(par exemple : transformer en entités html pour un navigateur ou
[INSERER ICI UN AUTRE EXEMPLE DANS UNE AUTRE APPLI] il est préférable de
faire ces traductions quand on récupère les informations par type de
canal de sortie.
Auquel j'ajouterai :
Si on a un seul canal de sortie (par exemple, l'interface html de
l'administrateur) on peut aussi faire la transformation avant le
stockage.
En fait ce qui me gêne dans le "désamorçage a posteriori" c'est que je
suis quasi certain qu'à un moment ou à un autre, "on"(1) va oublier de
le faire. Alors que si je fais le déminage tout de suite, je suis
peinard.
Est-ce que je résume ton point de vue en disant ceci :
Il faut rendre inerte du code offensif pouvant potentiellement être
dangereux lors de sa relecture ultérieure par une application. Comme les
trsnformations nécessaire à le rendre inerte dépendent de l'application
(par exemple : transformer en entités html pour un navigateur ou
[INSERER ICI UN AUTRE EXEMPLE DANS UNE AUTRE APPLI] il est préférable de
faire ces traductions quand on récupère les informations par type de
canal de sortie.
Auquel j'ajouterai :
Si on a un seul canal de sortie (par exemple, l'interface html de
l'administrateur) on peut aussi faire la transformation avant le
stockage.
En fait ce qui me gêne dans le "désamorçage a posteriori" c'est que je
suis quasi certain qu'à un moment ou à un autre, "on"(1) va oublier de
le faire. Alors que si je fais le déminage tout de suite, je suis
peinard.
Est-ce que je résume ton point de vue en disant ceci :
Il faut rendre inerte du code offensif pouvant potentiellement être
dangereux lors de sa relecture ultérieure par une application. Comme les
trsnformations nécessaire à le rendre inerte dépendent de l'application
(par exemple : transformer en entités html pour un navigateur ou
[INSERER ICI UN AUTRE EXEMPLE DANS UNE AUTRE APPLI] il est préférable de
faire ces traductions quand on récupère les informations par type de
canal de sortie.
Auquel j'ajouterai :
Si on a un seul canal de sortie (par exemple, l'interface html de
l'administrateur) on peut aussi faire la transformation avant le
stockage.
En fait ce qui me gêne dans le "désamorçage a posteriori" c'est que je
suis quasi certain qu'à un moment ou à un autre, "on"(1) va oublier de
le faire. Alors que si je fais le déminage tout de suite, je suis
peinard.
Re,Le fait d'avoir un seul script (*) à maintenir, facilite déjà la
maintenance (sic) puis le déverminage et accessoirement la mise en place
de points de contrôle en vue de pister.
Le point d'entrée unique est toujours intéressant, tout à fait d'accord.Dans ce que j'ai écrit les gains directs sont apportés :
- par la configuration du serveur Web en vue de rediriger
SYSTEMATIQUEMENT sur la page d'accueil : cela interdit toute saisie d'un
URL quelconque (avec des ? et des & en vue d'une injection SQL par
exemple) ; - par le filtrage des entrées.
Oui sans hésiter pour le filtrage des entrées. En revanche je n'arrive
pas à voir exactement pourquoi le point d'entrée unique
Je préfèrerais que l'on parle de configuration du serveur Web fournissant
te protège
contre une injection SQL, tu peux très bien la recevoir dans une de tes
variables POST. Je sens que je n'ai pas encore compris tous les
principes que tu mets en oeuvre dans ta notion d'automate à ce sujet.
Quand tu dois écrire ta clause WHERE, c'est bien parce que tes données
user sont filtrées que tu es protégé, pas parce qu'elles ont été
transmises en POST.
Oui, dans le cas d'un POST mais s'il s'agit d'un GET et que le code manipule
Je sais que ce type de saisie ouverte doit être acceptée parfois (Wiki,
forums). Sans aller jusqu'à recoder un interpréteur je pense qu'une
translation est peut-être une solution.
Je m'explique. Le système de filtrage explicité auparavant intervient dès
la soumission du formulaire en éléminant les caractères inacceptables. On
peut très bien imaginer qu'au lieu de les éliminer dans le cas d'une zone
ouverte il les translate ( ex : ';' devient 0xff, '$' devient 0xfe, etc)
voire les coder sur 2 octets (UTF-8)).
Si je comprends bien, au lieu de les "traduire" en leur équivalent
htmlentity tu les traduis en code interne, en espérant que l'application
qui les récupèrera et les affichera (par exemple IE dans le cas d'un
script JS offensif stocké en base) ne saura pas les comprendre après.
C'est l'idée mais je n'y ai pas réfléchi complètement en fait, n'ayant
Pire que ça :
$dad=mysql_connect(....);
if($dad=úLSE)
{
require('std_excuse.html');
exit();
}
Je peux pas me connecter à la base, je sais que sans la base je peux pas
faire le boulot qui m'est demandé, je me casse. Je vais pas générer une
exception à gérer je sais pas où qui sera trappée ou pas par je sais pas
qui, je peux rien faire, j'arrête les frais.
Je sais, je triche, c'est un exemple qui s'y prête bien.
Mouais. DAns un site B2B la moindre des choses c'est d repartir à
N'oublies pas que nous parlons
d'applications Web et que s'il y a un pépin sur le SGBD le serveur
d'applications lui est toujours vivant
Pas nécessairement, d'aucuns sont assez "doués" pour aller chercher de
temps à autres un paramètre de config ou truc du genre. Mais quoi qu'il
en soit, je vois pas pourquoi je continuerais mon programme si de toutes
façons je peux pas exécuter mon boulot.
Dans la même veine, je vais pas me priver de faire un ROLLBACK et à me
casser violemment si ma requête échoue : ou la connexion est dans les
choux (genre : équipement réseau un peu sensible qui l'a coupée parce
que temps de session dépassé) ou il y a une erreur de syntaxe (attaque
probable si j'ai bien recetté mon programme).et qu'il doit donc prendre en charge
cet évènement est en avertir proprement l'internaute ainsi que
l'administrateur (éviter le message trop souvent vu sur les IIS : SQL
server Error 0x80EF000C ...(j'invente) par exemple).
Tout à fait, mais on peut très souvent parfaitement gérer ça directement
en local, dès la détection de l'erreur. Et le code en est *à mon sens*
grandement plus lisible et facile à débugger que de suivre les try/catch
dans tous les coins :
Dans mon exemple les ty catch comme tu dis sont tous situés dans le fameux
Je percute vraiment pas en quoi enlever le GET est un apport de sécurité
pour le site (à part, on l'a déjà vu, pour les données sensibles type
password ou l'identifiant de session qui se fait écrire grâce au
referrer dans le log d'un attaquant).
Ben c'est ça, uniquement.
Que je reçoive la donnée vérolée
en get ou en post, elle est tout aussi vérolée.
Ben oui.
C'est pas pour faire ma
mauvaise tête, ça m'intéresse vraiment de comprendre.
db
Re,
Le fait d'avoir un seul script (*) à maintenir, facilite déjà la
maintenance (sic) puis le déverminage et accessoirement la mise en place
de points de contrôle en vue de pister.
Le point d'entrée unique est toujours intéressant, tout à fait d'accord.
Dans ce que j'ai écrit les gains directs sont apportés :
- par la configuration du serveur Web en vue de rediriger
SYSTEMATIQUEMENT sur la page d'accueil : cela interdit toute saisie d'un
URL quelconque (avec des ? et des & en vue d'une injection SQL par
exemple) ; - par le filtrage des entrées.
Oui sans hésiter pour le filtrage des entrées. En revanche je n'arrive
pas à voir exactement pourquoi le point d'entrée unique
Je préfèrerais que l'on parle de configuration du serveur Web fournissant
te protège
contre une injection SQL, tu peux très bien la recevoir dans une de tes
variables POST. Je sens que je n'ai pas encore compris tous les
principes que tu mets en oeuvre dans ta notion d'automate à ce sujet.
Quand tu dois écrire ta clause WHERE, c'est bien parce que tes données
user sont filtrées que tu es protégé, pas parce qu'elles ont été
transmises en POST.
Oui, dans le cas d'un POST mais s'il s'agit d'un GET et que le code manipule
Je sais que ce type de saisie ouverte doit être acceptée parfois (Wiki,
forums). Sans aller jusqu'à recoder un interpréteur je pense qu'une
translation est peut-être une solution.
Je m'explique. Le système de filtrage explicité auparavant intervient dès
la soumission du formulaire en éléminant les caractères inacceptables. On
peut très bien imaginer qu'au lieu de les éliminer dans le cas d'une zone
ouverte il les translate ( ex : ';' devient 0xff, '$' devient 0xfe, etc)
voire les coder sur 2 octets (UTF-8)).
Si je comprends bien, au lieu de les "traduire" en leur équivalent
htmlentity tu les traduis en code interne, en espérant que l'application
qui les récupèrera et les affichera (par exemple IE dans le cas d'un
script JS offensif stocké en base) ne saura pas les comprendre après.
C'est l'idée mais je n'y ai pas réfléchi complètement en fait, n'ayant
Pire que ça :
$dad=mysql_connect(....);
if($dad=úLSE)
{
require('std_excuse.html');
exit();
}
Je peux pas me connecter à la base, je sais que sans la base je peux pas
faire le boulot qui m'est demandé, je me casse. Je vais pas générer une
exception à gérer je sais pas où qui sera trappée ou pas par je sais pas
qui, je peux rien faire, j'arrête les frais.
Je sais, je triche, c'est un exemple qui s'y prête bien.
Mouais. DAns un site B2B la moindre des choses c'est d repartir à
N'oublies pas que nous parlons
d'applications Web et que s'il y a un pépin sur le SGBD le serveur
d'applications lui est toujours vivant
Pas nécessairement, d'aucuns sont assez "doués" pour aller chercher de
temps à autres un paramètre de config ou truc du genre. Mais quoi qu'il
en soit, je vois pas pourquoi je continuerais mon programme si de toutes
façons je peux pas exécuter mon boulot.
Dans la même veine, je vais pas me priver de faire un ROLLBACK et à me
casser violemment si ma requête échoue : ou la connexion est dans les
choux (genre : équipement réseau un peu sensible qui l'a coupée parce
que temps de session dépassé) ou il y a une erreur de syntaxe (attaque
probable si j'ai bien recetté mon programme).
et qu'il doit donc prendre en charge
cet évènement est en avertir proprement l'internaute ainsi que
l'administrateur (éviter le message trop souvent vu sur les IIS : SQL
server Error 0x80EF000C ...(j'invente) par exemple).
Tout à fait, mais on peut très souvent parfaitement gérer ça directement
en local, dès la détection de l'erreur. Et le code en est *à mon sens*
grandement plus lisible et facile à débugger que de suivre les try/catch
dans tous les coins :
Dans mon exemple les ty catch comme tu dis sont tous situés dans le fameux
Je percute vraiment pas en quoi enlever le GET est un apport de sécurité
pour le site (à part, on l'a déjà vu, pour les données sensibles type
password ou l'identifiant de session qui se fait écrire grâce au
referrer dans le log d'un attaquant).
Ben c'est ça, uniquement.
Que je reçoive la donnée vérolée
en get ou en post, elle est tout aussi vérolée.
Ben oui.
C'est pas pour faire ma
mauvaise tête, ça m'intéresse vraiment de comprendre.
db
Re,Le fait d'avoir un seul script (*) à maintenir, facilite déjà la
maintenance (sic) puis le déverminage et accessoirement la mise en place
de points de contrôle en vue de pister.
Le point d'entrée unique est toujours intéressant, tout à fait d'accord.Dans ce que j'ai écrit les gains directs sont apportés :
- par la configuration du serveur Web en vue de rediriger
SYSTEMATIQUEMENT sur la page d'accueil : cela interdit toute saisie d'un
URL quelconque (avec des ? et des & en vue d'une injection SQL par
exemple) ; - par le filtrage des entrées.
Oui sans hésiter pour le filtrage des entrées. En revanche je n'arrive
pas à voir exactement pourquoi le point d'entrée unique
Je préfèrerais que l'on parle de configuration du serveur Web fournissant
te protège
contre une injection SQL, tu peux très bien la recevoir dans une de tes
variables POST. Je sens que je n'ai pas encore compris tous les
principes que tu mets en oeuvre dans ta notion d'automate à ce sujet.
Quand tu dois écrire ta clause WHERE, c'est bien parce que tes données
user sont filtrées que tu es protégé, pas parce qu'elles ont été
transmises en POST.
Oui, dans le cas d'un POST mais s'il s'agit d'un GET et que le code manipule
Je sais que ce type de saisie ouverte doit être acceptée parfois (Wiki,
forums). Sans aller jusqu'à recoder un interpréteur je pense qu'une
translation est peut-être une solution.
Je m'explique. Le système de filtrage explicité auparavant intervient dès
la soumission du formulaire en éléminant les caractères inacceptables. On
peut très bien imaginer qu'au lieu de les éliminer dans le cas d'une zone
ouverte il les translate ( ex : ';' devient 0xff, '$' devient 0xfe, etc)
voire les coder sur 2 octets (UTF-8)).
Si je comprends bien, au lieu de les "traduire" en leur équivalent
htmlentity tu les traduis en code interne, en espérant que l'application
qui les récupèrera et les affichera (par exemple IE dans le cas d'un
script JS offensif stocké en base) ne saura pas les comprendre après.
C'est l'idée mais je n'y ai pas réfléchi complètement en fait, n'ayant
Pire que ça :
$dad=mysql_connect(....);
if($dad=úLSE)
{
require('std_excuse.html');
exit();
}
Je peux pas me connecter à la base, je sais que sans la base je peux pas
faire le boulot qui m'est demandé, je me casse. Je vais pas générer une
exception à gérer je sais pas où qui sera trappée ou pas par je sais pas
qui, je peux rien faire, j'arrête les frais.
Je sais, je triche, c'est un exemple qui s'y prête bien.
Mouais. DAns un site B2B la moindre des choses c'est d repartir à
N'oublies pas que nous parlons
d'applications Web et que s'il y a un pépin sur le SGBD le serveur
d'applications lui est toujours vivant
Pas nécessairement, d'aucuns sont assez "doués" pour aller chercher de
temps à autres un paramètre de config ou truc du genre. Mais quoi qu'il
en soit, je vois pas pourquoi je continuerais mon programme si de toutes
façons je peux pas exécuter mon boulot.
Dans la même veine, je vais pas me priver de faire un ROLLBACK et à me
casser violemment si ma requête échoue : ou la connexion est dans les
choux (genre : équipement réseau un peu sensible qui l'a coupée parce
que temps de session dépassé) ou il y a une erreur de syntaxe (attaque
probable si j'ai bien recetté mon programme).et qu'il doit donc prendre en charge
cet évènement est en avertir proprement l'internaute ainsi que
l'administrateur (éviter le message trop souvent vu sur les IIS : SQL
server Error 0x80EF000C ...(j'invente) par exemple).
Tout à fait, mais on peut très souvent parfaitement gérer ça directement
en local, dès la détection de l'erreur. Et le code en est *à mon sens*
grandement plus lisible et facile à débugger que de suivre les try/catch
dans tous les coins :
Dans mon exemple les ty catch comme tu dis sont tous situés dans le fameux
Je percute vraiment pas en quoi enlever le GET est un apport de sécurité
pour le site (à part, on l'a déjà vu, pour les données sensibles type
password ou l'identifiant de session qui se fait écrire grâce au
referrer dans le log d'un attaquant).
Ben c'est ça, uniquement.
Que je reçoive la donnée vérolée
en get ou en post, elle est tout aussi vérolée.
Ben oui.
C'est pas pour faire ma
mauvaise tête, ça m'intéresse vraiment de comprendre.
db