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?

Était-ce utile?

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éellement htmlspecialchars 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. Utilisez quoteEscape() à la place!
  • escapeUrl(): Je ne sais pas pourquoi cette méthode existe, il est pas URL encodage des chaînes, il est juste vieux htmlspecialchars() 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("&lt;", "&gt;"), array("<", ">"), htmlspecialchars("Lorem ipsum &gt;", ENT_COMPAT, "UTF-8", false));
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top