web-dev-qa-db-ja.com

URLパラメータとして変数を渡す---セキュリティ上の問題?

自分のサイトにセキュリティホールが開いていないことを確認する必要があります。 "コミュニティ"というカスタム投稿タイプと "間取り図"というカスタム投稿タイプがあり、Single Floorplan投稿のURLにパラメータを追加する必要があります。

私の目標は、フロアプランの投稿オブジェクトがコミュニティの単一の投稿から選択されると、次のページで使用するためにコミュニティの名前(つまり、単一のコミュニティの投稿のタイトル)をURLに追加することです。そのため、クエリ変数を有効にします。

    <?php

    //* Enable queryvars (functions.php)

    add_filter('query_vars', 'parameter_queryvars' );
    function parameter_queryvars( $qvars )
    {
    $qvars[] = "community";
    return $qvars;
    }

私は、シングルコミュニティーの投稿の一番下にループで配置されている「動的フロアプラン」と呼ばれるテンプレート部分を持っています。現在のコミュニティページのsingle_post_titleをつかみ、それをURLに渡して$ _GETを使って利用できるようにしています。

この方法を選択したのは、「間取り図」の投稿タイプには、コミュニティ固有のものと同じプロパティを持つ正規/デフォルトのバージョンがあるためです。事後関係の状況(場合によっては誤ったデータをユーザに提示させる可能性がある)を回避するために、コミュニティバージョンは非常に特定のインスタンスでこれらのクエリ文字列を使用できなければなりません。

  <?php

  //* dynamic-floor-plans template part (placed in loop on communities page)

  global $post;
  $string = strtolower(single_post_title( null, false ));
  $slug = str_replace(' ','-',$string);
  ?>

     <div class="card-button">
      <a class="small expanded secondary button" 
        href="<?php echo get_the_permalink() . '?community=' . $slug ?>">View Floorplan</a>
   </div>

今、これは完全に機能しています。 $ _GETを使用して、後で選択されたフロアプランの単一ページでそのコミュニティ変数を取得できます。フロントエンドではうまく機能しているようです。

    <?php
    //*  Single Floorplans Template

    $community = $_GET["community"];

    ?>
      <h1 class="entry-title"><?php echo $title ?></h1>
      <h4>
        <?php if ($community) { ?> 
          At <?php echo $community; }  ?>
     </h4>
     ...

私は仕方がないが、これはユダヤ人ではない、またはこれを行うためのより安全な方法があると感じます。

私は搾取を受け入れますか?ループ自体の関数も含めることができますが、このコードは評価を始めるには十分です。

3
Jon

URLを介して非プライベート/非保護/非機密の値を渡すことは非常に広く使用されており、あるページから別のページに値を渡すより信頼性の高い方法です。その理由は、$_SERVER['HTTP_REFERER']は完全に信頼性が低く、決して信頼できないからです。また、多くの場合、空の値にすることもできます。詳細については、次の2つの投稿を確認してください

Cookieも使用できますが、現在の法律では、ユーザー側で制御されているものもあるため、$_SERVER['HTTP_REFERER']よりも優れているわけではありません。

注:WordPressは、どのページにどのデータを表示するかを知るために、URLを介して多くのクエリ変数を渡します。ただし、URLに値を渡すことは非常に信頼性が高いのですが、危険にさらされる可能性があり、NEVER EVERを安全に扱う必要があることに注意してください。ハッカーがURLを介して悪意のあるコードを渡すことを好みます。ハッカーが悪意のあるコードをカスタムクエリ変数と一緒に渡し、それをそのまま使用すると、サイトやデータベースが非常に悪い方法で侵害される可能性があります。

ここで誤解しないでください。$_GETグローバル変数を使用してデータを渡すことは、2つのページ間でデータを渡すのに本当に良い方法であり、それで何も問題はありません。ただし、これを覚えておく必要があります。すべてのユーザーがANYタイプのフォーム、テキスト領域、URL、Cookie、基本的にあらゆるタイプを必要とするものを介してデータを送信しますクライアント側のアプリからの入力やデータが破損している可能性があります。自分自身でさえ、誰も決して信用してはいけません。 すべての着信データ常に消毒、検証、および/または予期されるデータ型に従ってエスケープされました。これはあなたの最優先事項であり、あなたのリストの一番上の一番上の黄金のルールでなければなりません。

その1つの黄金律を守っている限り、あなたは比較的安全であり、コードの一部は決して安全ではないので、比較的安全だと言います。データを実際に操作する前に、データをサニタイズし、静的なもの(可能であれば)に対して検証すると、多くの「ソフト」攻撃から保護されます。

WordPressには、あなたのニーズと期待されるデータの種類に応じて、衛生、エスケープ、データの検証を行う多くの組み込み関数があります。このトピックの コーデックスのこの記事 を必ず確認してください。または、PHPで使用可能なフィルターもあります。スーパーグローバルの場合、varが設定されているかどうかをチェックし、設定されている場合は値を返すため、 filter_input() を使用する傾向があります。 値をフィルター処理/サニタイズ する機能もあります

$community = filter_input( 
    INPUT_GET,             // Super global to use, in this case $_GET
    'community',           // The var to get a value from
    FILTER_SANITIZE_STRING // Type of filter to apply, here sanitize the value as a string
);

if ( $community ) {
    /**
     * $community have a value, so $_GET["community"] is set. 
     * It is also safe to use now as the value was sanitized when we
     * queried the value with filter_input
}
3
Pieter Goosen