出力データをエスケープする方法は?


回答:


33

コンテキストに応じて、いくつかのヘルパーメソッドがあります。すべてはで定義されてMage_Core_Helper_AbstractMage_Core_Block_Abstractますが、でも定義されているため$this->...()、すべてのテンプレートで使用できます。

  • escapeHtml()htmlspecialchars推奨パラメーターを使用して実際にHTMLをエスケープします$result = htmlspecialchars($result, ENT_COMPAT, 'UTF-8', false);。-さらに、許可されたタグのホワイトリストを指定し、配列のメソッドを呼び出してすべての要素を一度にエスケープできます。これをインラインテキストに使用します。
  • quoteEscape():ホワイトリストと配列処理のないよりシンプルなバージョンですが、これは単一引用符と二重引用符をエスケープします。HTML属性内のテキストに便利です
  • jsQuoteEscape():これは一重引用符をバックスラッシュでエスケープします。JavaScriptで文字列リテラルをエスケープするために使用されます。しかし、これは安全ではありません。(@Xoraxの例:)'test\\\'+alert("powned");//'。バックスラッシュの追加のエスケープが必要です。代わりに使用してくださいquoteEscape()
  • escapeUrl():このメソッドが存在する理由私はそれがだ、知らないではない URLエンコード文字列、それだけで、昔ながらのだhtmlspecialchars()任意のパラメータなし。使用しないでください。今まで。

    /**
     * Escape html entities in url
     *
     * @param string $data
     * @return string
     */
    public function escapeUrl($data)
    {
        return htmlspecialchars($data);
    }
    
  • 関連するメモには、urlEncode()URLエンコーディングを適用しないものもありますが、代わりにbase64 ... 必要なものが正確にわからない場合は、使用しないでください。

    /**
     *  base64_encode() for URLs encoding
     *
     *  @param    string $url
     *  @return   string
     */
    public function urlEncode($url)
    {
        return strtr(base64_encode($url), '+/=', '-_,');
    }

はい、命名に一貫性がありません。すべてたら、それらのメソッド名は、スキームを以下ましたsomethingEscape()が、その後誰かが廃止することを決めたhtmlEscape()urlEscape()の新たな方法を支持すると忘れquoteEscape()jsQuoteEscape()


jsQuoteEscapeは本当に安全ですか?str_replace($ quote、 '\\'。$ quote、...)は役に立た
Xorax

@Xoraxの非常に良い点。答えを更新します。
ファビアンシュメングラー

21

翻訳するだけ

常に標準の変換機能を使用する必要があります

ブロックインスタンス

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

どこか他の

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

そしてsprintf、PHPで使用するのと同じ方法で使用します

例えば。

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

またはそれを逃れる

ブロックインスタンス

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

どこか他の

を使用して Mage/Core/Helper/Abstract.php

escapeHtml($data, $allowedTags = null)

例えば。

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

重要な注意:Mage_Core_Block_Abstract::htmlEscape()は、Magento v 1.4.0.0-rc1で非推奨になり、Mage_Core_Block_Abstract::escapeHtml()代わりに使用する必要があります。
バレル14年

5
別の重要な注意:翻訳は何もエスケープしません。試してみてください:$this->__('Hello %s', '<script>alert("XSS!")</script>')
ファビアンシュメングラー

3

クラスMage_Core_Block_AbstractMage_Core_Helper_Abstract両方が同じ関数Mage_Core_Helper_Abstract::escapeHtmlを使用し、その実装は、HTMLコンテンツを含む配列のいくつかの追加ロジックを実装することに加えて、PHP htmlspecialchars関数を内部的に使用します。

この関数は、すべてのブロッククラスおよびヘルパークラスで$ thisを介してアクセスできます。関数はパブリックなので、他の場所でMage :: helper( 'core')または他のヘルパークラスを使用して使用できます。


-1

スペイン語の変換の場合:

$value = str_replace(array("&lt;", "&gt;"), array("<", ">"), htmlspecialchars("Lorem ipsum &gt;", ENT_COMPAT, "UTF-8", false));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.