Je crée un logiciel de forum utilisant le backend PHP et MySQL et je souhaite savoir quel est le moyen le plus sûr d'échapper à la saisie des utilisateurs pour les postes de forum. P>
Je connais des htmlentititions () et strip_tags () et htmlspecialchars () et mysql_real_escapape_string () et même l'évasion de JavaScript () mais je ne sais pas qui à utiliser et où. P>
Quel serait le moyen le plus sûr de traiter ces trois types d'entrée différents (par processus, je veux dire obtenir, enregistrer dans une base de données et afficher): p>
J'apprécierais une réponse qui me dit combien de ces fonctions d'évasion que je dois utiliser en combinaison et pourquoi. Merci! P>
7 Réponses :
Quelque chose d'autre peut être fait avec HTMLSpecialchars () pour supprimer HTML de l'entrée et de l'urlencode () pour mettre les éléments dans un format d'URL. P> mysql_real_escape_string () code> échappe tout ce que vous devez mettre dans une base de données MySQL. Mais vous devez utiliser des déclarations préparées (dans MySQLI) à la place, car elles sont plus propres et ne s'échappent pas automatiquement. P>
Si le champ "Contenu" peut contenir certains HTML, HTMLSpecialCalchars ne doit pas être utilisé: elle échappera à tout HTML, y compris les balises "autorisées"
Exactement. HTMLSpecialchars () serait pour le contenu limité à une entrée de texte de base.
Lors de la génération de la sortie HTLM (comme si vous effectuez des données dans les champs du formulaire lorsque quelqu'un tente de modifier un article ou si vous devez réafficher le formulaire, car l'utilisateur a oublié un champ, car instance) em>, vous utiliseriez probablement Une fois que vous avez l'utilisateur entré dans le formulaire (c'est-à-dire lorsque le formulaire a été soumis) em>, vous devez vous échapper avant de l'envoyer à la DB.
Vous voudrez peut-être aussi jeter un coup d'œil aux déclarations préparées, ce qui pourrait vous aider un peu ;-)
avec mysqli - et avec PDO P>
Vous ne devez pas utiliser quoi que ce soit comme Enfin, pour afficher les données à l'intérieur d'une page: p>
htmlspecialchars () code> : il échappera à << / code>, > code>, " code>, ' code> et & code> - - en fonction des options que vous le donnez. P>
strip_tags code> Supprimera les étiquettes si l'utilisateur a entré un peu - et vous ne voulez généralement pas quelque chose que l'utilisateur tapé simplement disparaît ;-)
au moins, pas pour le champ "contenu"
C'est là que des fonctions telles que mysqli_real_escapape_string code> deviennent utiles: elles échappent aux données pour SQL P>
addSlashes code>: l'échappement qu'il ne dépend pas du moteur de base de données; Il est préférable d'utiliser une fonction qui correspond au moteur (mysql, postgretsql, ...) em> Vous travaillez avec: il saura précisément quoi d'échapper et comment. P>
htmlspecialchars () code> : Si l'utilisateur saisit les balises HTML, celles-ci seront affichées selon-elles, et non injectées en tant que HTML. LI>
strip_tags code> (qui peut faire cela) n'est pas vraiment à la tâche (il laissera les attributs des balises autorisées)
Ce ne sont que quelques indicateurs ... J'espère qu'ils vous aideront
N'hésitez pas à demander si vous avez des questions plus précises! p>
la réponse à Cet article est une bonne réponse p>
Fondamentalement, à l'aide du PDO Interface pour paramétrer vos requêtes est beaucoup plus sûre et moins erronée que de s'échapper vos entrées manuellement. P>
Vous pouvez également le faire avec MySQLI, BTW.
J'ai tendance à échapper à tous les personnages qui seraient problématiques dans l'affichage de la page, JavaScript et SQL tout en même temps. Il le laisse lisible sur le Web et dans le courrier électronique HTML et supprime en même temps aucun problème avec le code.
Une ligne de code VB.NET serait:
Il y a deux types d'attaques complètement différents que vous devez défendre contre: p>
mysql_real_escape_string () code> et addSlashes () code> sont censés défendre contre cela. Le premier est meilleur, mais les requêtes paramétrées sont mieux encore li>
- Script de site internet (XSS): entrée qui, lorsqu'il est affiché sur votre page, tente d'exécuter JavaScript dans un navigateur de visiteur pour effectuer toutes sortes de choses (comme voler les données du compte de l'utilisateur).
htmlspecialchars () code> est le moyen définitif de défendre contre cela. li>
ul>
Autoriser "Certains HTML" en évitant les attaques XSS est très très difficile. En effet, il existe des possibilités infinies de la contrebande JavaScript dans HTML. Si vous avez décidé de le faire, le moyen sûr est d'utiliser BBCode ou Markdown, c'est-à-dire un ensemble limité de balises non-HTML que vous convertissez ensuite en HTML, tout en supprimant tous les vrais HTML avec htmlspecialchars () code>. Même alors, vous devez faire attention à ne pas autoriser javascript: code> URL dans les liens. En fait, permettant aux utilisateurs de saisir HTML est quelque chose que vous ne devez faire que si c'est absolument crucial pour votre site < / a>. Et puis vous devriez dépenser un lot em> de temps en vous assurant de comprendre HTML et JavaScript et CSS complètement. P>
Tout d'abord, Conseil général: n'échappez pas littéralement les variables lorsque vous insérez dans la base de données. Il existe de nombreuses solutions qui vous permettent d'utiliser des déclarations préparées avec une liaison variable. La raison de ne pas le faire explicitement est que ce n'est qu'une question de temps avant de l'oublier une fois. P>
Si vous insérez du texte brut dans la base de données, n'essayez pas de le nettoyer sur Insérer, mais nettoyez-la à la place. C'est-à-dire qu'utilisez HTMLENTITES pour le coder comme HTML (et transmettre la bonne argument de charset). Vous souhaitez encoder sur l'affichage car vous ne faites plus confiance à ce que le contenu de la base de données est correct, ce qui n'est pas nécessairement une donnée. P>
Si vous traitez avec du texte riche (HTML), les choses deviennent plus compliquées. Suppression des bits "mal" de HTML sans détruire le message est un problème difficile. Réalisme de manière réaliste, vous devrez recourir à une solution standardisée, comme HTMLPurificateur . Cependant, cela est généralement trop lent à exécuter sur chaque page de page, vous serez donc obligé de le faire lorsque vous écrivez dans la base de données. Vous devrez également vous assurer que l'utilisateur peut voir leur «nettoyé» HTML et corriger la version nettoyée. P>
Essayez certainement d'éviter de «rouler votre propre solution de filtre ou de codage à n'importe quelle étape. Ces problèmes sont notoirement difficiles et vous courez un risque important de négliger certains détails mineurs qui ont de grandes implications de sécurité. P>
i deuxième joeri, ne roule pas la vôtre, allez ici pour voir certaines des nombreuses attaques de XSS possibles p>
http://ha.ckers.org/xss.html p>
htmlenttities () -> Tournez le texte en HTML, convertissant des caractères en entités. Si vous utilisez l'encodage UTF-8, utilisez plutôt HTMLSpecialchars (), car les autres entités ne sont pas nécessaires. C'est la meilleure défense contre XSS. Je l'utilise sur chaque variable que je produise quel que soit le type ou l'origine, à moins que je ne l'invente soit HTML. Il n'y a qu'un coût de performance minuscule et il est plus facile que d'essayer de déterminer ce qui a besoin de s'échapper et de ce qui ne fait pas. P>
strip_tags () - Tournez HTML en texte en supprimant toutes les balises HTML. Utilisez ceci pour vous assurer qu'il n'y a rien de méchant dans votre entrée en tant qu'intrajonctionné pour échapper à votre sortie. P>
mysql_real_escape_string () - échappe à une chaîne pour MySQL et est votre défense contre les injections SQL à partir de tables de Bobby (mieux utiliser MySQLI et préparer / lier comme une évasion est terminée pour vous et vous pouvez éviter de nombreuses concaténations de chaîne désordonnées) < / p>
Le conseil étant donné obve réévaluation de l'entrée HTML, sauf si elle est essentielle et opte pour BBCode ou similaire (faites-vous votre choix si nécessaire) est très sonore. P>