2017-07-11 3 views
1

Je suis confondu avec le codage de caractères. Je comprends que les gens font les choses différemment, mais beaucoup suggèrent que vous deviez stocker votre entrée dans la base de données telle qu'elle est entrée, puis la traiter lorsque vous la lisez en fonction de ce que vous envisagez de faire avec. Cela a du sens pour moi.Confondu avec le codage html

Ainsi, si un utilisateur entre une apostrophe, guillemet ou esperluette, moins, plus de signe, seront écrits dans ma base de données ' "& <> respectivement.

Maintenant, la lecture des données avec php, je cours le texte à travers HTMLPurify pour attraper tous les problèmes d'injection

Dois-je aussi htmlencode? Si je ne le fais pas, tout semble OK (dans Chrome et Firefox) mais je ne suis pas sûr que ce soit correct et va-t-il s'afficher correctement dans d'autres navigateurs?

Si j'utilise htmlentities avec E NT_QUOTES, et htmlspecialchars, je commence à obtenir les codes à venir pour ces caractères, qui je crois est ce que je devrais voir en regardant la source de la page, mais pas sur la page que l'utilisateur voit. Le problème est, sans faire le codage, je vois ce que je veux voir, mais j'ai ce petit problème dans mon esprit, que je ne le fais pas correctement!

+1

Cela va probablement être marqué comme hors sujet car il est entièrement basé sur l'opinion. Vous pouvez reformuler une question plus spécifique avec des exemples de code. – Difster

+1

Stockez l'entrée utilisateur "telle quelle", mais nettoyez-la avant de la sortir (si vous voulez empêcher XSS, par exemple). Vous n'avez rien à encoder en HTML. – Terry

+0

Placez les données dans la base de données en tant que données réelles, c'est-à-dire si elles sont via HTML, désactivez-les. Ensuite, d'autres applications peuvent l'utiliser. –

Répondre

1

Vous avez ceci confus. L'encodage de caractères est un attribut de VOS systèmes. Vos sites Web et votre base de données sont responsables de l'encodage des caractères.

Vous devez décider ce que vous acceptez. Je dirais qu'en général, le web a évolué vers la standardisation sur UTF-8. Ainsi, si vos sites Web qui acceptent l'entrée utilisateur ET votre base de données et toutes les connexions impliquées sont UTF-8, vous êtes en mesure d'accepter l'entrée comme UTF-8 et votre jeu de caractères et votre classement dans la base de données doivent être configurés correctement.

A ce stade, toutes vos pages web devraient être HTML5, de sorte que la section HEAD recommandée de vos pages should at a minimum be this:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="utf-8"/> 

Ensuite, vous avez injection SQL. Vous avez spécifié PHP. Si vous utilisez mysqli ou PDO (ce qui est dans mon expérience le meilleur choix) ET que vous utilisez bindParameter pour toutes vos variables, il n'y a pas de problème avec l'injection SQL. Ce problème disparaît et le besoin d'effacement des entrées disparaît, car vous n'avez plus à vous inquiéter qu'une instruction SQL puisse être confuse. Ce n'est plus possible.

Enfin, vous avez mentionné htmlpurifier. Cela existe afin que les gens puissent essayer d'éviter XSS et d'autres exploits de cette nature, qui se produisent lorsque vous acceptez l'entrée de l'utilisateur, et ces personnes injectent html & js. Cela peut toujours poser problème, selon la nature du système et ce que vous faites avec cette sortie, mais comme d'autres personnes l'ont suggéré dans les commentaires, vous pouvez exécuter des assainisseurs et des filtres sur la sortie après l'avoir récupérée. de la base de données. Assis à l'intérieur d'une variable de chaîne PHP, il n'y a pas de danger intrinsèque, jusqu'à ce que vous l'armez en l'injectant dans une page html en direct que vous servez.

En ce qui concerne la recherche de mauvais acteurs et de personnes essayant de manipuler votre système, il est évident que vous avez beaucoup mieux stocké l'entrée d'origine telle que soumise. Puis, au fur et à mesure que vous comprenez la nature de ces exploits, vous pouvez rechercher dans votre base de données des choses spécifiques, que vous ne pourrez pas faire si vous désinfectez d'abord et stockez le résultat.