Wie entkomme ich Ausgabedaten?

27

Gibt es einen integrierten Magento-Helfer, der ausgegebene Vorlagendaten umgeht, um XSS zu verhindern?

Oder soll ich einfach das PHP htmlspecialcharsoder die htmlentitiesFunktionen nutzen?

Aaron Pollock
quelle
Wenn Sie nach Magento 2 suchen, wenden
Fabian Schmengler,

Antworten:

33

Je nach Kontext gibt es mehrere Hilfsmethoden. Alle sind in, Mage_Core_Helper_Abstractaber auch in definiert Mage_Core_Block_Abstract, sodass Sie sie $this->...()in jeder Vorlage verwenden können:

  • escapeHtml(): Es nutzt tatsächlich htmlspecialcharsdie 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().

Fabian Schmengler
quelle
jsQuoteEscape ist es wirklich sicher? Sieht so aus, als würde str_replace ($ quote, '\\'. $ Quote, ...) nicht die Aufgabe übernehmen ... gist.github.com/xxorax/1c9653fd59785085f96d4f676bc64ee2
Xorax
@Xorax sehr guter Punkt. Ich werde die Antwort aktualisieren.
Fabian Schmengler
21

Übersetze es einfach

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 sprintfmit PHP verwenden würden

Z.B.

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

Oder entkomme ihm

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'); ?>
Ben Lessani - Sonassi
quelle
Wichtiger Hinweis: 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.
Barell
5
Ein weiterer wichtiger Hinweis: Die Übersetzung entgeht nichts . Probieren Sie es aus: $this->__('Hello %s', '<script>alert("XSS!")</script>').
Fabian Schmengler
3

Klassen Mage_Core_Block_Abstractund Mage_Core_Helper_Abstractbeide verwenden dieselbe Funktion, Mage_Core_Helper_Abstract::escapeHtmlund 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.

Domen Vrankar
quelle
-1

Für spanisch konvertieren:

$value = str_replace(array("&lt;", "&gt;"), array("<", ">"), htmlspecialchars("Lorem ipsum &gt;", ENT_COMPAT, "UTF-8", false));
jruzafa
quelle