Take the 2-minute tour ×
Information Security Stack Exchange is a question and answer site for Information security professionals. It's 100% free, no registration required.

There are 2 sites:

http://www.site1.com
http://www.site2.com

http://www.site1.com contains link to http://www.site2.com as

<a href="http://www.site2.com/">link<a/>

When user clicks on link from http://www.site1.com browser sends Referrer header to http://www.site2.com. Based on Referrer header http://www.site2.com makes some processes.

I wonder if I can fake/change (maybe with javascript, PHP, ...) Referrer header or not send it at all?

share|improve this question
    
I think there might be a way to block the referrer in modern html/js. I remember it being mentioned somewhere. –  CodesInChaos Jan 12 '13 at 8:33
2  
The classical solution is to use a intermediate redirector that masks the original source. –  CodesInChaos Jan 12 '13 at 8:34
add comment

5 Answers

You can't modify the referer header unless you control the calling client, e.g. the browser.

Browsers block modifying the referer, and server-side code can't inject headers into a request as there is no way to get the header from the server to the client, and make the client inject it into the referer header of it's next request.

That's assuming the browser doesn't have a particular vulnerability around header injection from JavaScript though.

share|improve this answer
add comment

I would write a python script (see http://docs.python-requests.org/en/latest/ for a great library, if the standard urllib looks complicated) but I think you would be able to spoof the referer using Tamper data / live http header plugin for firefox. Not sure tho, but have a look. There is also other firefox addons the lets you manipulate the referer header. Just search for referer in the firefox addons.

share|improve this answer
add comment

There are two situations in which you would want to control the Referer header. By the way, Referer is a miss-spelling of the word "referrer".

If you want to control your personal browser not to pass the Referer to site2.com, you can do that with many browser extensions:

  • For Firefox there is RefControl (which I use and am happy with. I use the option "Forge- send the root of the site")
  • Chrome has Referer Control

The other situation is where you are a webmaster and you want the users of your site (site1.com) not to send the Referer to other sites linked on your site. You can do that in multiple ways:

  • Use SSL/TLS (https) on your site and a security feature of the browser is not to pass the Referer when it uses SSL/TLS.
  • Use the HTML5 rel="noreferrer" attribute. The downside to this is that it is not supported by many browsers, I know only Chrome supports it.
  • Use a Data URL ('data:') to hide the actual page the link is coming from: <a href='data:text/html;charset=utf-8, <html><meta http-equiv="refresh" content="0;URL=&#39;http://site2.com/&#39;"></html>'>Link text</a>.
  • Hide the Referer by redirecting through an intermediate page. This type of redirection is often used to prevent potentially-malicious links from gaining information using the Referer, for example a session ID in the query string. Many large community websites use link redirection on external links to lessen the chance of an exploit that could be used to steal account information, as well as make it clear when a user is leaving a service, to lessen the chance of effective phishing.

Here is a simplistic redirection example in PHP:

<?php
$url = htmlspecialchars($_GET['url']);
header( 'Refresh: 0; url=http://'.$url );
?>
<html>
 <head>
  <title>Redirecting...</title>
  <meta http-equiv="refresh" content="0;url=http://<?php echo $url; ?>">
 </head>
 <body>
 Attempting to redirect to <a href="http://<?php echo $url; ?>">http://<?php echo $url; ?></a>.
 </body>
</html>
share|improve this answer
add comment

It's not hard to build a HTTP Header.

You only need a terminal and some swiss knife like netcat (It's a tool that let you do very basics things, like cat on network).

Someting like:

nc << eof www.site2.com 80
GET /somepath/somedest HTTP/1.0
Host: wwww.site2.com
Referer: wwww.site1.com

.

Could be enough.

(Nota: the dot . at end is useless, but an empty line mark the end of header)

So the answer is yes it's possible to fake a HTTP Header.

This was done on firefox 19.0

For hidding referer field, I've used an option in squid proxy server from some years ago, but I'm sure that there must exist some modules or extensions for browser who would do the trick....

...A quick look in my firefox (v19.0) config let me see that there is an option: network.http.sendRefererHeader.

This option could be set to:

  • 0 Never send the Referer header or set document.referrer.
  • 1 Send the Referer header when clicking on a link, and set document.referrer for the following page.
  • 2 (Default) Send the Referer header when clicking on a link or loading an image, and set document.referrer for the following page.
share|improve this answer
add comment

An excellent overview of the referral problem and its history can be found in "Stripping referrer for fun and profit".

The same article also contains excellent links to:

  1. For the lazy among us, the referer.us URL redirection service and, still better,
  2. A browser-independent client-side script, using the awesome <iframe src=about:blank> trick.
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.