0

将用户输入添加到网页时,它应该(当然,除非它是 HTML :) 被编码以帮助防止 XSS 攻击等。像这样:

litForename.Text = HttpUtility.HtmlEncode(MyUser.Forename);

我正在组合一个模板来生成我的业务逻辑层,并且我正在考虑在数据从数据库中出来后,在它到达 UI 代码之前使用它来完成所有编码。这将确保所有内容都经过编码(我显然会排除包含 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)

这是其他人使用的方法,还是一个愚蠢的想法?优缺点都有什么?

谢谢。

4

5 回答 5

3

可能有一些边缘情况是有意义的,但总的来说我建议不要这样做。您的业​​务逻辑层应该只处理业务逻辑和业务逻辑。

同样,您的控制器(假设为 ASP.NET MVC)应该处理在您的业务域上下文中有意义的值,而不是在预期特定类型的 UI 时已经改变的值。

你的 UI 层是唯一应该知道并关心它是什么类型的 UI 的层。目前看来,您唯一的 UI 类型将是基于 HTML 的,但这可能会改变。

于 2009-06-07T18:31:31.510 回答
1

您的业​​务逻辑真的不应该知道您的演示文稿。无论您是提供 Web、Windows 还是任何其他类型的 UI,您都不应该在业务逻辑中包含这些细节。

您是否考虑过使用您的业务层的人可能会尝试在您的编码之上再次对数据进行编码?这可能会导致事情看起来非常混乱。

于 2009-06-07T20:00:31.923 回答
1

使用HtmlEncode保存到数据库的数据的问题在于,您必须处理数据中的&和之类的事情"。例如,“Tom O'Brien”将作为“Tom "O'Brien”保存到数据库中。对此进行 SELECT 或 UPDATE 会很棘手。

HtmlEncode我认为仅用于在 UI 中显示文本会做得更好。

于 2009-06-07T18:33:03.083 回答
0

我同意其他发帖者的观点,即视图级数据转换属于视图生成。您可能只从基于 XML 的视图开始(例如,XHTML、用于语音浏览的 VoiceXML、用于 Web 服务的 XML),但是当您决定还需要 JSON 视图来支持 AJAX 交互时会发生什么?JSON Javascript 文字使用与 XML 不同的转义机制。

您还会遇到一个逻辑层方法需要调用另一个逻辑层方法以实现与视图生成无关的目的的情况。也许调用方法需要应用一些填充另一个数据库表的批量数据转换。在这种情况下,调用方法必须撤消 XML 转义。

于 2009-06-07T19:23:46.803 回答
0

吸取 PHPmagic_quotes_gpc特性的教训:这样的编码无疑只会让事情变得更加混乱,导致你在不应该逃跑的时候逃跑,在应该逃跑的时候忘记逃跑,而且通常会很痛苦。在将数据发送到需要去的地方之前不要对数据进行编码,无论是数据库、Web 还是其他地方。

于 2009-06-07T20:10:47.973 回答