Java: кодировка URL, оставляющая символ «разрешенным» без изменений - PullRequest
3 голосов
/ 16 февраля 2011

Простой вопрос от новичка Java. Я хочу закодировать URL, чтобы нестандартные символы были преобразованы в их шестнадцатеричное значение (то есть% XX), в то время как символы, которые можно увидеть в URL-адресе, цифры, косые черты, знаки вопроса и все остальное, останутся без изменений.

Например, кодировка

"hi/hello?who=moris\\boris"

должно получиться с

"hi/hello?who=moris%5cboris"

идеи?

Ответы [ 6 ]

1 голос
/ 16 февраля 2011

Вы можете использовать ниже, чтобы избежать специальных символов в URL.Однако вам нужно передать значение только не весь URL

public static String escapeSpecialCharacters(String input) {
        StringBuilder resultStr = new StringBuilder();
        for (char ch : input.toCharArray()) {
            if (isSafe(ch)) {
                resultStr.append(ch);
            } else{
                resultStr.append('%');
                resultStr.append(toHex(ch / 16));
                resultStr.append(toHex(ch % 16));                   
            }
        }

        return resultStr.toString();
    }

    private static char toHex(int ch) {
        return (char) (ch < 10 ? '0' + ch : 'A' + ch - 10);
    }

    private static boolean isSafe(char ch) {
    return ((ch>='A' && ch<='Z') || (ch>='a' && ch<='z') || (ch>='0' && ch<='9') || "-_.~".indexOf(ch)>=0); 
}
1 голос
/ 16 февраля 2011

API OWASP Enterprise Security предоставляет решение для этого.

Для получения более подробной информации перейдите по следующим ссылкам http://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#RULE_.235_-_URL_Escape_Before_Inserting_Untrusted_Data_into_HTML_URL_Parameter_Values

http://code.google.com/p/owasp-esapi-java/source/browse/trunk/src/main/java/org/owasp/esapi/codecs/PercentCodec.java

0 голосов
/ 07 мая 2015

Вы можете попробовать Spring UriUtils.Это, похоже, правильно обрабатывает кодировку / декодирование URL для соответствующих частей URL.

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/util/UriUtils.html

0 голосов
/ 16 февраля 2011

org.apache.commons.codec.net.URLCodec будет кодировать специальные символы (например, \ как вы указали).Тем не менее, вам, вероятно, придется разбить URL, поскольку вы не хотите, чтобы символы в пути кодировались.Кроме того, вам нужно разделить имена параметров и значения, так как?& и = должны оставаться неизменными для передачи параметров по отдельности, а не в виде одного огромного имени параметра.

0 голосов
/ 16 февраля 2011

Это на самом деле довольно сложная проблема. И причина того, что это сложно, состоит в том, что различные части URL-адреса должны обрабатываться (кодироваться) по-разному.

По моему опыту, лучший способ сделать это - собрать URL из его компонентов, используя класс URL или URI, позволяя им правильно позаботиться о кодировании компонентов.


На самом деле, теперь, когда я думаю об этом, вам нужно кодировать компоненты, прежде чем они будут собраны. После того, как детали собраны, невозможно сказать, является ли (например) "?" предназначен для разделителя запросов (не экранируйте его) или символа в компоненте пути (экранируйте его).

0 голосов
/ 16 февраля 2011

Используйте URLEncoder.encode(url, "UTF-8"), см. Javadoc .

...