This is a 3 year old question with four different answers basically stating the same thing: Follow the norm, use tokens, don't try to use referer.
While tokens still is considered the most secure option, using the referer is often a lot easier, and is also pretty secure. Just be sure to look at all PUT/POST/PATCH/DELETE-requests and consider it an attack if a referer is missing or from the wrong domain. Really few (if any) proxies remove the referer for these kinds of requests.
See also the OWASP recommendation about checking the referer header as a CSRF protection:
Checking The Referer Header
Although it is trivial to spoof the referer header on your own
browser, it is impossible to do so in a CSRF attack. Checking the
referer is a commonly used method of preventing CSRF on embedded
network devices because it does not require a per-user state. This
makes a referer a useful method of CSRF prevention when memory is
scarce.
However, checking the referer is considered to be a weaker from of
CSRF protection. For example, open redirect vulnerabilities can be
used to exploit GET-based requests that are protected with a referer
check. It should be noted that GET requests should never incur a state
change as this is a violation of the HTTP specification.
There are also common implementation mistakes with referer checks. For
example if the CSRF attack originates from an HTTPS domain then the
referer will be omitted. In this case the lack of a referer should be
considered to be an attack when the request is performing a state
change. Also note that the attacker has limited influence over the
referer. For example, if the victim's domain is "site.com" then an
attacker have the CSRF exploit originate from "site.com.attacker.com"
which may fool a broken referer check implementation. XSS can be used
to bypass a referer check.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…