Comment échapper aux données de sortie?


Réponses:


33

Il existe plusieurs méthodes d'assistance selon le contexte. Tous sont définis dans Mage_Core_Helper_Abstractmais aussi dans Mage_Core_Block_Abstract, vous pouvez donc les utiliser avec $this->...()dans chaque modèle:

  • escapeHtml(): Il utilise en fait htmlspecialcharsles paramètres recommandés pour échapper au HTML: $result = htmlspecialchars($result, ENT_COMPAT, 'UTF-8', false);- en outre, vous pouvez spécifier une liste blanche de balises autorisées et appeler la méthode sur un tableau pour échapper à tous les éléments à la fois. Utilisez-le pour tout texte en ligne.
  • quoteEscape(): une version plus simple sans liste blanche ni traitement de tableau mais celle-ci échappe aux guillemets simples ainsi qu'aux guillemets doubles, utile pour le texte dans un attribut HTML .
  • jsQuoteEscape(): celui-ci échappe les guillemets simples avec une barre oblique inverse. Il est utilisé pour échapper aux littéraux de chaîne en JavaScript. Mais ce n'est pas sûr . (Exemple par @Xorax:) 'test\\\'+alert("powned");//'. Un échappement supplémentaire des barres obliques inverses est nécessaire. Utilisez quoteEscape()plutôt!
  • escapeUrl(): Je ne sais pas pourquoi cette méthode existe, ce n'est pas des chaînes d'encodage d'URL, c'est tout simplement ancien htmlspecialchars()sans aucun paramètre. Ne l'utilisez pas. Déjà.

    /**
     * Escape html entities in url
     *
     * @param string $data
     * @return string
     */
    public function escapeUrl($data)
    {
        return htmlspecialchars($data);
    }
  • Sur une note connexe, il y en a urlEncode()qui n'applique pas non plus le codage d'URL, mais la base64 à la place ... Ne l'utilisez pas, 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 est incohérente. Une fois que tous ces noms de méthodes 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 a oublié quoteEscape()et jsQuoteEscape().


jsQuoteEscape est-il vraiment sécurisé? On dirait que str_replace ($ quote, '\\'. $ Quote, ...) ne fait pas le travail ... gist.github.com/xxorax/1c9653fd59785085f96d4f676bc64ee2
Xorax

@Xorax très bon point. Je mettrai à jour la réponse.
Fabian Schmengler

21

Il suffit de le traduire

Vous devez toujours utiliser la fonction de traduction standard

Dans une instance de bloc

<?php echo $this->__('Text goes here'); ?>

N'importe où ailleurs

<?php echo Mage::helper('core')->__('Text goes here'); ?>

Et utilisez-le comme vous le feriez sprintfavec PHP

Par exemple.

<?php $foo = 'rocks'; ?>
<?php echo $this->__('Sonassi %s', $foo); ?>

Ou y échapper

Dans une instance de bloc

<?php echo $this->escapeHtml('HTML goes here'); ?>

N'importe où ailleurs

En utilisant Mage/Core/Helper/Abstract.php

escapeHtml($data, $allowedTags = null)

Par exemple.

<?php echo Mage::helper('core')->escapeHtml('HTML goes here'); ?>

Remarque importante: Mage_Core_Block_Abstract::htmlEscape()est obsolète à partir de Magento v 1.4.0.0-rc1 et Mage_Core_Block_Abstract::escapeHtml()doit être utilisé à la place.
barell

5
Autre remarque importante: la traduction n'échappe à rien . Essayez-le: $this->__('Hello %s', '<script>alert("XSS!")</script>').
Fabian Schmengler

3

Les classes Mage_Core_Block_Abstractet les Mage_Core_Helper_Abstractdeux utilisent la même fonction Mage_Core_Helper_Abstract::escapeHtmlet sa mise en œuvre utilise en interne la fonction PHP htmlspecialchars en plus d'implémenter une logique supplémentaire pour les tableaux avec du contenu HTML.

La fonction est accessible dans toutes les classes de bloc et d'assistance via $ this et puisque la fonction est publique, vous pouvez l'utiliser via Mage :: helper ('core'), ou une autre classe d'assistance, partout ailleurs.


-1

Pour convertir espagnol:

$value = str_replace(array("&lt;", "&gt;"), array("<", ">"), htmlspecialchars("Lorem ipsum &gt;", ENT_COMPAT, "UTF-8", false));
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.