2009-06-07 36 views
0

当添加用户输入到一个网页,它应该(除非是当然的HTML :)进行编码,以帮助防止XSS攻击等。像这样:添加HTML编码到业务层

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) 

这是一种办法,其他任何人使用,或者是一个愚蠢的想法?优缺点都有什么?

谢谢。

回答

3

可能有边缘的情况下,这是有道理的,但总的来说,我会建议反对这一点。您的业​​务逻辑层只应处理业务逻辑和业务逻辑。

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

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

+0

我同意 - 感谢您的理智检查。 – Nick 2009-06-07 20:43:57

1

在将数据保存到数据库中使用HtmlEncode的问题是,您必须在数据中处理诸如&"之类的内容。例如,“Tom O'Brien”将以“Tom O " Brien”的形式保存到数据库中。做一个SELECT或UPDATE将是棘手。

我认为只有在UI中使用HtmlEncode来显示文字,才会做得更好。

+0

我在考虑只在出路上对数据进行编码 - 所有进入数据库的数据都将按原样存储。 – Nick 2009-06-07 18:36:34

0

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

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

1

您的业务逻辑真的不应该知道您的演示文稿。无论您是在提供网络,Windows还是任何其他类型的用户界面,您都不应该在业务逻辑中拥有这些细节。

您是否认为使用业务层的人可能会尝试在编码之上再次对数据进行编码?这可能会导致看起来很杂乱。

0

了解PHP的magic_quotes_gpc功能的教训:这样的编码无疑只会让事情更加混乱,当你不应该时你会逃避,在你应该时忘记逃跑,并且通常是一种痛苦。不要对数据进行编码,直到将其发送到需要的地方,无论是数据库,Web还是其他地方。