簡體   English   中英

通過使用 AWS-SDK PHP 生成的預簽名帖子拒絕 AWS S3 上傳訪問

[英]AWS S3 Upload Access Denied through Presigned post generated with AWS-SDK PHP

我正在嘗試使用 AWS SDK PHP 生成的預簽名帖子將文件(用於我的測試的圖像)上傳到我的 s3 存儲桶。 首先,我生成預簽名的帖子,然后我使用 Postman 或通過簡單的 html 表單手動創建具有給定 PostObjectV4 數據的請求......填寫完所有內容后,請求結果拒絕訪問:-(。與客戶端關聯的用戶在相應的存儲桶上生成 PostObjectV4 已 Allowed s3:PutObject 策略。

我已經嘗試過:

  • 將我的存儲桶設置為公開寫入,它可以工作! 這表明我存在權限/政策問題......不幸的是,我的存儲桶不必是公開的......
  • 通過 aws 命令行上傳文件,它也可以工作

預簽名后生成的 PHP 代碼(數據在 $postObject 中):

$assetAwsS3Key = $this->getAssetAwsS3Key($asset);

$options = [
    ['starts-with', '$key', 'myDir/'],
];

// Optional: configure expiration time string
$expires = '+24 hours';

// Set some defaults for form input fields
$formInputs = ['acl' => 'private'];

$postObject = new PostObjectV4(
    $this->buildAwsS3UserClient(),
    $this->awsBucketName,
    $formInputs,
    $options,
    $expires
);

// Get attributes to set on an HTML form, e.g., action, method, enctype
$formAttributes = $postObject->getFormAttributes();

// Get form input fields. This will include anything set as a form input in
// the constructor, the provided JSON policy, your AWS access key ID, and an
// auth signature.
$formInputs = $postObject->getFormInputs();

return ['formAttributes' => $formAttributes, 'formInputs' => $formInputs];

我的用戶(用於客戶端生成)策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::awsBucketName/*"
            ]
        }
    ]
}

我用於測試上傳的簡單 html 表單:

<form method="post" action="https://my-bucket.s3.eu-west-3.amazonaws.com" enctype="multipart/form-data">
        <input type="hidden" name="key" value="myKey/sources/myImg.jpg" /><br />
        <input type="file"   name="file" /> <br />
        <input type="hidden" name="X-Amz-Credential" value="MYUSERACCESSKEY/20190510/eu-west-3/s3/aws4_request" />
        <input type="hidden" name="X-Amz-Algorithm" value="AWS4-HMAC-SHA256" /> 
        <input type="hidden" name="X-Amz-Date" value="20190510T132109Z" />
        <input type="hidden" name="Policy" value='MYBASE64ENCODEDPOLICY' />
        <input type="hidden" name="X-Amz-Signature" value="MYSIGNATURE" />
        <input type="submit" name="submit"/>
    </form>

您知道為什么此上傳失敗而存儲桶不允許公開寫訪問權限嗎?

提前謝謝了 !

我解決了這個問題,我將分享自我第一次發帖以來我在此處所做的更改,以使上傳工作正常進行。 如有必要,請根據您的需要進行調整。

該AWS配置中使用: -相同的線內政策附在我的用戶在第一篇文章(請確保您在資源鍵設置區名稱) - S3桶連接到它沒有政策- S3存儲在所有公共訪問已禁用

這是我用於創建 postObject 的最新 php 代碼:

    $objectKey = $this->objectKeyGenerator->getObjectKey($object);

    $options = [
        ['bucket' => $this->getBucketName()],
        ['eq', '$key', $objectKey],
        ['acl' => 'private']
    ];

    // Optional: configure expiration time string
    $expires = '+2 hours';

    // Set some defaults for form input fields
    $formInputs = [
        'acl' => $acl,
        'key' => $objectKey
    ];

    $postObject = new PostObjectV4(
        $this->getS3Client(),
        $this->getBucketName(),
        $formInputs,
        $options,
        $expires
    );

    // Get attributes to set on an HTML form, e.g., action, method, enctype
    $formAttributes = $postObject->getFormAttributes();

    // Get form input fields. This will include anything set as a form input in
    // the constructor, the provided JSON policy, your AWS access key ID, and an
    // auth signature.
    $formInputs = $postObject->getFormInputs();

    return ['formAttributes' => $formAttributes, 'formInputs' => $formInputs];

與我的第一篇文章相比,postObject 生成有哪些變化:

  • 我不再使用 'starts-with' 選項並手動生成對象密鑰,以便上傳的文件必須僅在生成的密鑰處上傳(如果給出另一個密鑰,它將因密鑰不相等而失敗),但我認為這不是導致錯誤的原因,我很確定它始終可以與“開始”選項一起使用。
  • 存儲桶acl屬性現在位於 $options 數組中,作為 AWS SDK for PHP Developer Guide 中給出的 Create PostObjectV4 示例代碼(請參閱 [ https://docs.aws.amazon.com/sdk-for-php/v3/developer -guide/s3-presigned-post.html] )。
  • 在 $formInputs 數組中, key存在,這樣我就可以在 postObject 中取回它(因為提交的 key 必須是計算出來的)。 我認為這不是強制性的。

我試圖通過從 $option 數組中刪除存儲桶acl來重現錯誤,這導致了“403 禁止錯誤”,但有一條消息指出“根據策略無效:額外輸入字段:存儲桶”,我覺得這不是很明顯...我沒有對這個錯誤進行更多調查。

我還分享了我的 html 表單,該表單自第一次發布以來發生了一些變化,輸入字段的順序發生了變化,並且添加了 acl 字段,因為政策要求。

    <form method="post" action="https://my-bucket.s3.eu-west-3.amazonaws.com/" enctype="multipart/form-data">
    <input type="hidden" name="key" value="object/key.txt" /><br />
    <input type="hidden" name="acl" value="private"/>
    <input type="hidden" name="X-Amz-Credential" value="MYUSERACCESSKEY/20190510/eu-west-3/s3/aws4_request" />      
    <input type="hidden" name="X-Amz-Algorithm" value="AWS4-HMAC-SHA256" /> 
    <input type="hidden" name="X-Amz-Date" value="20200108T093921Z" />
    <input type="hidden" name="Policy" value='MYBASE64ENCODEDPOLICY' />
    <input type="hidden" name="X-Amz-Signature" value="MYSIGNATURE" />
    File: 
    <input type="file"   name="file" /> <br />
    <!-- The elements after this will be ignored -->
    <input type="submit" name="submit"/>

總而言之,在我原來的帖子中,我沒有談論我的 s3 存儲桶公共訪問策略配置,我認為問題可能出在這里。

希望這會有所幫助,如有需要,請隨時詢問詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM