0

私は主に Wordpress の男で、Drupal 7 のコツを学ぼうとしています。私の質問は、テンプレートのベスト プラクティスとセキュリティの問題に関連しています。私は非常に複雑なデザインを扱っているので (そう、デザイナーですよね!?)、マークアップはクリーンで適切なものである必要があり、Drupal ではテンプレート ファイルと関数の階層が大きいため、これが非常に困難であることがわかりました。基本的に、私が見つけたワークフローは、ノード レベルで本当に特殊なマークアップが必要な特定のコンテンツ タイプの出力をオーバーライドすることです。

例えば: node--custom-content-type.tpl.php

私が言ったように、私はワードプレスの男であり、データベースクエリを実行し、必要な正確なフィールド値を取得して、好きなように使用できることに慣れています。私は kpr または $variables 配列を出力し、その内容を調べ、次のように値を直接取得しました。

$link = $variables['field_link'][0]['url'];
$link_title = $variables['field_link'][0]['title'];
$target = $variables['field_link'][0]['attributes']['target'];
$text = $variables['field_main_text'][0]['safe_value'];

そして、思い通りにマークアップ内の変数をエコーアウトして使用します。

<article class="getstarted-wrapper">
    <a id="tocollege" target="<?php print_r($target); ?>" title="<?php print_r($link_title); ?>" href="<?php print_r($link); ?>"><img src="/sites/all/themes/amped/images/visiticon.png" /></a>
    <a id="mapcollege" target="_blank" title="View Location In Google Maps" href="<?php echo $maplink; ?>"><img src="/sites/all/themes/amped/images/mapicon.png" /></a>
    <div class="getstarted-top" style="background:<?php print_r($bg);  ?>;">
        <figure>
            <img title="<?php print_r($auth_title);  ?>" alt="<?php print_r($auth_alt); ?>" src="<?php print_r($auth_img); ?>" />
        </figure>
    </div><!--getstarted-top-->
    <div class="getstarted-bottom">
        <p><?php print_r($text); ?></p>
        <a target="<?php print_r($target); ?>" title="<?php print_r($link_title); ?>" href="<?php print_r($link); ?>">Get Started</a>
        <span>This will take you to <?php print_r($college_name);  ?></span>
    </div><!--getstarted-bottom-->  
</article><!--getstarted-wrapper-->

このプロセスがベスト プラクティスとどのように一致するのか、何が間違っているのか、何が正しく行われているのか、そしてさらに重要なことに、セキュリティ リスクとは何か、それらを回避するにはどうすればよいのか疑問に思っています。

4

2 に答える 2

1

プレーン テキスト文字列 (つまり、意図的にマークアップされていないもの) を HTML ページに出力するたびに、それをエスケープする必要があります。

通常、htmlspecialchars()関数で行われるプレーンな PHP テンプレート。Drupal はcheck_plain()、非常に短いものではありませんが、ショートカットとして提供しています。痛みを軽減するために、独自の短いカットを定義できます。

function h($s) {
    echo htmlspecialchars($s, ENT_QUOTES, 'utf-8');
}

<a id="tocollege" target="<?php h($target); ?>" title="<?php h($link_title); ?>" href="<?php h($link); ?>">...

(これが何のために使用されたのかはわかりません。print_rこれは伝統的に、デバッグ用の読み取り可能な構造化オブジェクト出力を生成するために使用されますが、その出力形式は一般に、実動 Web ページで必要なものではなく、あなたの例ではとにかく違いがない文字列にのみ使用されていました。)

于 2013-07-10T20:48:24.207 に答える
1

Drupal での正しいアプローチは、出力時にユーザー入力をサニタイズすることです。Drupalには(HTMLだけでなく)複数の出力モードがあるため、入力時にサニタイズするのは不適切です. check_plain は、使用可能ないくつかのフィルター関数の 1 つです。詳細については、 https: //drupal.org/node/28984 を参照してください。

出力をオーバーライドしてテーマ変数にアクセスする場合、check_plain (または他のフィルター関数) を自分で実行するのがベスト プラクティスです。ノード プロパティの場合は、上記のリンクで説明されているように、「安全な」プロパティを使用することもできます。

于 2013-07-13T22:22:16.953 に答える