HTML кодирует ввод данных пользователем при хранении или при отображении

Сначала вы получите некоторую справочную информацию (каждый из них объясняется ниже в соответствующем заголовке, если вы хотите получить дополнительную информацию):

  • Стандарт требует, чтобы istream s восстанавливал только / g10], когда ios_base::badbit установлен в basic_istream::exceptions
  • libstdc ++ не соответствует этому требованию, но libc ++ делает
  • libc ++ делает недействительными ошибки, запрашивающие его зеркалирование поведения libstdc ++
  • libc ++ proffers ios_base::badbit побито с нужным ios_base::iostate в качестве обходного пути

К сожалению, это обходное решение имеет побочный эффект также ретронирования всякий раз, когда ios_base::badbit устанавливается независимо от ios_base::failbit: http://en.cppreference.com/w/cpp/io/ios_base/iostate#The_badbit

Если вы ищете бросок, чтобы произойти только , когда ios_base::failbit установлен, и вам нужно, чтобы это было одинаковое поведение в libc ++ и libstdc ++, вам нужно будет проверить ios_base::badbit после каждой операции ввода, происходящей на istream. Это должно выглядеть примерно так:

if((is.rdstate() & ios_base::failbit) != 0) throw ios_base::failure("basic_ios::clear");

Как отмечено cpplearner , вы даже не можете использовать basic_istream::fail , у вас есть чтобы выполнить бит-тест теста istream rdstate . Но, честно говоря, это лишь добавляет немного сложности.

Что может сделать это монументальной задачей, так это то, в какой степени используется istream. Широкое использование функции istream можно было бы устранить с помощью вспомогательных функций, но использование istream_iterator s или сложных перегрузок оператора извлечения быстро сделает ручную проверку этой необоснованной задачи.

Если вы окажетесь там я бы серьезно рассмотрел возможность обходного пути is.exceptions(ios_base::failbit | ios_base::badbit).


Стандарт требует, чтобы istream s реконструировал только , когда ios_base::badbit установлен в basic_istream::exceptions ]

Вызов basic_istream::exceptions(istream::failbit) установит маску, которую можно получить, вызвав basic_istream::exceptions(), которая согласно 27.5.5.4 [iosstate.flags] / 11 стандарта:

Маска, которая определяет, какие элементы, установленные в rdstate(), вызывают исключения.

blockquote>

Это поддерживается в 27.7.2.2.3 [istream :: extractors] / 15 для неотформатированных методы вставки:

Если он не вставил никаких символов, потому что он поймал исключение, вызванное при извлечении символов из *this и failbit включено в exceptions() (27.5.5.4), тогда пойманное исключение отменяется.

blockquote>

Однако для форматированного ввода это retrograded в 27.7.2.2.1 [istream.formatted.reqmts] / 1; требуя, чтобы бросок произошел только тогда, когда бит и маска и ios_base::badbit отличны от нуля:

Если во время ввода выбрано исключение, то ios::badbit включается в *this. Если (exceptions()&badbit) != 0, то исключение будет восстановлено.

blockquote>

libstdc ++ не соответствует этому требованию, но libc ++ делает

ios_base::failbit должен быть установлен на нем соответствующий istream для таких событий, как:

Числовые, указательные и логические входные перегрузки basic_istream::operator>> (технически, перегрузки num_get::get, которые они вызывают), если вход не может быть анализируется как допустимое значение или если синтаксический анализ не подходит для целевого типа.

blockquote>

[ Источник ]

Если используется только ios_base::failbit установлен на маске basic_istream::exceptions ', и происходит событие, в результате чего устанавливается ios_base::failbit, например, извлечение недопустимого числа, как описано выше:


libc ++ делает недействительными ошибки, запрашивающие зеркалирование поведения libstdc ++

Теперь теперь недействителен ошибка для libc ++ для этой самой проблемы. Цитирование 27.7.2.1 [istream] / 4

Если одна из этих вызываемых функций выдает исключение, то, если явно не указано иначе, входная функция устанавливает badbit в состояние ошибки. Если функция badbit включена в exceptions(), функция ввода отменяет исключение, не выполняя его действия, в противном случае он ничего не бросает и продолжает действовать так, как если бы вызванная функция вернула индикацию отказа.

blockquote>

libc ++ proffers ios_base::badbit побито с нужным ios_base::iostate в качестве обходного пути

Наш собственный Говард Хиннант (который также является представителем libc ++, который invalidated связанная ошибка libc ++) предлагает в ответ на дубликат этого вопроса (а также в ошибке libc ++), что вы используете обходной путь:

is.exceptions(ios_base::failbit | ios_base::badbit);

30
задан IAdapter 27 September 2009 в 20:21
поделиться

5 ответов

я настоятельно рекомендовал бы кодировать информацию о выходе. хранить необработанные данные в базе данных полезно, если Вы хотите изменить способ, которым это просматривается в определенный момент. поток должен быть чем-то подобным:

sanitize user input -> protect against sql injection -> db -> encode for display

думают о ситуации, где Вы могли бы хотеть отобразить информацию как канал RSS вместо этого. имея необходимость восстановить любой HTML определенное кодирование, прежде чем Вы восстановите изображение, кажется немного глупым. любая разработка должна всегда следовать, "не доверяют входу" мем, является ли тот вход от пользователя или от базы данных.

27
ответ дан Owen 28 November 2019 в 00:06
поделиться

Кодирование должно только только только быть сделано в дисплее. Без исключения.

6
ответ дан Andy Lester 28 November 2019 в 00:06
поделиться

Вывод.

С HTML Вы не можете просто проверить длину строки (&, 1 символ, но strlen() скажет Вам 5), можно легко обрезать его (это могло повредить объекты).

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

PHP пыталась сделать подобную вещь с magic_quotes, и это оказалось огромным отказом. Не берите magic_entities маршрут!:)

6
ответ дан Kornel 28 November 2019 в 00:06
поделиться

Следует иметь в виду, что Вы, возможно, должны получить доступ к базе данных с чем-то, что не понимает, что HTML закодировал текст (например, инструмент создания отчетов). Я соглашаюсь, что пространство является надуманным вопросом, но по моему скромному мнению, помещая кодирование HTML в знание перемещений базы данных Вашего представления/фронтэнда в самый низкий уровень в приложении, и это - ошибка дизайна.

6
ответ дан Craig Stuntz 28 November 2019 в 00:06
поделиться

Разве это не противоречит цели кодирования? Если в качестве входных данных ввести вредоносный сценарий sql, который затем передается в базу данных, это может вызвать огромную проблему.

0
ответ дан 28 November 2019 в 00:06
поделиться
Другие вопросы по тегам:

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