Символы UTF-8 исказили в HTTP Основное Подлинное имя пользователя

Во-первых, V->info.name плохо сформирован, внутри или снаружи лямбды.

Объект функции, отправляемый алгоритму std::find_if, должен быть унарной функцией. Он должен взять текущий элемент для проверки в качестве параметра.

auto found = std::find_if(
    V.begin(), V.end(), 
    [&Name](koalaGraph::PVertex const& item_to_check) {
        return Name == item_to_check->info.name;
    }
);

Тип found является итератором найденного элемента. Если ничего не найдено, возвращается V.end()

. Если вы используете C ++ 14 или лучше, вы можете даже использовать общие лямбды:

auto found = std::find_if(
    V.begin(), V.end(), 
    [&Name](auto const& item_to_check) {
        return Name == item_to_check->info.name;
    }
);
28
задан bignose 5 May 2009 в 23:10
поделиться

4 ответа

Я хочу позволить любые допустимые символы UTF-8 в именах пользователей и паролях.

Откажитесь от всей надежды. Стандартная аутентификация и Unicode не смешиваются.

Нет никакого стандарта (*) для того, как закодировать символы неASCII в Стандартную аутентификацию username:password маркер прежде base64ing это. Следовательно, каждый браузер делает что-то другое:

  • Opera использует UTF-8;
  • IE использует кодовую страницу системы по умолчанию (который у Вас нет способа знать, кроме он никогда не UTF-8), и тихо искажает символы, которые не вписываются к нему с помощью Windows, ‘предполагают случайный символ, который немного походит на тот, который Вы хотели или возможно просто не’ секретный рецепт;
  • Mozilla использует только младший байт символьных кодовых точек, который имеет эффект кодирования к ISO-8859-1 и искажения non-8859-1 символов безвозвратно... кроме тех случаев, когда, делая XMLHttpRequests, в этом случае он использует UTF-8;
  • Safari и Chrome кодируют к ISO-8859-1 и не удаются отправить заголовок авторизации вообще, когда non-8859-1 символ используется.

*: некоторые люди интерпретируют стандарт, чтобы сказать что также:

  • это должен всегда быть ISO-8859-1, из-за того являющегося кодировкой по умолчанию для включения необработанных 8-разрядных символов, непосредственно включенных в заголовки;
  • это должно быть закодировано с помощью правил RFC2047, так или иначе.

Но ни одно из этих предложений не находится по теме для включения в base64-закодированный подлинный маркер, и ссылка RFC2047 в спецификации HTTP действительно не работает вообще, так как все места, это могло бы потенциально использоваться, явно запрещены ‘правилами’ контекста атома самого RFC2047, даже если HTTP-заголовки соблюдали правила и расширения семейства RFC822, которое они не делают.

Таким образом: тьфу. Существует little-no надежда на это когда-либо зафиксированное в стандарте или в браузерах кроме Opera. Это - просто еще один фактор, отгоняющий людей от Базовой аутентификации HTTP в пользу нестандартного и менее - доступные основанные на cookie схемы аутентификации. Позор действительно.

54
ответ дан bobince 28 November 2019 в 02:57
поделиться

Это - известный недостаток, что Стандартная аутентификация не оказывает поддержку для non-ISO-8859-1 символов.

Некоторый UAS, как известно, использует UTF-8 вместо этого (Opera приходит на ум), но нет никакой совместимости для этого также.

Насколько я могу сказать, нет никакого способа зафиксировать это, кроме путем определения новой схемы аутентификации, которая обрабатывает весь Unicode. И получение его развернулось.

5
ответ дан Julian Reschke 28 November 2019 в 02:57
поделиться

Вы протестировали использование чего-то как curl для проверки это не проблема Firefox? Автор HTTP RFC тих на ASCII по сравнению с неASCII, но он действительно говорит, что значение передало в заголовке, является именем пользователя и паролем, разделенным двоеточием, и я не могу найти двоеточие в строке, что Firefox сообщает об отправке.

0
ответ дан Hank Gay 28 November 2019 в 02:57
поделиться

Дайджест-аутентификация HTTP тоже не решает эту проблему. Он страдает той же проблемой, что клиент не может сообщить серверу, какой набор символов он использует, и сервер не может правильно предположить, что использовал клиент.

3
ответ дан 28 November 2019 в 02:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: