OVH Cloud OVH Cloud

securite d'un form

5 réponses
Avatar
Alain
Bonjour,
J'ai écrit un script pour livre d'or. Pour écrire, on remplit un form,
qui passe le texte (par POST) à un autre script,
qui met le tout dans un fichier (pour affichage en HTML).
Pour le cas ou le texte contiendrait du code malicieux,
j'ai écrit une fonction qui devrait l'empêcher de nuire,
On lui passe une $chaine et elle la retourne filtrée :

function filtre($chaine) {
// Enlever les caractères de contrôle sauf "\n" et "\r"
$purge = "";
for($x=0; $x < strlen($chaine); $x++) {
$asc = ord($chaine{$x});
if( $asc > 0x1F // ce n'est pas un caractère de contrôle
|| $asc == 0x0A // ou c'est un "\n"
|| $asc == 0x0D // ou bien un "\r"
) $purge .= chr($asc); // alors l'accepter
}
// inactiver les balises PHP, HTML et Javascript, par conversion de "<" et
">"
return(htmlspecialchars($purge, ENT_QUOTES));
}

Pensez-vous que c'est suffisant ?

Avec mes remerciements
--
Alain Lebigot

5 réponses

Avatar
Bruno.L
Alain wrote:
Bonjour,
J'ai écrit un script pour livre d'or. Pour écrire, on remplit un form,
qui passe le texte (par POST) à un autre script,
qui met le tout dans un fichier (pour affichage en HTML).
Pour le cas ou le texte contiendrait du code malicieux,
j'ai écrit une fonction qui devrait l'empêcher de nuire,



que penses-tu de la fonction strip-tags ?
<http://www.php.net/manual/fr/function.strip-tags.php>


--
Bruno <http://bluesilk.be>

Avatar
Marc

for($x=0; $x < strlen($chaine); $x++) {
$asc = ord($chaine{$x});
if( $asc > 0x1F // ce n'est pas un caractère de contrôle
|| $asc == 0x0A // ou c'est un "n"
|| $asc == 0x0D // ou bien un "r"
) $purge .= chr($asc); // alors l'accepter
}



tu dois pouvoir remplacer avec preg_replace ('/W/', '');
ca remplace sauf erreur de ma part tout ce qui n'est pas affichable
par ''. Voir la doc pour etre plus sur.

Avatar
Marc

return(htmlspecialchars($purge, ENT_QUOTES));
}


htmlspecialchars() devrait suffir a la tache.

Avatar
Alain
"Marc" <mquinton| a écrit dans le message de news:
42b55ced$0$620$
tu dois pouvoir remplacer avec preg_replace ('/W/', '');
ca remplace sauf erreur de ma part tout ce qui n'est pas affichable
par ''. Voir la doc pour etre plus sur.


J'ai essayé: '/W/' enlève aissi la ponctuation et les espaces. Alors j'ai
essayé:
preg_replace('/[^n -ÿ]*/','',$chaine);
N'enlève que les caractères de contrôle, sauf le newline et laisse
tous les caractères imprimables. C'est plus concis que ma boucle !

Merci pour l'aide !
Alain

Avatar
Alain
"Bruno.L" a écrit dans le message de news:
42b54bfd$
que penses-tu de la fonction strip-tags ?
<http://www.php.net/manual/fr/function.strip-tags.php>

Je souhaite laisser la liberté d'utiliser < et > comme simples caractères

dans
un message, je les rends inoffensifs par htmlspecialchars().Je viens
d'essayer strip_tags() :
la fonction vire tout, vrais et faux tags. Trop pour mon cas.

Merci pour le renseignement
Alain