web-dev-qa-db-ja.com

アクション名がわかっている場合、wp_nonce_fieldは脆弱ですか?

アクション名がわかっている場合、wp_nonce_fieldは脆弱ですか?私のプラグインが識別できるように、実際にはname = action名の名前で隠しフィールドを追加しています。アクション名を「表示」にするとセキュリティ上の問題があるかどうかを知りたいですか。

編集:私は実際に私のフォーム送信ワークフローを自動化しています。そのため、アクション名の表示が問題になる場合は、暗号化できます。例私は自分のフォームでMyFormPlugin::generateAction( 'submitQuestion' );を呼び出してナンスと私の隠れた "form_action"アクションフィールドを生成します。

class MyFormPlugin{

    public static function generateAction( $action, $referer = true ){
        $nonce_field = wp_nonce_field( self::secured_action( $action ), "mfp_nonce" , $referer , FALSE );
        return $nonce_field.'<input type="hidden" name="form_action" value="'.$action.'"/>';
    }

    public static function secured_action( $action ){
        return md5( $action.'randomsalt');
    }

    public function verify_nonce( $action ){
        $nonce = $_POST[ 'mfp_nonce' ];
        return wp_verify_nonce( $nonce, self::secured_action( $action ) );
    }
}

これは安全に見えますか?

4
yeahman

簡単な答え:いいえ。アクションには通常の文字列を使用できますが、md5を実行しても何も変わりません。

ノンスは、3つの主要な情報から構成されています。

  • 時間:現在のtime()を43200で割ったものがナンスに変換されます。これはnonceが12時間毎に変わることを可能にするものです(12時間で43200秒)。

  • 指定したアクション文字列これについての詳細は下記をご覧ください。

  • ユーザーIDすべてのユーザーは異なるナンスを取得します。

現在、これらの要素は連結されており、ナンス自体はこの結合された文字列のwp_hash()です。 wp_hash()関数は自動的にハッシュをソルトします。この場合、NONCE_KEYとNONCE_SALT定数を使います。これはあなたのwp-config.phpファイルで定義され、あなたの特定のサイトに固有のものであるべきです。

(なんらかの理由でデフォルトの "この場所にあなたのユニークなフレーズをここに置く"がある場合、WordPressはキー/ソルトのためにランダムな64文字の値を内部で生成し、データベースに保存します。実際のソルトとしてのデフォルト値また、どの値にも重複したキーやソルトを使うことはできませんそれでも、あなたはwp-config.phpファイルで定義されたキーとソルトを持つべきであり、これに頼らないでください。ここからそのファイルのランダムな行を取得することができます: https://api.wordpress.org/secret-key/1.1/salt/

したがって、一回だけ複製するためには、これらすべての情報が必要です。時間とユーザーIDが推測される可能性があります。アクション文字列は既知の場合があります。しかし、塩は攻撃者に知られるべきではない秘密の価値であり、これは一回だけを複製することを不可能にします。

そうは言っても、「アクション」文字列は特定のケースに対してできるだけ一意であるべきです。 delete_thingとupdate_thingとcreate_thingのように、アクションごとに異なるはずです。そして、それが特定のものに作用しているのであれば、それはいくらかの "ID"を含むべきです、その特定のもののための "delete_thing_123"のように。

何かのMD5ハッシュのように、アクション文字列に複雑なデータを含めることは必ずしも本当のセキュリティを追加するわけではありません。一回だけは塩味の秘密の値でHMACメッセージダイジェスト方法を使用することで既に造られます。ただし、ナンスは同じアクションに対して同じになるため、ナンスを複数のケースにわたって予測不能にするには、そのアクションはそのケースに固有のものにする必要があります。 1つのアイテムを削除するのに使用された一回だけでは、どのアイテムも削除されません。

また、nonceを生成するためのaction値は、完全に内部的に生成されるべきであることにも注意してください。ナンスを生成するアクションを決定するためにユーザー入力を使用するべきではありません。ユーザーがアクション文字列を決定するためにデータを注入できる場合は、事前にナンスを取得できます。ナンスは、おそらくIDが連結された一意の静的文字列である必要があります。

TL; DR:ID付きのプレーンな文字列を使用します(IDがあると意味がある場合)。それは結構です。

10
Otto