Décodage mysql_real_escape_string() pour la sortie HTML
Je suis en train de me protéger contre l'injection sql et je suis en utilisant:
mysql_real_escape_string($string);
Lors de la validation HTML, il ressemble à quelque chose comme ceci:
<span class="\"className\"">
<p class="\"pClass\"" id="\"pId\""></p>
</span>
Je ne suis pas sûr de savoir comment beaucoup de variations real_escape_string ajoute que, si ne souhaitez pas il suffit de remplacer quelques-unes et les autres miss... Comment faire pour "décoder" ce retour en correctement formaté en HTML, avec quelque chose comme:
html_entity_decode(stripslashes($string));
Si l'utilisateur de contrôler la chaîne$, alors c'est une vulnérabilité XSS.
OriginalL'auteur Peter Craig | 2010-04-04
Vous devez vous connecter pour publier un commentaire.
La mysql_real_escape_string() page de manuel vous indique quels sont les caractères échappés:
Vous pourrait réussir à inverser la échapper par le remplacement de celles des caractères d'échappement avec leur sans échappement formes.
mysql_real_escape_string()
ne doit pas être utilisé pour nettoyer le code HTML si... il n'y a aucune raison de l'utiliser avant de sortir de la page web de données. Il doit être utilisé uniquement sur les données que vous êtes sur le point de mettre dans la base de données. Votre processus d'assainissement devrait ressembler à quelque chose comme ceci:Entrée
mysql_real_escape_string()
Sortie
htmlspecialchars()
avant l'impressionL'aide d'un autre pilote de base de données tels que MySQLi ou AOP vous permettra d'utiliser les requêtes préparées, qui prennent soin de s'en échapper, la plupart des intrants pour vous. Toutefois, si vous ne pouvez pas passer ou de prendre avantage de ces, certainement utiliser
mysql_real_escape_string()
... juste l'utiliser avant l'insertion des données.mysql_real_escape_string
. Ethtmlspecialchars
n'est pas toujours le bon choix. Parfois, liste blanche est une meilleure option.Remarque! Si vous avez magic_quotes', même avec PDO, vous devez utiliser l'option " stripslashes()' avant de mettre les chaînes à la base de données pour éviter les doubles barres obliques.
Mais aucun système moderne devrait avoir magic_quotes. Cette fonction est obsolète depuis des années.
OriginalL'auteur zombat
mysql_real_escape_string
est utilisé pour prévenir l'injection SQL lors de l'entreposage de l'utilisateur fourni des données dans la base de données, mais une meilleure méthode serait d'utiliser la liaison de données à l'aide de AOP (par exemple). Je le recommande toujours à l'aide de qui au lieu de vous embêter à s'échapper.Cela étant dit, concernant votre question sur la façon de les afficher par la suite - une fois les données stockées, lorsque vous récupérer les données est complète et valide sans avoir besoin d'être "sans échappement". Sauf si vous avez ajouté vos propres séquences d'échappement, donc merci de ne pas le faire.
OriginalL'auteur Guss
Vous avez tout foiré.
mysql_real_escape_string n'avez pas besoin de tout décodage.
si vous récupérer vos données avec des barres obliques, cela signifie qu'il a été échappé deux fois. Et plutôt que de se dénuder les extra barres obliques, vous devriez tout simplement pas à les ajouter.
Pour ne pas mentionner que, quelle que soit l'échappement est obsolète et vous devriez
utiliser les requêtes préparées
au lieu de quoi échapper à la chaîne.
De ne jamais s'échapper, jamais décoder.
Le problème a été résolu.
Heikens Mais je travaille avec mysql. Et je en utiliser des tonnes de mysql caractéristiques spécifiques. Allez me dire de ne pas utiliser PHP comme il n'est pas pris en charge partout. Ce qu'est un non-sens de commentaires!
Comme Guss a souligné, l'échappement est nécessaire pour protéger vos données contre les injections SQL.
OriginalL'auteur Your Common Sense
Pas sûr de ce qui se passe avec la mise en forme que je peux voir, mais votre formulaire html
devrait être tout simplement;
Lorsque vous obtenez de retour, avant de le mettre dans la base de données vous échapper utilisation de mysql_real_escape_string() pour vérifier que vous ne souffrez pas d'une attaque par injection sql.
Donc vous échapper les valeurs prêt pour placer le texte va à côté.
Lorsque vous sortez de la base de données ( ou de l'afficher à l'utilisateur au format html), puis de vous échapper de nouveau prêt pour que ce lieu qu'il se passe à côté (html) avec htmlentities (), etc afin de protéger vos utilisateurs contre les attaques XSS.
Cette EO partie du mantra FIEO, Filtre d'Entrée, Échapper à la Sortie, qui vous doit de la carte de tatouage sur l'intérieur de vos paupières.
OriginalL'auteur Cups
Bien, j'ai pris un coup de couteau à l'ancienne façon et jusqu'à présent je n'arrive pas à voir quelque chose de mal avec ma démarche. Bien évidemment, il est un peu brut, mais il fait le travail:
Ce qui devrait couvrir la plupart des cas.
OriginalL'auteur Muhwu
Je me demandais pourquoi cette routine n'a pas un accompagnement décodeur de routine. C'est probablement interprété par MySQL exactement de la même manière que si elle n'était pas échappé. Vous obtenez de l'onu, échappé résultats lorsque vous faites un
$row=mysql_fetch_array($res, MYSQL_ASSOC)';
OriginalL'auteur HELPFUL_SHADOW
Même si c'est une vieille question...
J'ai eu le même problème que Pierre Craig.
En fait, j'ai à traiter avec un vieux de la CMS. Afin de prévenir l'Injection SQL, tous les $_POST et $_GET valeurs sont "sql-échappé". Malheureusement, cela se fait en un point central, de sorte que tous vos modules de recevoir toutes les données sql échappé! Dans certains cas, vous souhaitez directement l'affichage de ces données, afin de faire face à un problème: comment faire pour afficher un sql-échappé à la chaîne sans gettng de DB?
La réponse est:
utilisation stripcslashes (PAS stripslashes!!)
http://php.net/manual/en/function.stripcslashes.php
OriginalL'auteur Peter
utiliser la fonction suivante pour supprimer les barres obliques tout en montrant sur la page HTML:
stripslashes();
par exemple.
$html=stripslashes($html);
OU
$html=stripslashes($row["fieldname"]);
OriginalL'auteur Nandkishor Gokhe
Je pense qu'un certain nombre d'autres réponses raté le problème évident...
Vous utilisez mysql_real_escape_string sur la saisie de contenu (que vous devriez si vous n'utilisez pas les requêtes préparées).
Votre problème est avec la sortie.
Le problème actuel est que vous appelez html_entity_decode. Juste stripslashes est tout ce que vous devez rétablir le texte initial. html_entity_decode est qu'est-ce que gâcher votre devis, etc, comme il est en train de changer. Vous voulez réellement pour la sortie du html, pas juste du texte brut (qui est lorsque vous utilisez le html_entities, etc). Vous êtes décodage quelque chose que vous souhaitez encoder.
Si vous voulez seulement le texte de la version, vous pouvez utiliser les entités. Si vous êtes inquiet au sujet de la mauvaise balises, il faut utiliser striptags et autoriser uniquement les balises que vous souhaitez (par exemple b, i, etc).
Enfin, n'oubliez pas d'encoder et de décoder les dans le bon ordre. si vous avez exécuté mysql_real_escape_String(htmlentities($str)), alors vous avez besoin pour exécuter html_entity_decode(stripslashes($str)). L'ordre des opérations de questions.
Mise à JOUR: je ne savais pas que html_entity_decode également des bandes de barres obliques. Il n'a pas été clairement documenté sur cette page, et je n'ai jamais attrapé. Je vais quand même l'exécuter automatiquement si, comme la plupart des html que je vous présente je tiens à gauche comme des entités, et même si je n'ai pas, je préfère prendre une décision en dehors de ma classe db, sur une base de cas par cas. De cette façon, je sais que les barres obliques sont partis.
Il semble que l'affiche originale est en cours d'exécution htmlentities (ou de son programme d'entrée, comme tinymce est de le faire pour lui), et il veut revenir dans le contenu. Donc, html_entity_decode($Str) devrait être tout ce qui est nécessaire.
Il NE faut de la bande de barres obliques, comme il a couru échapper à la chaîne sur elle d'abord. Il a encodé, maintenant il a besoin de décoder de manière à se débarrasser des barres obliques dans la sortie. D'où l' \ apparaissant avant le ".
Vous n'avez pas la moindre idée de comment la chose fonctionne. Afin de mieux interdiction-vous de répondre jusqu'à ce que vous apprendre quelques. Pas de décapage nécessaire. Essayez-le vous-même.
Enfin, n'oubliez pas d'encoder et de décoder les dans le bon ordre. si vous avez exécuté mysql_real_escape_String(htmlentities($str)), pas de decodeing action requise. Aller à la figure. si vous ne voulez pas des entités - il suffit de ne pas coder. Si vous n' - pourquoi à décoder?
Ma classe de base de données s'exécute real_escape_string avant chaque insertion. Afin de se débarrasser des barres obliques devant les guillemets, je dois courir stripslashes, ou les barres obliques sont échappés. Je ne sais absolument comment cela fonctionne - je écrire ce genre de choses tout le temps. Il essaie d'obtenir son code html, il existe des barres obliques. Comment les autres que stripslashes prévoyez-vous faire cela sans compliquer à l'excès? Il doit s'assurer qu'il possède les entités de retour tout d'abord bien! Le problèmes est qu'il fonctionne bande tout d'abord, il doit être en cours d'exécution décoder premier.
OriginalL'auteur Cryophallion