web-dev-qa-db-ja.com

GET変数でパスワードで保護された投稿を回避する

次の要件を満たすGET変数を使用して、保護された投稿のパスワード形式を回避します。

  • コアに変更はありません
  • パスワードがはっきり見えない(ハッシュ)
  • セキュリティリークなし

コアに変更はありません

機能はプラグインに組み込まれており、そのまま使用できるので、これは簡単なことではありません。コアファイルを変更するI found some methods

パスワードがはっきり見えない

http://example.com/post?pwd=mypasswordの代わりに、URLはhttp://example.com/post?pwd=%25P%25BaxfPUloy8YdOFi2F9F2xAcCg8OLGPのようなものにしてください。

セキュリティ上の問題はありません

もちろん、これはどういうわけか「ハッキング」されるべきではありません。それらは保護された投稿にすぎませんが、それにもかかわらずこれは絶対にありません。

必要なもの:

URLに追加されたハッシュを取得する方法:

$url = add_query_arg(array(
    'pwd' => get_my_hash();
), get_permalink($post_id));

そして、ページテンプレート上でコード:

if(post_password_required()){
    if(isset($_GET['pwd'])){
        if(check_pwd_with_hash($_GET['pwd'])){
        //unlock content
        }
    }
}

the_content();

post_password_required() メソッドにフックする方法や、グローバル$post->post_passwordを空の文字列に設定する方法はありません。

5
Xaver

投稿パスワードのチェックは(何らかの理由で)get_the_content()内で行われます。これはseems合法ですが、実際には2つの別個の懸念事項が混在しています。パスワードフォームを表示するget_the_content()を回避する方法はないという声明は正しかった。パスワードのチェックがコアで詳細に行うことは次のとおりです。

if ( empty( $post->post_password ) )
     return false;

if ( ! isset( $_COOKIE['wp-postpass_' . COOKIEHASH] ) )
     return true;

require_once ABSPATH . WPINC . '/class-phpass.php';
$hasher = new PasswordHash( 8, true );
$hash = wp_unslash( $_COOKIE[ 'wp-postpass_' . COOKIEHASH ] );
if ( 0 !== strpos( $hash, '$P$B' ) )
     return true;
return ! $hasher->CheckPassword( $post->post_password, $hash );

ご覧のとおり、パスワードはユーザーのマシンに保存されているCookieに対してチェックされます。

投稿パスワードを回避するには、実際にこのCookieを設定してユーザーに明示的な許可を与える必要があります。コアは次の方法でそれを行います。

setcookie(
    'wp-postpass_' . COOKIEHASH,
    $hasher->HashPassword( wp_unslash( $_POST['post_password'] ) ),
    $expire,
    COOKIEPATH
);

(プレーンテキストパスワード)を取得するために使用される the_post_password() を見ると、ユーザーの安全のために引数をエスケープする以外に何も実行されていないことがわかります。

esc_attr( $post->post_password )

これで、これを組み合わせてCookieを設定できますbeforeテンプレートにコンテンツを表示します。

// Your custom check for the `$_GET` content
// …also check if there in fact is a password
// …and if the user is a repeated visitor, do not set the Cookie again
if (
        isset( $_GET['circumvent'] ) 
        and 'disable-pass' === $_GET['circumvent'] 
        and isset( $post->post_password )
        and ! isset( 'wp-postpass_'.COOKIEHASH )
    ) {
    // Finally we use the plain text password to set the Cookie
    // as if the user would have entered it into the password form
    setcookie(
        'wp-postpass_'.COOKIEHASH,
        $hasher->HashPassword( wp_unslash( esc_attr( $post->post_password ) ) ),
        $expire,
        COOKIEPATH
    );
}
// Now display the content:
the_content();

追加 information この記事の投稿パスワードについてこの概念の多くはほとんど知られていないので、これらの詳細の一部を説明することをお勧めします。

5
kaiser