2014-03-18 4 views
6

Я успешно установил CsrfGuard на мой webapp, но при тестировании на preprod за обратным прокси-сервером все стало плохо. Javascript CsrfGuard в isValidDomain не считает мой домен как разовая: CsrfGuard JavaScriptServlet возвращает unproxied области ...Csrfguard за обратным прокси

Это Javascript код:

if(isValidDomain(document.domain, "myRealDomain")) { … } 

isValidDomain это просто метод сравнения строк, вещь is: CsrfGuard JavaScriptServlet возвращает «myRealDomain», а код javascript «document.domain» возвращает «myProxiedDomain»: сравнение строк не выполняется!

Я не знаю, что делать в этот момент, и я был бы признателен за указания! Я считаю, что некоторые из них столкнулись с проблемой раньше, обратные прокси-серверы кажутся довольно распространенными.

+0

Я не знаком с CsrfGuard, но можете ли вы расширять «JavaScriptServlet» и предоставлять настраиваемое значение для 'myRealDomain'? – Taylor

+0

Ну, это одно из решений, однако JavaScriptServlet является окончательным, мне нужно будет сделать свою собственную версию lib для этого ... – user3433684

+0

Может понадобиться переопределить метод isValidDomain, чтобы быть обратным прокси-сервером. Похоже на ограничение рамки, удачи. – Taylor

ответ

3

вы можете настроить свой прокси для добавления заголовков X-Forwarded-By, X-Forwarded-For и X-Forwarded-Proto.

Ваш сервер за прокси-сервером может использовать эти заголовки для восстановления исходного запроса (как это делается на прокси-сервере).

Таким образом, сервлет csrfguard будет использовать правильный домен для генерации сценария.

Конфигурация, конечно, различны для каждого сервера/прокси-сервера приложений, но здесь является примером для Nginx в сочетании с Tomcat:

пример прокси-конфигурации (Nginx):

### proxy headers ### 
proxy_set_header  X-Forwarded-By   $server_addr:$server_port; 
proxy_set_header  X-Forwarded-For   $remote_addr; 
proxy_set_header  X-Forwarded-Proto  $scheme; 

сервера Пример приложения (кот/RemoteIpValve):

<Valve 
    className="org.apache.catalina.valves.RemoteIpValve" 
    internalProxies="trusted-ip-here" 
    remoteIpHeader="x-forwarded-for" 
    proxiesHeader="x-forwarded-by" 
    protocolHeader="x-forwarded-proto" 
    /> 
+0

В моем случае мне нужны дополнительные 'httpServerPort' и' trustedProxies' [params] (https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/valves/RemoteIpValve.html), чтобы получить мой прокси-сервер Tomcat. – Yuri

0

у меня была проблема, где работает csrfguard-3,1 за обратным прокси и балансировки нагрузки с SSL O ffloading вызвал JavaScriptServlet, чтобы возвращать 404. Журнал CSRF заявил

"домен HTTPS Referer: // ***** не соответствует запросу HTTP домена: // ******"

я должен был установить

org.owasp.csrfguard.JavascriptServlet.refererMatchDomain=false 

, чтобы заставить его работать.

1

У нас были похожие проблемы с csrfguard и нашлось, что наш прокси-сервер неверно возвращает URL-адрес Referer. В дополнение к этому мы использовали SSL, которые добавили дополнительные проблемы. Мы обнаружили, что как только соединение было сделано - это было сделано с помощью «domain.tld» вместо «domain.tld: 443», который ожидал csrfguard.

Referer domain https://localhost/shop/pages/main.jsf 
does not match request domain: https://localhost:443/shop/JS/csrfguard.js 

Мы исправили это, добавив в апача HTTPd конфигурации:

Header edit Referer "(^http(s?)://([\w]+\.){1}([\w]+\.?)+)(.*)$" "$1:443$5" 
RequestHeader edit Referer "(^http(s?)://([\w]+\.){1}([\w]+\.?)+)(.*)$" "$1:443$5" 

Поскольку все запросы приходили из протокола HTTPS, мы исправили порта присутствия в URI этим. Я считаю, что ваш случай может быть исправлен таким же образом или путем установки заголовка «Referer» на некоторое предопределенное имя.(Но это может быть проблема безопасности здесь, потому что все запросы будут поступать из «правильного» домена)

Смежные вопросы