Question

Je suis très confus sur quelque chose et je me demandais si quelqu'un pouvait expliquer.

En PHP i valider l'entrée utilisateur afin htmlentitiies, mysql_real_escape_string est utilisé avant de l'insérer dans la base de données, et non pas sur tout que je préfère utiliser des expressions régulières quand je peux, bien que je les trouve difficile de travailler avec. Maintenant, évidemment, je vais utiliser mysql_real_escape_string que les données vont dans la base de données, mais pas sûr que je devrais utiliser htmlentities () que lors de l'obtention des données de base de données et l'afficher sur une page Web comme faisant avant la main modifie les données saisies par une personne qui n'est pas garder sa forme originale qui peut causer des problèmes si je veux utiliser ces données plus tard pour autre chose.

Ainsi, par exemple, j'ai un livre d'or avec le nom de 3 champs, objet et le message. Maintenant, évidemment, les champs peuvent contenir quelque chose comme code malveillant dans les balises js essentiellement quoi que ce soit, maintenant ce qui me confond est laissé dire que je suis une personne malicieuse et moi avons décidé d'utiliser des balises js et un code malicous js et soumettre le formulaire, maintenant essentiellement j'ai malveillant les données inutiles dans ma base de données. Maintenant, en utilisant htmlentities lors de la sortie du code malveillant sur la page Web (livre d'or) qui n'est pas un problème parce que htmlentities a converti à il est sûr équivalent mais en même temps j'ai du code malveillant inutile dans la base de données que je préférerais ne pas avoir.

Alors, après avoir dit tout cela ma question est dois-je accepter le fait que certaines données dans la base de données peut-être malveillants, les données inutiles et aussi longtemps que je l'utilise htmlentities sur tout de sortie sera ok ou dois-je faire quelque chose d'autre aswell ?.

J'ai lu tant de livres dire au sujet des données de filtrage à la réception et échapper à la sortie si la forme originale est conservée, mais ils ne jamais donner des exemples comme assurant un champ est uniquement un int en utilisant des fonctions déjà intégrées dans php etc, mais je n'a jamais rien trouvé en ce qui concerne assurant quelque chose comme un livre d'or où vous voulez que les utilisateurs de taper tout ce qu'ils veulent, mais aussi la façon dont vous filtrer ces données en dehors de mysql_real_escape_string () pour vous assurer qu'il ne casse pas la requête DB?

Quelqu'un pourrait-il s'il vous plaît enfin fermer cette confusion pour moi et dites-moi ce que je dois faire et ce qui est la meilleure pratique?

Merci à tous ceux qui peuvent expliquer.

Vive!

Était-ce utile?

La solution

Ceci est une longue question, mais je pense que ce que vous demandez en fait se résume à:

« évasion Devrais-je HTML avant de l'insérer dans ma base de données, ou quand je vais l'afficher? »

La réponse généralement acceptée à cette question est que vous devez échapper au HTML (via htmlspecialchars) quand vous allez à l'afficher à l'utilisateur, et pas avant de le mettre dans la base de données.

La raison est la suivante: une base de données stocke les données. Ce que vous mettez dans c'est ce que l'utilisateur a tapé. Lorsque vous appelez mysql_real_escape_string, cela ne change pas ce qui est inséré dans la base de données; il évite simplement l'interprétation de l'entrée de l'utilisateur que des instructions SQL. htmlspecialchars fait la même chose pour le HTML; lorsque vous imprimez l'entrée de l'utilisateur, il évitera l'avoir interprété comme HTML. Si vous deviez appel htmlspecialchars avant l'insert, vous n'êtes plus être fidèle.

Vous devez toujours chercher à avoir la représentation fidélité maximale que vous pouvez obtenir. Depuis stocker le code « malveillant » dans votre base de données ne fait pas de mal (en fait, il vous permet d'économiser un peu d'espace, car échappé HTML est plus long que non échappés!), Et vous pouvez à l'avenir voulez que HTML ( si vous utilisez un analyseur XML sur les commentaires des utilisateurs, ou un jour permettre aux utilisateurs de confiance ont un sous-ensemble de HTML dans leurs commentaires, ou quelque?), pourquoi ne pas être?

Vous demandez aussi un peu sur d'autres types de validation d'entrée (contraintes entières, etc.). Votre schéma de base de données devrait appliquer ces derniers, et ils peuvent également être contrôlés sur la couche d'application (de préférence sur l'entrée via JS, puis de nouveau côté serveur).

Sur une autre note, la meilleure façon de faire la base de données avec PHP échapper est probablement d'utiliser PDO, plutôt que d'appeler directement mysql_real_escape_string. AOP a des fonctionnalités plus avancées, y compris la vérification de type.

Autres conseils

mysql_real_escape_string() est tout ce que vous avez besoin pour les opérations de base de données. Il va veiller à ce qu'un utilisateur malveillant ne peut pas intégrer quelque chose dans les données qui va « casser » vos requêtes.

htmlentities() et htmlspecialchars() entrent en jeu lorsque vous travaillez avec l'envoi des choses au client / navigateur. Si vous voulez nettoyer HTML potentiellement hostile, vous seriez mieux d'utiliser htmlpurifier qui dépouillera les données le socle et le tuyau à l'eau de Javel et de reconstruire correctement.

Il n'y a aucune raison de craindre d'avoir un code JavaScript malveillant dans la base de données si vous échapper au HTML quand il sort. Assurez-vous que vous faites toujours quelque chose d'échappement qui sort de la DB.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top