Is there any way I can prevent hotlinking on Amazon S3 without using signed URLs?
7 Answers
You need a bucket policy that both allows referrers from your domain(s) and denies referrers who are not from your domains. I've found that images can be hotlinked if you don't include the explicit denial - many guides and examples just give the allow policy and don't mention the deny part.
Here's my policy, just change BUCKET-NAME and YOUR-WEBSITE to your own details:
{
"Version": "2008-10-17",
"Id": "",
"Statement": [
{
"Sid": "Allow in my domains",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::BUCKET-NAME/*",
"Condition": {
"StringLike": {
"aws:Referer": [
"http://www.YOUR-WEBSITE.com/*"
]
}
}
},
{
"Sid": "Deny access if referer is not my sites",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::BUCKET-NAME/*",
"Condition": {
"StringNotLike": {
"aws:Referer": [
"http://www.YOUR-WEBSITE.com/*"
]
}
}
}
]
}

- 19,455
- 21
- 76
- 107
-
Thanks for this. This really helped me and worked well. My only suggestion is that perhaps you also just add an entry for "http://YOUR-WEBSITE.com/*" to the answer just to cover all bases as that's where my hiccups were. Cheers for the perfect script though. – Paolo Broccardo Sep 17 '13 at 17:20
-
This works great but how do I allow empty referrers? When linking to images via CSS the referrer is empty and images are not displaying. – prophoto Nov 03 '16 at 20:17
-
Perfect! You saved me – Ricardo Jan 18 '17 at 18:33
By setting up the right S3 bucket policy, you can add referral policy to prevent the hotlink.
http://s3browser.com/working-with-amazon-s3-bucket-policies.php

- 1,911
- 22
- 24
I use Apache RewriteMap to remap relative links to select file extensions -- *.jpg, *.gif, *swf, *.fla to Cloudfront. Basically makes the url of your images present as relative links to your site. It doesn't prevent discovery of the S3/cloudfront url totally, just adds a layer of difficulty for the would be thief.
Might be worth a try, apply the hotlink restrictions via htaccess with the above method in place. I haven't tried it myself.
-
Huh? Doesn't that mean that every image request has to go to your server before it can go to the CloudFront server? If so, doesn't that defeat the point of using a CDN? (It wouldn't for really big files like video, but for images?) – Doug McClean Sep 12 '09 at 05:20
-
The request will hit your web server and the browser is told where it should go to fetch the file, but the browser's history is never updated with the actual URL to the CDN. This is essentially the same trick behind "routes" in most front end controller frameworks, but in this case the request is never forwarded to the application server, only Apache. – Butifarra Nov 07 '09 at 22:17
-
@Claude, if instead of browser, download-managers are used, or something like curl / wget is used, won't the redirect be transparent, and thus be a way to enable hotlinking ? – bdutta74 Nov 04 '11 at 13:57
-
1@icarus74 Sorry for the late reply. Sure, any tool capable of browsing and understanding HTTP codes should be able to follow the redirect to the CDN in effect negating the effect of the rule suggested by maddie. The best course of action is to protect your CDN from unwanted requests by setting bucket policies as suggested by Robert Mao's link above. – Butifarra Dec 27 '11 at 22:22
It's in their official docs
Change examplebucket
to your bucket name, and example.com
to your domain.
"Version":"2012-10-17",
"Id":"http referer policy example",
"Statement":[
{
"Sid":"Allow get requests originating from www.example.com and example.com.",
"Effect":"Allow",
"Principal":"*",
"Action":"s3:GetObject",
"Resource":"arn:aws:s3:::examplebucket/*",
"Condition":{
"StringLike":{"aws:Referer":["http://www.example.com/*","http://example.com/*"]}
}
}
]
}

- 2,607
- 1
- 20
- 15
Hotlinking is one of the reasons Amazon created Cloudfront. Cloudfront is much much faster to. I did a writeup on it you can look at here.
http://blog.sat.iit.edu/2011/12/amazon-aws-s3-vs-cloudwatch-performance-grudgematch/
edit: S3 and Cloudfront both use the same type of bucket policy to make sure the request comes from the correct url. Cloudfront is still faster though.

- 7,772
- 5
- 43
- 55