Existe-t-il un assistant Magento intégré pour échapper les données de modèle générées afin d'empêcher XSS?
Ou devrais-je simplement utiliser le PHP htmlspecialchars
ou les htmlentities
fonctions?
Existe-t-il un assistant Magento intégré pour échapper les données de modèle générées afin d'empêcher XSS?
Ou devrais-je simplement utiliser le PHP htmlspecialchars
ou les htmlentities
fonctions?
Réponses:
Il existe plusieurs méthodes d'assistance selon le 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 utilise en fait htmlspecialchars
les 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()
.
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 sprintf
avec PHP
Par exemple.
<?php $foo = 'rocks'; ?>
<?php echo $this->__('Sonassi %s', $foo); ?>
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'); ?>
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.
$this->__('Hello %s', '<script>alert("XSS!")</script>')
.
Les classes Mage_Core_Block_Abstract
et les Mage_Core_Helper_Abstract
deux utilisent la même fonction Mage_Core_Helper_Abstract::escapeHtml
et 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.