7
votes

Quel est le moyen correct / sûr d'échapper à l'entrée dans un forum?

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.

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ù.

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):

  1. Un titre d'un post (qui sera également la base de l'URL permalink).
  2. Le contenu d'un fichier de forum est limité à la saisie de texte de base.
  3. Le contenu d'un poste de forum qui permet à HTML.

    J'apprécierais une réponse qui me dit combien de ces fonctions d'évasion que je dois utiliser en combinaison et pourquoi. Merci!


0 commentaires

7 Réponses :


4
votes

mysql_real_escape_string () é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.

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.


2 commentaires

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.



8
votes

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) , vous utiliseriez probablement htmlspecialchars () : il échappera à << / code>, > , ", ' et & - - en fonction des options que vous le donnez.

strip_tags 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" : -)


Une fois que vous avez l'utilisateur entré dans le formulaire (c'est-à-dire lorsque le formulaire a été soumis) , vous devez vous échapper avant de l'envoyer à la DB.
C'est là que des fonctions telles que mysqli_real_escapape_string deviennent utiles: elles échappent aux données pour SQL

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

Vous ne devez pas utiliser quoi que ce soit comme addSlashes : 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, ...) Vous travaillez avec: il saura précisément quoi d'échapper et comment.


Enfin, pour afficher les données à l'intérieur d'une page:

  • Pour les champs qui ne doivent pas contenir HTML, vous devez utiliser htmlspecialchars () : Si l'utilisateur saisit les balises HTML, celles-ci seront affichées selon-elles, et non injectées en tant que HTML.
  • Pour les champs pouvant contenir HTML ... Ceci est un peu plus difficile: vous ne voudriez probablement qu'à autoriser quelques balises, et strip_tags (qui peut faire cela) n'est pas vraiment à la tâche (il laissera les attributs des balises autorisées)
    • Vous voudrez peut-être jeter un coup d'œil à un outil appelé HTMLPurificateur : Cela vous permettra de spécifier les balises et Les attributs doivent être autorisés - et il génère un HTML valide, qui est toujours agréable ^^
    • Cela peut prendre un certain temps pour calculer, et vous ne voulez probablement pas renverser ce HTML à chaque fois doit être affiché; Vous pouvez donc penser à la stocker dans la base de données (que ce soit seulement en gardant uniquement le code HTML propre, ou en gardant à la fois la fois et le non-propre, dans deux champs distincts - pourrait être utile pour permettre aux personnes éditer leurs postes?) < / em>


      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!


0 commentaires

1
votes

la réponse à Cet article est une bonne réponse

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.


1 commentaires

Vous pouvez également le faire avec MySQLI, BTW.



0
votes

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: xxx


0 commentaires

3
votes

Il y a deux types d'attaques complètement différents que vous devez défendre contre:

  • Injection SQL: entrée qui essaie de manipuler votre dB. mysql_real_escape_string () et addSlashes () sont censés défendre contre cela. Le premier est meilleur, mais les requêtes paramétrées sont mieux encore
  • 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 () est le moyen définitif de défendre contre cela.

    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 () . Même alors, vous devez faire attention à ne pas autoriser javascript: 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 de temps en vous assurant de comprendre HTML et JavaScript et CSS complètement.


0 commentaires

0
votes

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.

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.

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.

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é.


0 commentaires

0
votes

i deuxième joeri, ne roule pas la vôtre, allez ici pour voir certaines des nombreuses attaques de XSS possibles

http://ha.ckers.org/xss.html

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.

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.

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.


0 commentaires