8722 sujets

Développement web côté serveur, CMS

bonjour,

je cherche un source, un lien, un document actuel qui explique de A à Z comment sécuriser les données saisies dans un formulaire en vue de les enregistrer dans une base Mysql.

J'ai parcouru le web et je lis un peu tout et son contraire, concernant asddslashes, magic_quote gpc, mysql_real_escape_string (promis à l'obsolescence) , html_special_char .. etc....

n'y a t-il pas un process standard normalisé qui se dégage??

après tout la saisie de données dans un formulaire est un étape quasi obligée et banale sur la majorité des sites web...

merci

je pars du principe qu'on est en 2013 et que magic_quotes est désactivé sur les serveurs web (c'est à dire que le serveur ne rajoute pas \ devant les caractères spéciaux)
Lothindil a écrit :
Je ne peux que te conseiller :

sécurité PHP5 et MySQL aux Editions Eyrolles
C'est complet, c'est clair et c'est récent ^^


c'est rigolo, je suis en train de feuilleter ce livre... mais ça semble assez dilué, j'en suis à la page 40, je cherche un résumé de ce qui est la norme aujourd'hui...

Le livre date de juin 2007... quand même .... et j'ai pas encore pu vérifier aussi si il s'appuie sur pdo
dans un bouquin O'Reilly, j'ai trouvé une formule de ce genre


function sanitizeString($var)
{
	$var = stripslashes($var);
	$var = htmlentities($var);
	$var = strip_tags($var);
	return $var;
}



qui s'utilise de cette façon, en réception de données d'un formulaire.


if (isset($_POST['f'])) $f = sanitizeString($_POST['f']);
if (isset($_POST['c'])) $c = sanitizeString($_POST['c']);


quequ'un peut il m'expliquer ce que ceci apporte au niveau de la sécurité?

merci
a écrit :


function sanitizeString($var)
{ 
	$var = stripslashes($var); 
	$var = htmlentities($var); 
	$var = strip_tags($var); 
	return $var;
}


quequ'un peut il m'expliquer ce que ceci apporte au niveau de la sécurité?


En vue d'un envoi à la base de données pour se prévenir des injections SQL, je voudrais presque dire rien du tout ! Mais c'est quand même un peu méchant.

$var = stripslashes($var);
=> strip_slashes ne sert à rien si magic_quotes n'est pas activé... pire, ça fausse les entrées de l'utilisateur. C'est pas courant de saisir \' ou \" mais ça peut poser des problèmes si c'est du code, quelque part comme sur ce forum par exemple.
ET comme c'est une erreur d'activer magic_quotes sachant qu'il ne protège qu'à moitié et sachant qu'il va bientôt disparaître, c'est aussi faux d'utiliser strip_slashes

$var = htmlentities($var);
=> Ca, ça transforme les caractères comme ' et " en &apos et &quot. Alors en fait, oui, ça protège de 99% des injections SQL parce que ' et " n'apparaissent plus dans la string. Mais de un c'est pas 100% infaillible (il existe quelques injections faisables sans ' ni " dans certains cas), et de deux c'est une erreur d'appréciation parce que ça ne sert à rien de stocker ces caractères sous forme d'entité dans la base. C'est une question d'affichage et ça n'a vraiment rien à faire dans la base.

$var = strip_tags($var);
=> Ca ça sert doublement à rien. C'est censé supprimer les balises HTML. Une fois de plus ça concerne l'affichage pas la base, mais en plus le faire après htmlentities ne changera rien puisque tous les < et > auront été transformés en &lt et &gt.

La façon la plus simple pour se protéger presque complètement contre les injections SQL, c'est d'utiliser les fonctions qui ont été prévues pour ça: PDO::quote, ou anciennement mysql_real_escape_string. Attention au fait que PDO::quote ajoute automatiquement des apostrophes au début et à la fin de la chaîne, pour qu'on puisse passer indifféremment des entiers et des strings directement à SQL sans plus se poser de question par après.
Pour faire mieux, on devrait même utiliser les requêtes préparées.

Sinon, si on a besoin de plus complexe pour plus de sécurité, la bible à suivre en la matière sur le web, c'est l'OWASP
https://www.owasp.org/
Le top 10 est remis à jour chaque année. A défaut d'utiliser leurs API, on peut au moins suivre leurs conseils. Pour ceux qui ont déjà un peu lu et étudié sur la sécurité, la plupart est du classique, du revu et du réchauffé, mais dans l'idéal on devrait toujours être conscient de tout ça. Même les meilleurs ont tendances à oublier, une petite relecture ne fait pas de mal.

Le plus important à retenir c'est qu'il y a deux principales familles de failles contre lesquelles il faut se protéger: les injections SQL, et les XSS. IL faut bien comprendre la différence entre les deux et à quels moments elles peuvent intervenir. A essayer de faire n'importe quoi n'importe quand, on ne sait plus vraiment quoi permet de protéger contre quoi et au final on ajoute plus de problèmes qu'on en résoud.

Là quand je vois qu'un livre propose htmlentities pour envoyer en base SQL, par exemple, ça me choque: ça me donne l'impression qu'on mélange les deux, qu'on n'a rien compris et qu'on essaye tout et n'importe quoi n'importe comment en espérant qu'on ne risque rien.

EDIT: Tiens, le forum ne supporte pas les liens en HTTPS ?
Modifié par QuentinC (06 Sep 2013 - 17:32)
La seule méthode que je préconise et qui est vraiment infaillible c'est d'utiliser des requêtes préparées. Tout le reste c'est de la bidouille et c'est à éviter absolument.

Si un champ contient du texte qui doit être affiché dans une page HTML mais que tu ne veux autoriser les tags HTML dedans tu utilises echo htmlspecialchar($texte, ENT_QUOTES, 'UTF-8) dans ta vue ou template, mais pas lors de l'insertion en base de données.

Si un champ doit contenir du HTML mais que tu ne veux pas autoriser tout et n'importe quoi au niveaux des tags la solution la plus fiable est d'utiliser la bibliothèque HTML Purifier.

Voilà.