PHP / Amazon S3: проверка подлинности строки запроса иногда дает сбой - PullRequest
6 голосов
/ 20 сентября 2010

Я создал простой файловый браузер в PHP, который связывает файлы с URL-адресами с истекающим сроком действия. Таким образом, для каждого доступа к каталогу создается ссылка на каждый файл, который действителен, скажем, 900 секунд.

У меня сейчас проблема в том, что сгенерированные подписи иногда кажутся ошибочными. Что странно, поскольку я специально использовал внешние библиотеки S3 для генерации URL-адресов и подписей.

На самом деле, я попробовал следующие библиотеки для генерации подписей:

Библиотеки внутренне используют hash_hmac ('sha256', ... или hash_hmac ('sha1', ... - я также не понимаю, почему используются алгоритмы хеширования по-разному.

Так как проблема одинакова для всех библиотек, она также может быть в моем коде генерации URL, что довольно просто:

$bucket = "myBucket";
$filename = $object->Key;
$linksValidForSeconds = 900;
$url = $s3->get_object_url($bucket, $filename, $linksValidForSeconds);

Sp $ bucket и $ linksValidForSeconds являются постоянными, $ filename - например, "Media / Pictures / My Picture.png". Но событие для тех же переменных иногда срабатывает, иногда - нет.

Есть идеи?

Редактировать: Исправлено опечатка / неверное имя константы (спасибо)

Ответы [ 3 ]

3 голосов
/ 30 сентября 2010

Я обнаружил проблему, и она не имела ничего общего с кодом, который я упомянул. Сгенерированный URL-адрес urlencode () 'd и отправлен в другой скрипт PHP. Там я использую URL для отображения изображения с S3. Я использовал там urldecode (), чтобы отменить изменения, но, видимо, это не обязательно.

Таким образом, каждый раз, когда подпись содержит определенные символы, urldecode () изменяет их и портит.

Извините, что пропустил актуальный код проблемы.

1 голос
/ 30 сентября 2010

Код, который использует автор вопроса, взят из CloudFusion AWS PHP SDK. Вот документация для get_object_url () : get_object_url ( $bucket, $filename, [ $preauth = 0 ], [ $opt = null ] )

Проблема в вашем коде выше - ваша $linksValidForSeconds переменная.

Где: $preauth - целое число | строка (необязательно) Указывает, что должен быть возвращен предварительно назначенный URL-адрес для этого запроса. Может быть передано в виде количества секунд с начала эпохи UNIX или любой строки, совместимой с strtotime().

Другими словами, вы устанавливаете время истечения 900 секунд после эпохи UNIX. Я, честно говоря, не уверен, как любые ссылки работали с использованием этой библиотеки с вашим клиентским кодом. Если вы используете CloudFusion SDK , вам нужно взять текущее время UNIX и добавить 900 секунд к нему при передаче параметра.

Вы, кажется, путаете это с классом Amazon S3 , метод getAuthenticatedURL , который принимает параметр integer $lifetime в секундах, как вы использовали в своем клиентском коде. * Будьте осторожны при использовании нескольких библиотек и свободном переключении между ними. Вещи имеют тенденцию ломаться таким образом.

0 голосов
/ 11 октября 2010

Текущая версия CloudFusion - это AWS SDK для PHP, а также некоторые другие вещи.Amazon разработала CloudFusion в качестве основы для своего PHP SDK, а затем, когда официальный SDK начал работу, CloudFusion опубликовал изменения.

Это что-то вроде KHTML / WebKit.http://en.wikipedia.org/wiki/WebKit#History

...