2011-01-12 13 views
15

Mam stronę uruchomioną na pixie.strd6.com i obrazy hostowane przez Amazon S3 z CNAME dla images.pixie.strd6.com.HTML5 Canvas getImageData i ta sama polityka Origin

Chciałabym móc wyciągnąć te obrazy na płótnie HTML5 i wywołać metodę getImageData ale rzuca Error: SECURITY_ERR: DOM Exception 18

Próbowałem ustawienie window.domain = "pixie.strd6.com", ale to nie ma znaczenia.

Dodatkowo $.get("http://dev.pixie.strd6.com/sprites/8516/thumb.png?1293830982", function(data) {console.log(data)}) rzuca również błąd: XMLHttpRequest cannot load http://dev.pixie.strd6.com/sprites/8516/thumb.png?1293830982 . Origin http://pixie.strd6.com is not allowed by Access-Control-Allow-Origin.

Idealnie HTML5 canvas nie będzie blokować powołanie getImageData z subdomen. Przyjrzałem się ustawianiu nagłówka Access-Control-Allow-Origin w S3, ale nie udało się.

Każda pomoc lub obejście są mile widziane.

+34

Ta sama polityka pochodzenie jest najgłupszą rzeczą kiedykolwiek . Jeśli jestem złośliwym kodem JavaScript i chcę załadować szkodliwe dane, po prostu umieściłem na stronie dowolny tag skryptu, a nie dane "s3kri7 c0mm4nd5" z danych obrazu. Jedynymi osobami, które chcą odczytać dane obrazu, są deweloperzy po stronie klienta. Jeśli chodzi o kradzież "ściśle tajnych danych obrazu" z VPN, jeśli twoja strona jest już xss'd, to keylogowanie będzie znacznie bardziej niszczycielskie. Cała ta "ochrona" służy jedynie zaostrzeniu prawowitych programistów próbujących uzyskać JavaScript do wykonywania najprostszych zadań. –

+7

SPO chroni przed legalnym wektorem ataku tutaj.Załóżmy, że masz prywatny album ze zdjęciami w witrynie do udostępniania zdjęć (lub sprawdź obrazy zapisane w bankowości internetowej): bez brudnej ochrony na płótnie, * każda strona w sieci *, którą odwiedzasz, będzie mogła pobrać te obrazy, jeśli znają Adres URL i użytkownik był zalogowany, ponieważ żądania wysłane z '' tagów ** używają plików cookie **. Problemem tutaj nie są zagrożone witryny XSS; Problem polega na tym, że * każda strona w sieci * może pobierać i czytać obrazy na płótnie, korzystając z plików cookie uwierzytelniających. – apsillers

+2

** tl; dr: ** W tej chwili każda witryna w wielu domenach * może wyświetlać * twoje obrazy wymagane przez auth (zdjęcia prywatne, obrazy kontrolne itp.) W tagu '', ale dzięki SOP, nie mogą * odczytać * zawartości tych obrazów w obszarze roboczym, aby np. Zapisać je na serwerze. – apsillers

Odpowiedz

6

Amazon recently announced CORS support

We're delighted to announce support for Cross-Origin Resource Sharing (CORS) in Amazon S3. You can now easily build web applications that use JavaScript and HTML5 to interact with resources in Amazon S3, enabling you to implement HTML5 drag and drop uploads to Amazon S3, show upload progress, or update content. Until now, you needed to run a custom proxy server between your web application and Amazon S3 to support these capabilities.

How to enable CORS

To configure your bucket to allow cross-origin requests, you create a CORS configuration, an XML document with rules that identify the origins that you will allow to access your bucket, the operations (HTTP methods) will support for each origin, and other operation-specific information. You can add up to 100 rules to the configuration. You add the XML document as the cors subresource to the bucket.

1

To zachowanie jest w toku. Zgodnie ze specyfikacją HTML5, po narysowaniu obrazu krzyżowego na kanwie, jest on brudny i nie można już odczytać pikseli. Dopasowanie do początku porównuje schemat, w pełni kwalifikowany host, a także w przeglądarkach innych niż IE - port.

+0

Tak więc obejście polega na włączeniu proxy za pośrednictwem mojego serwera WWW? –

+4

Tak, kod serwera do proxy obrazy będą działać, ale to smutne, że musimy polegać na czymś, co nie byłoby potrzebne. Powinni przynajmniej implementować zasady międzydomenowe za pośrednictwem pliku xml na serwerze docelowym, tak jak zrobiono to przy użyciu lampy błyskowej. – Omiod

3

Jednym z możliwych rozwiązań jest użycie nginx do działania jako proxy. Oto, jak skonfigurować adresy URL, aby przejść do wersji, aby przejść do wersji S3, ale przeglądarka nadal może uważać, że nie jest to domena krzyżowa.

location /s3/ { 
    proxy_pass http://images.pixie.strd6.com/; 
} 
2

Niedawno natrafiłem na $.getImageData, autorstwa Max Novakovic. Strona zawiera kilka zgrabnych prezentacji na temat pobierania i działania na zdjęciach Flickr wraz z przykładami kodu.

Umożliwia pobranie obrazu w formie kodu JavaScript z dowolnej strony. Działa poprzez dołączenie skryptu do strony. Następnie skrypt żąda obrazu z serwera Google App Engine. Serwer pobiera żądany obraz i przekazuje go konwertowany na base64 do skryptu. Kiedy skrypt otrzymuje bazę base64, przekazuje dane do wywołania zwrotnego, które następnie można narysować na płótnie i zacząć z nim mieszać.

2

W przeszłości usługa Amazon S3 nie zezwalała na modyfikowanie lub dodawanie nagłówków HTTP access-control-allow-origin-access-access-allow-credentials, więc lepiej było zmienić inną usługę, na przykład Rackspace Pliki chmury lub inne usługi, które to umożliwiają.

dodać lub zmodyfikować nagłówki HTTP tak:

access-control-allow-origin: [your site] 
access-control-allow-credentials: true 

Zobacz http://www.w3.org/TR/cors/#use-cases aby uzyskać więcej informacji.

Korzystanie z usługi, która pozwala modyfikować nagłówki HTTP, całkowicie rozwiązuje ten sam problem pochodzenia.

3

Jeśli używasz PHP, można zrobić coś takiego:

function fileExists($path){ 
     return (@fopen($path,"r")==true); 
    } 
    $ext = explode('.','https://cgdev-originals.s3.amazonaws.com/fp9emn.jpg'); 
    if(fileExists('https://cgdev-originals.s3.amazonaws.com/fp9emn.jpg')){ 
     $contents = file_get_contents('https://cgdev-originals.s3.amazonaws.com/fp9emn.jpg'); 
     header('Content-type: image/'.end($ext)); 
     echo $contents; 
    } 

i dostęp do obrazu za pomocą tego pliku php, podobnie jak wtedy, gdy plik jest nazywany generateImage.php można zrobić <img src="http://GENERATEPHPLOCATION/generateImage.php"/> i obraz zewnętrzny URL może być parametrem dostać za pliku

2

Dla osób, które nie używają S3, można spróbować zbudować proxy obrazu, które zakoduje plik obrazu i zawinie go w obiekt JSON.

Następnie można użyć JSONP, który obsługuje cross domain, aby pobrać obiekt JSON i przypisać dane obrazu do img.src.

Napisałem przykładowy kod serwera proxy obrazu za pomocą Google App Engine. https://github.com/flyakite/gae-image-proxy

JSON Object Zwraca w formacie podobnych

{ 
    'height': 50, 
    'width' : 50, 
    'data' : 'data:image/jpeg;base64,QWRarjgk4546asd...QWAsdf' 
} 

do 'danych' jest dane obrazu w formacie base64. Przypisz go do obrazu.

img.src = result.data; 

Obraz jest teraz "czysty" dla płótna.

2

Aby edytować uprawnienia kubełkowe S3:

1) Zaloguj się do konsoli AWS Zarządzania i otworzyć konsolę Amazon S3 na https://console.aws.amazon.com/s3/

2) w liście wiadra, otworzyć wiadro, którego właściwości chcesz przeglądanie i kliknij „dodaj konfigurację CORS”

amazon-screen-shot

3) Napisz zasady jesteś gotów włożyć między znacznikami <CORSConfiguration>

<CORSConfiguration> 
    <CORSRule> 
    <AllowedOrigin>*</AllowedOrigin> 
    <AllowedMethod>GET</AllowedMethod> 
    <MaxAgeSeconds>3000</MaxAgeSeconds> 
    <AllowedHeader>*</AllowedHeader> 
    </CORSRule> 
</CORSConfiguration> 

Możesz dowiedzieć się więcej na temat zasad: http://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html

4) Określ crossorigin = „anonymous” na obrazie będziesz używać w swoim płótnie

Powiązane problemy