Comment échapper à des données de sortie?
Question
Y at-il une aide Magento intégrée pour échapper à des données de modèle pour éviter XSS en sortie?
Ou devrais-je utiliser PHP htmlspecialchars
ou les fonctions de htmlentities
?
La solution
Il existe plusieurs méthodes d'aide en fonction du contexte. Tous sont définis dans Mage_Core_Helper_Abstract
mais aussi dans Mage_Core_Block_Abstract
, vous pouvez donc les utiliser avec $this->...()
dans chaque modèle:
-
escapeHtml()
: Il tire parti réellementhtmlspecialchars
avec les paramètres recommandés pour échapper HTML:$result = htmlspecialchars($result, ENT_COMPAT, 'UTF-8', false);
- Vous pouvez indiquer une liste blanche des balises autorisées et appeler la méthode sur un tableau pour échapper à tous les éléments à la fois. Utilisez ce pour tout texte en ligne. -
quoteEscape()
: une version plus simple sans whitelist et traitement de réseau mais celui-ci échappe à des guillemets simples ainsi que des guillemets doubles, utiles pour le texte dans un attribut HTML .
-
jsQuoteEscape()
: celui-ci échappe à des guillemets simples avec une barre oblique inverse. Il est utilisé pour échapper littéraux chaîne en JavaScript. Mais ceci est non sécurisé . (Par exemple par @Xorax:'test\\\'+alert("powned");//'
). Évasion supplémentaire de antislashs est nécessaire. UtilisezquoteEscape()
à la place! -
escapeUrl()
: Je ne sais pas pourquoi cette méthode existe, il est pas URL encodage des chaînes, il est juste vieuxhtmlspecialchars()
plaine sans aucun paramètre. Ne pas utiliser. Jamais./** * Escape html entities in url * * @param string $data * @return string */ public function escapeUrl($data) { return htmlspecialchars($data); }
-
Sur le même sujet, il y a
urlEncode()
qui ne s'applique également le codage URL, mais à la place base64 ... Ne pas utiliser, si vous ne savez pas exactement ce dont vous avez besoin./** * base64_encode() for URLs encoding * * @param string $url * @return string */ public function urlEncode($url) { return strtr(base64_encode($url), '+/=', '-_,'); }
Oui, la dénomination ne correspond pas. Une fois que tous ces noms de méthode suivaient le schéma somethingEscape()
mais quelqu'un a décidé de déprécier htmlEscape()
et urlEscape()
en faveur des nouvelles méthodes et oublièrent quoteEscape()
et jsQuoteEscape()
.
Autres conseils
Il suffit de le traduire
Vous devriez toujours utiliser la fonction standard translate
Dans une instance de bloc
<?php echo $this->__('Text goes here'); ?>
Partout ailleurs
<?php echo Mage::helper('core')->__('Text goes here'); ?>
Et l'utiliser de la même façon que vous utilisez sprintf
avec PHP
Par exemple.
<?php $foo = 'rocks'; ?>
<?php echo $this->__('Sonassi %s', $foo); ?>
Ou échapper
Dans une instance de bloc
<?php echo $this->escapeHtml('HTML goes here'); ?>
Partout ailleurs
Utilisation Mage/Core/Helper/Abstract.php
escapeHtml($data, $allowedTags = null)
Par exemple.
<?php echo Mage::helper('core')->escapeHtml('HTML goes here'); ?>
Classes Mage_Core_Block_Abstract
et Mage_Core_Helper_Abstract
utilisent tous deux la même fonction Mage_Core_Helper_Abstract::escapeHtml
et de mise en œuvre utilise internaly la fonction PHP en plus mettre en œuvre une logique aditional pour les tableaux avec le contenu HTML.
La fonction est accessible dans tous les blocs et les classes helper à travers cette $ et puisque la fonction est publique, vous pouvez l'utiliser par Mage :: aide ( « cœur »), ou d'une autre classe d'aide, partout ailleurs.
Pour convertir espagnol:
$value = str_replace(array("<", ">"), array("<", ">"), htmlspecialchars("Lorem ipsum >", ENT_COMPAT, "UTF-8", false));