使用.htaccess基于引用标头阻止POST请求

时间:2016-01-17 15:32:46

标签: php apache .htaccess

我的网站存在很多CSRF问题,使用CSRF令牌修复它们需要花费大量的精力。 所以,我的问题是:我可以使用.htaccess基于referer头阻止POST请求吗? 例如,应允许此请求:

POST http://mywebsite.com/password
REFERER: http://mywebsite.com/

pass=xxxx

但是应该阻止这个。

POST http://mywebsite.com/password
REFERER: http://evil.com/

pass=xxxx

还有,如何阻止没有REFERER标头的POST请求?

提前致谢。

2 个答案:

答案 0 :(得分:1)

RewriteCondREQUEST_METHOD

的条件使用HTTP_REFERER指令
RewriteEngine on

RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{HTTP_REFERER} !^http://(www\.)?yourdomain.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} ^$ # <- remove this line
RewriteRule .* - [F]

这会向所有403 Forbidden个请求发送POST个空引用或不等于http://www.yourdomain.com/anything

实施例

$ curl -vvv --data something --referer http://www.yourdomain.com/something http://yourdomain.com/
200 OK

$ curl -vvv --data something --referer http://evildomain.com http://yourdomain.com/something-else
403 Forbidden

$ curl -vvv --data something --referer http://yourdomain.com http://yourdomain.com/something-else
403 Forbidden

$ curl -vvv --data something http://yourdomain.com/something-else
403 Forbidden

答案 1 :(得分:0)

这是您正在寻找的一般食谱:

RewriteEngine ON
RewriteCond %{REQUEST_METHOD} =POST
RewriteCond %{HTTP_REFERER} !=http://mywebsite.com/
# XXX: /? for htaccess-vs-vhost portability
RewriteRule ^/?password - [F]