【问题标题】:Adding HTML encoding to the business layer向业务层添加 HTML 编码
【发布时间】:2009-06-07 18:18:31
【问题描述】:

向网页添加用户输入时,应该(当然,除非是 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)

这是其他人使用的方法,还是一个愚蠢的想法?有什么好处和坏处?

谢谢。

【问题讨论】:

    标签: asp.net encoding n-tier-architecture


    【解决方案1】:

    在某些极端情况下这是有意义的,但总的来说,我建议不要这样做。您的业​​务逻辑层应该只处理业务逻辑和业务逻辑。

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我想只在输出时对数据进行编码 - 进入数据库的所有内容都将按原样存储。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-09-04
            • 2014-11-24
            • 2011-05-04
            • 2014-06-21
            • 2019-04-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多