Кодировщик Java Esapi

Здравствуйте, я использую ESAPI для кодирования и декодирования строк, чтобы избежать атак сценария, и я использую его так:

   public static String encode(String value) {
    if (value == null) {
        return null;
    }
    Encoder encoder = ESAPI.encoder();
    return encoder.encodeForHTML(encoder.canonicalize(value));
}

Проблема заключается в том, что если я передаю строку со знаком «%» и декодирую с помощью StringEscapeUtils unescapeHtml , он изменяет «%» на � Должен ли я использовать другой метод для unescaping ?

2 ответа

  1. Проблема в использованииEncoder.canonicalize(), как вы делаете здесь. canonicalize перед проверкой ввода, а не перед выводом.

    Просто используйте методы кодирования здесь, не используйте метод canonicalize.

    Другие мудрые предложения для canonicalize:

    1. Не сохраняйте каноническое значение. Используйте его только для выполнения
      логика проверки против. Значение, RawInput->Canonicalize — >>Validate. При проверке сохраняйте / обрабатывайте исходное значение.

    2. Основное преимущество метода в обнаружении смешанного или
      несколько атак кодирования.