Gibt es einen integrierten Magento-Helfer, der ausgegebene Vorlagendaten umgeht, um XSS zu verhindern?
Oder soll ich einfach das PHP htmlspecialchars
oder die htmlentities
Funktionen nutzen?
Gibt es einen integrierten Magento-Helfer, der ausgegebene Vorlagendaten umgeht, um XSS zu verhindern?
Oder soll ich einfach das PHP htmlspecialchars
oder die htmlentities
Funktionen nutzen?
Antworten:
Je nach Kontext gibt es mehrere Hilfsmethoden. Alle sind in, Mage_Core_Helper_Abstract
aber auch in definiert Mage_Core_Block_Abstract
, sodass Sie sie $this->...()
in jeder Vorlage verwenden können:
escapeHtml()
: Es nutzt tatsächlich htmlspecialchars
die empfohlenen Parameter, um HTML zu umgehen: $result = htmlspecialchars($result, ENT_COMPAT, 'UTF-8', false);
- Zusätzlich können Sie eine Whitelist zulässiger Tags angeben und die Methode für ein Array aufrufen, um alle Elemente auf einmal zu umgehen. Verwenden Sie dies für jeden Inline-Text.quoteEscape()
: Eine einfachere Version ohne Whitelist- und Array-Verarbeitung, bei der jedoch sowohl einfache als auch doppelte Anführungszeichen vermieden werden. Dies ist nützlich für Text innerhalb eines HTML-Attributs .jsQuoteEscape()
: dieser entgeht einfachen Anführungszeichen mit einem Backslash. Es wird verwendet, um String-Literale in JavaScript zu maskieren. Dies ist jedoch nicht sicher . (Beispiel von @Xorax:) 'test\\\'+alert("powned");//'
. Ein zusätzliches Entgehen von Backslashes ist erforderlich. Verwenden Sie quoteEscape()
stattdessen!escapeUrl()
: Ich weiß nicht, warum diese Methode existiert, es ist keine URL-Codierung, es ist einfach alt htmlspecialchars()
ohne Parameter. Benutze es nicht. Je.
/**
* Escape html entities in url
*
* @param string $data
* @return string
*/
public function escapeUrl($data)
{
return htmlspecialchars($data);
}
In einem verwandten Hinweis gibt es, urlEncode()
das auch keine URL-Codierung anwendet, sondern base64 ... Verwenden Sie es nicht, wenn Sie nicht genau wissen, was Sie benötigen.
/**
* base64_encode() for URLs encoding
*
* @param string $url
* @return string
*/
public function urlEncode($url)
{
return strtr(base64_encode($url), '+/=', '-_,');
}
Ja, die Benennung ist inkonsistent. Nachdem alle diese Methodennamen dem Schema somethingEscape()
gefolgt waren, entschied sich jemand, die neuen Methoden zu missbrauchen htmlEscape()
und urlEscape()
zu bevorzugen, und vergaß quoteEscape()
und jsQuoteEscape()
.
Sie sollten immer die Standardübersetzungsfunktion verwenden
In einer Blockinstanz
<?php echo $this->__('Text goes here'); ?>
Irgendwo anders
<?php echo Mage::helper('core')->__('Text goes here'); ?>
Und verwenden Sie es genauso, wie Sie es sprintf
mit PHP verwenden würden
Z.B.
<?php $foo = 'rocks'; ?>
<?php echo $this->__('Sonassi %s', $foo); ?>
In einer Blockinstanz
<?php echo $this->escapeHtml('HTML goes here'); ?>
Irgendwo anders
Verwenden Mage/Core/Helper/Abstract.php
escapeHtml($data, $allowedTags = null)
Z.B.
<?php echo Mage::helper('core')->escapeHtml('HTML goes here'); ?>
Mage_Core_Block_Abstract::htmlEscape()
Wird ab Magento 1.4.0.0-rc1 nicht mehr unterstützt und Mage_Core_Block_Abstract::escapeHtml()
sollte stattdessen verwendet werden.
$this->__('Hello %s', '<script>alert("XSS!")</script>')
.
Klassen Mage_Core_Block_Abstract
und Mage_Core_Helper_Abstract
beide verwenden dieselbe Funktion, Mage_Core_Helper_Abstract::escapeHtml
und die Implementierung verwendet intern die Funktion PHP htmlspecialchars, zusätzlich zur Implementierung zusätzlicher Logik für Arrays mit HTML-Inhalten.
Auf die Funktion kann in allen Block- und Hilfsklassen über $ this zugegriffen werden. Da die Funktion öffentlich ist, können Sie sie über Mage :: helper ('core') oder eine andere Hilfsklasse überall verwenden.