Как предотвратить XSS для URL-адреса действия формы?

Мы используем SingleSingOut (SSO) Shibboleth для аутентификации. Shibboleth — это проект с открытым исходным кодом, который был интегрирован в наш проект. Shibboleth выполнит перенаправление на страницу login.jsp, если пользователь не прошел аутентификацию. Теперь мы настроили страницу login.jsp для поддержки локализации. Таким образом, форма actionUrl должна быть отправлена ​​Shibboleth IDP (поставщиком удостоверений) для выполнения аутентификации. Вот приведенный ниже пример кода, предоставленный Shibboleth:

    <% if(request.getAttribute("actionUrl") != null){ %>
      <form id="login" action="<%=request.getAttribute("actionUrl")%>" method="post">
    <% }else{ %>
      <form id="login" action="j_security_check" method="post">
    <% } %>

      <% if ("true".equals(request.getAttribute("loginFailed"))) { %>
        <section>
          <p class="form-element form-error">Login has failed. Double-check your username and password.</p>
        </section>
      <% } %>

      <legend>
        Log in to <idpui:serviceName/>
      </legend>

      <section>
        <label for="username">Username</label>
        <input class="form-element form-field" name="j_username" type="text" value="">
      </section>

      <section>
        <label for="password">Password</label>
        <input class="form-element form-field" name="j_password" type="password" value="">
      </section>

      <section>
        <button class="form-element form-button" type="submit">Login</button>
      </section>
    </form>

Теперь я использовал инструмент OWASP ZAP для проверки атаки безопасности. Это подняло высокий риск в приведенном ниже коде

  <form id="login" action="<%=request.getAttribute("actionUrl")%>" method="post">

Он сказал, что может быть атака XSS (Cross-site Scripting), поэтому он попросил меня закодировать приведенный выше код.

Как я могу предотвратить XSS (межсайтовый скриптинг) для URL-адреса действия формы. Поскольку это ненадежные данные, есть ли способ закодировать URL-адрес. После некоторых исследований я обнаружил, что лучше использовать ESAPI.encoder().encodeForURL('url'); метод. Я сомневаюсь, что это правильный способ использования ESAPI.encoder().encodeForURL('url') для URL-адреса действия формы?

Из памятки по предотвращению межсайтовых_скриптов

Фактический URL действия формы:

     <form name="loginForm" id="login" method="POST" action="<%=request.getParameter("actionUrl")%>">

Закодированный URL-адрес действия формы:

     <form name="loginForm" id="login" method="POST" action="<%=ESAPI.encoder().encodeForURL(request.getParameter("actionUrl"))%>">

Мы ценим любые предложения.


person Sarath Upadrista    schedule 26.12.2014    source источник
comment
Вы хотите предотвратить XSS, как вы пишете в заголовке, или вы хотите предотвратить экранирование URL-адреса action? В чем проблема с использованием ESAPI.encoder().encodeForURL? Почему вы добавляете <pre> к form?   -  person t.niese    schedule 26.12.2014
comment
Я отредактировал комментарии выше. Я хотел бы предотвратить XSS для URL-адреса действия формы. Я сомневаюсь, могу ли я использовать ESAPI.encoder().encodeForURL() для URL-адреса действия формы, потому что, когда я увидел Правило № 5 из Cross_Site_Scripting Prevention Cheatsheet, в нем упоминается, что это правило должно применяться к значениям параметров HTML URL.   -  person Sarath Upadrista    schedule 26.12.2014
comment
Вам всегда нужно избегать данных, которые вы изначально получили из ненадежного источника, независимо от того, где вы вставляете их на свою страницу. Поскольку actionUrl может быть чем-то вроде " onsubmit="alert('xss');, вам нужно избежать actionUrl, чтобы он не допустил такого рода атаки. Но тогда есть еще одна проблема, так как кто-то может передать http://a-malicious-domain.com/to/collect/data как actionUrl, и тогда данные формы будут отправлены на чужой домен. Просто экранирование URL не поможет.   -  person t.niese    schedule 26.12.2014


Ответы (3)


ESAPI.encoder().encodeForURL() неверно, потому что это кодирует всю строку в процентах, что может повредить URL-адрес. Это больше предназначено для кодирования отдельных параметров в URL-адресе.

В этом контексте внутри атрибута следует использовать ESAPI.encoder().encodeForHTMLAttribute().

Однако здесь есть дополнительная проблема. Если URL-адрес не является доверенным, пользователь может отправлять данные своего журнала на ненадежный сайт. Вы должны точно проверить, откуда берется URL-адрес, и убедиться, что пользователь не может контролировать его содержимое.

Если URL-адрес всегда имеет аналогичный формат, вы можете проверить это в контроллере.

person fgb    schedule 29.12.2014
comment
Спасибо фгб. После использования этого encodeForHTMLAttribute() для URL-адреса действия формы, как я могу проверить, кодирует ли он URL-адрес? - Будет ли какая-либо разница в URL-адресе действия формы после использования encodeForHTMLAttribute(), когда я проверяю консоль разработчика браузера Chrome? - person Sarath Upadrista; 29.12.2014
comment
@SarathUpadrista Не будет никакой разницы, если URL-адрес не содержит символы, которых не должно быть, например кавычки. Из-за того, как используется URL-адрес, ему нужно доверять, поэтому кодирование не является главной проблемой. Это гарантирует, что пользователь не сможет изменить URL-адрес, который, надеюсь, уже имеет место. - person fgb; 29.12.2014

Ваша логика в корне ошибочна, если вы используете пользовательский ввод для действия формы.

Какова общая картина вашего кода? Мы можем помочь вам разработать его лучше, чтобы вы не использовали пользовательский ввод в качестве действия формы для начала.

person Born2Code    schedule 26.12.2014
comment
Здравствуйте, родился, пожалуйста, проверьте мой полный код. Я отредактировал свой вопрос. - person Sarath Upadrista; 05.01.2015

вам следует использовать такие инструменты, как «modsecurity», которые используют «регулярные выражения» и имеют некоторые правила для предотвращения атак xss. Взгляни на :

http://www.opensourceforu.com/2011/08/securing-apache-part-10-mod_security/ http://blog.spiderlabs.com/2013/09/modsecurity-xss-evasion-challenge-results.html

Надеюсь, они имеют смысл...

person Hamid Hosseini    schedule 26.12.2014