Добавление кодировки HTML на бизнес-уровень
При добавлении пользовательского ввода на веб-страницу его следует (если, конечно, это не HTML-код:) кодировать, чтобы предотвратить атаки XSS и т. Д., Например так:
litForename.Text = HttpUtility.HtmlEncode(MyUser.Forename);
Я собираю шаблон для генерации своего уровня бизнес-логики и думаю использовать его для выполнения всего кодирования, как только данные поступают из базы данных, прежде чем они попадут в код пользовательского интерфейса. Это обеспечит кодирование всего, что должно быть (очевидно, я исключил бы столбцы, содержащие строки Xhtml/Xml). Перегрузка методов доступа к данным позволит получать данные без кодирования (поэтому их можно редактировать):
// Get a 'User' entity with all the string fields HTML encoded
BLL.Users.GetById(int userId)
// Get a 'User' entity with optional HTML encoding
BLL.Users.GetById(int userId, bool useHtmlEncoding)
Это подход, который кто-то еще использует, или это глупая идея? Каковы плюсы и минусы?
Благодарю.
5 ответов
Могут быть крайние случаи, когда это имеет смысл, но в целом я бы советовал против этого. Уровень вашей бизнес-логики должен иметь дело только с бизнес-логикой и бизнес-логикой.
Аналогично, ваши контроллеры (при условии, что ASP.NET MVC) должны иметь дело со значениями, которые имеют смысл в контексте вашей бизнес-области, а не со значениями, уже измененными в ожидании определенного типа пользовательского интерфейса.
Ваш уровень пользовательского интерфейса является единственным уровнем, который должен знать и заботиться о том, какой это тип пользовательского интерфейса. На данный момент может показаться, что ваш единственный тип пользовательского интерфейса будет основан на HTML, но это может измениться.
Ваша бизнес-логика действительно не должна знать о вашей презентации. Независимо от того, используете ли вы веб-интерфейс, Windows или любой другой тип пользовательского интерфейса, вы не должны включать эти детали в свою бизнес-логику.
Рассматривали ли вы, что люди, использующие ваш бизнес-уровень, могут попытаться снова закодировать данные поверх вашей кодировки? Это может привести к тому, что все будет выглядеть очень грязно.
Проблема с использованием HtmlEncode
на данных, которые сохраняются в базе данных, что вы должны иметь дело с такими вещами, как &
а также "
в ваших данных. Например, "Том О'Брайен" будет сохранен в базе данных как "Том О""
Brien". Делать SELECT или UPDATE на этом будет сложно.
Я думаю, что вы будете делать лучше, используя только HtmlEncode
для отображения текста в пользовательском интерфейсе.
Изучите уроки PHP magic_quotes_gpc
особенность: такое кодирование, несомненно, только еще больше запутает вещи, заставит вас уйти, когда вы не должны, забыть убежать, когда вы должны, и, как правило, будет боль. Не кодируйте свои данные, пока они не будут отправлены туда, куда они должны отправиться, будь то база данных, Интернет или где-то еще.
Я согласен с другими авторами, что преобразование данных на уровне представления относится к генерации представления. Вы можете начать только с представлений на основе XML (например, XHTML, VoiceXML для голосового просмотра, XML для веб-служб), но что произойдет, если вы решите, что вам также нужны представления JSON для поддержки взаимодействий AJAX? JSON Литералы Javascript используют другой механизм перехода, чем XML.
У вас также будут случаи, когда один метод логического уровня должен вызывать другой для цели, не связанной с генерацией представления. Возможно, вызывающему методу необходимо применить какое-то массовое преобразование данных, которое заполняет другую таблицу базы данных. В этом случае вызывающий метод должен будет отменить экранирование XML.