Nous discuterons des dangers d’une sortie non nettoyée et proposerons un moyen sûr d’afficher une sortie formatée.
Aucun risque de filtrage de la sortie
Si vous obtenez simplement une entrée d'utilisateur et que vous l'affichez ensuite, vous risquez de casser votre page de sortie, par exemple quelqu'un peut intégrer de manière malveillante du javascript dans la zone de saisie qu'il soumet :
Ceci est mon commentaire
<script language="javascript:
alert ("Faites quelque chose de mal
.ici!')">.
De cette manière, même si l'utilisateur n'est pas malveillant, certaines de vos instructions HTML seront endommagées, comme par exemple un tableau interrompu brusquement ou une page affichée de manière incomplète.
Afficher uniquement le texte non formaté
C'est la solution la plus simple, vous affichez simplement les informations soumises par l'utilisateur sous forme de texte non formaté. Utilisez la fonction htmlspecialchars() pour convertir tous les caractères en codage HTML.
Par exemple, <b> sera converti en <b>, ce qui garantit qu'aucune balise HTML inattendue ne sera affichée à des moments inappropriés.
C'est une bonne solution si vos utilisateurs ne se soucient que du contenu textuel non formaté. Mais ce serait mieux si vous lui donniez une certaine capacité de formatage.
Formatage avec des balises de balisage personnalisées
Balises propres à l'utilisateur pour le formatage
Vous pouvez fournir des balises spéciales que les utilisateurs peuvent utiliser. Par exemple, vous pouvez autoriser l'utilisation de [b]...[/b] pour mettre en valeur l'affichage, [i].. .[/i ] Affichage en italique, effectuez simplement une simple opération de recherche et de remplacement : $output = str_replace("[b]", "<b>",
$output = str_replace("[i]", " <i >", $output);
Mieux encore, nous pouvons permettre à l'utilisateur de saisir certains liens. Par exemple, l'utilisateur sera autorisé à saisir [link="url"]...[/link], que nous convertirons en une instruction <a href="">...</a>
à ce moment-là
., nous ne pouvons pas utiliser une simple recherche. Le remplacement doit être effectué à l'aide d'expressions régulières :
$output = ereg_replace('[link="([[:graph:]]+)"]', '<a href="1">' , $output);
L'exécution de ereg_replace() consiste
à trouver la chaîne où [link="..."] apparaît et à la remplacer par <a href="...">
[[:graph:]] signifie n'importe quel caractère non vide Veuillez consulter les articles connexes pour les expressions régulières.
La fonction format_output() dans outputlib.php assure la conversion de ces balises. Le principe général est le suivant : China Network Management Alliance bitsCN.com
appelle htmlspecialchars() pour convertir les balises HTML en encodages spéciaux, filtrer les balises HTML qui ne doivent pas être affichées, puis convertissez une série de nos balises personnalisées en balises HTML correspondantes.
Veuillez consulter le code source ci-dessous :
<?php
function format_output($output) {
/****************************************** **********************************
* Prend une chaîne brute ($output) et la formate pour la sortie à l'aide d'un outil spécial
* balisage simplifié similaire au HTML
************************************************** * *****************************/
$output = htmlspecialchars(stripslashes($output));
/* nouveau paragraphe */
$output = str_replace('[p]', '<p>', $output);
/* audacieux */
$output = str_replace('[b]', '<b>', $output);
$output = str_replace('[/b]', '</b>', $output);
/* italique */
$output = str_replace('[i]', '<i>', $output);
$output = str_replace('[/i]', '</i>', $output);Bits de gestion de réseaucn_com
/* formaté */
$output = str_replace('[pre]', '<pre>', $output);
$output = str_replace('[/pre]', '</pre>', $output);
/* blocs indentés (blockquote) */
$output = str_replace('[indent]', '<blockquote>', $output);
$output = str_replace('[/indent]', '</blockquote>', $output);
/* ancres */
$output = ereg_replace('[anchor="([[:graph:]]+)"]', '<a name="1"></a>', $output);
/* liens, notez que nous essayons d'empêcher le javascript dans les liens */
$output = str_replace('[link="javascript', '[link=" javascript', $output);
$output = ereg_replace('[link="([[:graph:]]+)"]', '<a href="1">', $output);
$output = str_replace('[/link]', '</a>', $output);
return nl2br ($ sortie);
}
?>
Quelques notes :
N'oubliez pas de remplacer la balise personnalisée pour générer la chaîne de balise HTML après avoir appelé la fonction htmlspecialchars(), pas avant cet appel, sinon votre travail acharné sera inutile après l'appel du flux htmlspecialchars().
Une fois
le bitcn_com de gestion du réseau
converti, le code HTML de recherche sera remplacé. Par exemple, les guillemets doubles "deviendront".La fonction nl2br() convertit les caractères de retour chariot et de saut de ligne en balises <br>, qui doivent également être converties. être après htmlspecialchars().
Lors de la conversion de [links=""] en <a href="">, vous devez vous assurer que l'émetteur n'insérera pas de javascript. Un moyen simple de changer [link="javascript en [link=" javascript, de cette façon ne le fera pas. Remplacement, affichez simplement le code d'origine.
outputlib.php
appelle test.php dans le navigateur. Vous pouvez voir l'utilisation de format_output()
La balise HTML normale ne peut pas être utilisée par la balise spéciale suivante :
- c'est [b]bold[/b].
- c'est [i]italique[/i]
- ceci est [link=" http://www.phpbuilder.com"]un lien[/link]
- ceci est [anchor="test"]une ancre et un [link="#test"]lien[/link] vers l'ancre
[p]paragraphe
[pre]Préformaté[/pre]
[indent]Texte entrelacé[/indent]
sûr
, vous êtes libre d'ajouter plus de balises en fonction de vos besoins. Network Management Alliance bitsCN@com
ConclusionCette
discussion fournit une méthode pour afficher en toute sécurité les entrées de l'utilisateur, qui peuvent. être utilisé dans
les utilisateurs du forum suggèrent des annonces système
dans les programmes suivants
Système BBS