Easy Digital Downloadsには、ファイルダウンロードリンクを安全に保ち、悪用を防ぐための堅牢なシステムが用意されています。ファイルダウンロードリンクがクリックされると、提供されるパラメータの順序が重要になります。時折、特定のホスティング構成、キャッシュレイヤー、またはCDNプロバイダーが、ある程度の基本的なキャッシュを可能にするためにクエリ文字列パラメータの順序を変更することがあります。これらのアイテムの順序を変更すると、Easy Digital Downloadsは顧客のダウンロードリンクのトークン検証に失敗します。
これが私の問題であるかどうかはどうすればわかりますか?
ユーザーがファイルをダウンロードするためにクリックしたときに、「このファイルをダウンロードする権限がありません」というエラーが表示される場合は、パラメータの順序に細心の注意を払って、URLが次の形式になっていることを確認してください。
https://example.org/index.php?eddfile=...&ttl=...&file=...&token=...
クエリ文字列パラメータが上記の順序でない場合、上記の問題が発生しています。この問題を防ぐためのいくつかの解決策があります。
CloudflareやVarnishのようなページキャッシュシステムを設定している場合でも、パラメータが正しい順序になっているように見えても、このエラーが表示されることがあります。これは、ページキャッシュシステムがPHPによって処理されるためにWebサーバーにリクエストを送信する前に、それらのパラメータをソートするためです。
この問題をどのように防ぐことができますか?
ホスティング構成の変更
理想的な状況は、eddfileクエリ文字列パラメータを含むリクエストが並べ替えルールを通過しないようにすることで、プロバイダーがファイルダウンロードのリクエスト時にクエリ文字列パラメータの順序を変更しないようにすることです。
Cloudflareを使用しており、そのクエリ文字列ソート機能を有効にしている場合は、この機能を無効にすることで、ユーザーがエラーなしでファイルをダウンロードできるようになります。
カスタムコードスニペット
一部のプロバイダーでは常に可能とは限らないことを認識しているため、失敗した検証を2回実行して、アイテムが正しい順序で受信されたことを確認する小さな関数を作成しました。
function ck_custom_validate_url_token( $ret, $url, $query_args ) {
// If basic validation failed, let's make sure the URL prarms were in the right order and try again
if ( false === $ret ) {
$parts = parse_url( $url );
wp_parse_str( $parts['query'], $query_args );
$fix_arg_order = array(
'eddfile' => $query_args['eddfile'],
'ttl' => $query_args['ttl'],
'file' => $query_args['file'],
'token' => $query_args['token'],
);
$fixed_url = add_query_arg( $fix_arg_order, site_url() );
$fixed_token = edd_get_download_token( $fixed_url );
$ret = $query_args['token'] === $fixed_token;
}
return $ret;
}
add_filter( 'edd_validate_url_token', 'ck_custom_validate_url_token', 10, 3 );
上記の関数は、特定の構成で正しく機能することを確認するために、本番環境で使用する前にステージング環境でテストする必要があります。
