在表单提交上生成过期URL

时间:2013-02-03 21:02:39

标签: php amazon-s3 form-submit

我制作了一些PHP代码,可以生成存储在我的S3帐户中的文件的过期URL。 我现在拥有代码的方式我认为它设置了页面加载的到期时间(处理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 { ?>

一如既往,任何帮助表示赞赏。

2 个答案:

答案 0 :(得分: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);
?>

答案 1 :(得分:0)

我打算提出一个更复杂的解决方案,但我想到了一个更简单的方法。将到期时间设置为+300(给他们5分钟左右来完成表格)。您将检查目标页面上的签名。如果sig是坏的,那么你不给文件。如果签名是好的,那么你检查当前时间是否超过到期时间。如果是,那么不要给文件。