web-dev-qa-db-ja.com

ショートコード属性からの引用符のエスケープ

私はショートコードの属性から引用符(シングルとダブル)をエスケープする方法を見つけようとしています。

基本的にコンテンツはユーザによって書かれているので潜在的に "and 'quotesを含むことができます。

"attibute ="ここに "引用符"が付いたテキストがあるので、属性は停止されます。

そのため、文字列全体を取得する代わりに、2番目の引用符の組で停止します。

今、私はそれを一重引用符でセットアップすることが可能であるかもしれないことを知っています、しかしユーザーがテキストの中で一重引用符を使うならば同じ苦境を残す。

私はさまざまなPHP/WPの解決策を見てきましたが、どれでもうまく動かないようです(例:esc_html、htmlspecialchars、htmlentities)。

たぶん私はそれを間違って設定したか、適切な場所でエンコーディングを実行していません。

これが現在私が使っているもの(エンコードなし)です。

function aps_person_schema_shortcode( $atts, $content = null)   {

extract( shortcode_atts( array(     
            'aps_person_description' => ''
        ), $atts
    )
);

$aps_person_return = '<div class="aps_person_container aps_container">';
$aps_person_return .= '<p class="aps_person_description" itemprop="description">' . $aps_person_description . '</p>';
$aps_person_return .= '</div>';

return $aps_person_return;

}
add_shortcode('aps_person', 'aps_person_schema_shortcode');

抽出配列の後に追加してみた

$aps_person_description = esc_html($atts['aps_person_description']); 

しかし、属性はすでに壊れているので(print_rは、引用符の後の文字列が各Wordの配列項目に分かれていることを表示します)、文字列をエスケープすることはできません。

配列の前にそれを試してみました、そしてそれは私が通知を得るどちらでもうまくいかない。未定義のインデックス

それで、明確にするために、ショートコード属性データのためのユーザー入力をサニタイズすることについてどう思いますか?

4
Apina

それはあなたが間違った目的に取り組んでいるようです。

ショートコードの出力ではなく、たとえば sanitize_text_field を使用して、ユーザー入力をサニタイズしてみてください。

2
tfrommen

WordPressのショートコードシステムは、shortcode_parse_atts($text);関数を使用してショートコードエントリを解析して属性の名前と値を取得し、それらをペアで$atts配列に格納してから、ショートコード関数に渡します。だからあなたのケースではこのようにショートコード関数にエスケープアクションを追加します:

$aps_person_description = esc_html($atts['aps_person_description']); 

shortcode_parse_atts()はすでに属性の名前と値を検索していて、属性の値の引用符を誤って解釈している可能性があるので機能しません。

よく見ると、関数shortcode_parse_atts()はこの正規表現パターンを使います。

/(\w+)\s*=\s*"([^"]*)"(?:\s|$)|(\w+)\s*=\s*\'([^\']*)\'(?:\s|$)|(\w+)\s*=\s*([^\s\'"]+)(?:\s|$)|"([^"]*)"(?:\s|$)|(\S+)(?:\s|$)/

以下の形式で属性の名前と値を認識します。

1. attr1="value1"
2. attr2='value2'
3. attr3=value3
4. "value4"
5. value5

そのため、ユーザーが値に引用符を入れると、簡単に失敗する可能性があります。例えば:

[my_shortcode dog='Santa's Little Helper' /]    
// $attr is Array ( [0] => dog='Santa's [1] => Little [2] => Helper' )
// should be Array ( [dog] => Santa's Little Helper )

解析後のサニタイズは明らかに遅すぎますが、解析前のサニタイズはどうでしょうか。まだ処理する属性の値がないため、エントリ全体をサニタイズする必要があります。しかし、これも問題を引き起こします、例えば:

html_entities("[my_shortcode dog='Santa's Little Helper' /]", ENT_QUOTES);
// now entry is [my_shortcode dog=&#039;Santa&#039;s Little Helper&#039; /]
// after parsing: 
Array
(
    [dog] => &#039;Santa&#039;s
    [0] => Little
    [1] => Helper&#039;
)

パラドックスは次のとおりです。解析エンジンが正しく解析するようにするために、属性値をサニタイズする必要があります。しかし、これを行うには、値を取得するために最初に解析エンジンを実行する必要があります。

結論として、すべてがうまくいっていることを確認するための合理的な方法は、ユーザーが適切にフォーマットされた属性を入力するのを確実にすることであると思います。参考までに、私の経験は$contentを利用することです。あなたの場合、私はaps_person_description$contentに入れるでしょう、それはこのように見えるかもしれません:

[my_shortcode]some text here with "quotes" so it stops the attribute....[/my_shortcode]

そして引用符はそれほど問題にならないでしょう。

6
samluthebrave

あなたはesc_attr()をチェックアウトすることができます

<、>、&、 "および '(小なり、大なり、アンパサンド、二重引用符、一重引用符)の文字をエンコードします。エンティティを二重エンコードすることはありません。

http://codex.wordpress.org/Function_Reference/esc_attr

1
birgire