1

S3アカウントに保存されているファイルへの有効期限が切れるURLを生成する小さなPHPコードを作成しました。私が今コードを持っている方法は、それがページロードの有効期限(PHPが処理されるとき)を設定すると信じています。

フォームの送信を開始するには、有効期限が必要です(フォームボタンをダウンロードボタンとして使用し、アクションをダウンロードURLとして設定しています)。

したがって、誰かがダウンロードをクリックすると、リンクが生成され、有効期限が設定されます。

action = ""の形式からリンク生成コードを呼び出す必要があると思いますが、これをどのように行うかわかりませんか?

私のコードは以下の通りです:

<?php
                // Grab the file url
                $file_url = get_post_meta($post->ID, 'file_url', true);
                // Grab just the filename with extension
                $file = basename($file_url); 

                // AWS details                  
                $accessKey = "<REMOVED>";
                $secretKey = "<REMOVED>";
                $bucket = "media.themixtapesite.com";

                // Set expiry time
                $timestamp = strtotime("+30 seconds");
                $strtosign = "GET\n\n\n$timestamp\n/$bucket/$item";

                // Generate Signature
                $signature = urlencode(base64_encode(hash_hmac("sha1", utf8_encode($strtosign), $secretKey, true)));

                // Create new S3 Expiry URL
                $download_url = "http://$bucket/$file?AWSAccessKeyId=$accessKey&Expires=$timestamp&Signature=$signature";
                ?>

                <?php if (is_user_logged_in()) { ?>
                <div class="download_button_div">


<?php echo '<form method="post" action="'.$download_url.'" class="download_button_div">'; ?>

<!--Download counter-->
                    <input type="hidden" name="download_counter" value="<?php (int)$download_count = get_post_meta($post->ID, 'download_counter', true);
    $download_count++;
    update_post_meta($post->ID, 'download_counter', $download_count); ?>">
                    <button type='submit' class='download_button'>Download</button>
                    </form>
                    </div>
                    <?php } else { ?>

いつものように、どんな助けもありがたいです。

4

2 に答える 2

1

同期ajaxリクエストを実行して、リンクをクリックしたときに新しい署名を取得できます(フォームを送信します)。

このJavaScriptをフォームページに配置する必要があります。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script type="text/javascript">
var form = null;
$(document).ready(function(){
    $('form.download_button_div').submit(function(){
        form = $(this);
        var ival = form.children('[name=item]').val();
        $.ajax('ajax_sig.php', { type:'POST', async:false, dataType:'json', data:{'itm':ival}, success:function(data){
            form.prop('action', form.prop('action').replace(/Signature=.+$/, 'Signature='+data.sig));
        } });
        return true;
    });
});
</script>

フォームの$itemを使用して、この非表示の入力を追加する必要があります。

<input type="hidden" name="item" value="<?php echo $item; ?>" />

ajax_sig.phpページを作成する必要があります。

<?php
// Item from ajax request
$item = $_POST['itm'];

// AWS details                  
$secretKey = "<REMOVED>";
$bucket = "media.themixtapesite.com";

// Set expiry time
$timestamp = strtotime("+30 seconds");
$strtosign = "GET\n\n\n$timestamp\n/$bucket/$item";

// Generate Signature
$signature = urlencode(base64_encode(hash_hmac("sha1", utf8_encode($strtosign), $secretKey, true)));

// Ajax result
$result = array('itm'=>$item, 'sig'=>$signature);
echo json_encode($result);
?>
于 2013-02-04T21:42:31.233 に答える
0

もっと複雑な解決策を与えるつもりでしたが、もっと簡単な方法を考えました。有効期限を+300に設定します(フォームに記入するには5分ほどかかります)。ターゲットページで署名を確認します。sigが悪い場合は、ファイルを提供しません。sigが良好な場合は、現在の時刻が有効期限を過ぎているかどうかを確認します。もしそうなら、ファイルを与えないでください。

于 2013-02-04T11:10:28.640 に答える