到HTMLENCODE或不在Web窗体上的HTMLENCODE用户输入(asp.net vb)

时间:2010-06-03 08:48:37

标签: asp.net security parameters xss html-encode

我有许多参数构成插入表格,例如:

x.Parameters.AddWithValue("@city", City.Text)

今天早上我在网站上发生了一次失败的xss攻击,所以无论如何我都试图加强安全措施....

我应该像这样添加输入参数吗?

x.Parameters.AddWithValue("@city", HttpUtility.HtmlEncode(City.Text))

我还应该考虑避免攻击吗?

2 个答案:

答案 0 :(得分:5)

不要对输入进行编码。编码输出。在将来的某个时候,您可能决定要使用相同的数据来生成PDF或Word文档(或其他内容),此时您不希望它是HTML。

当您接受数据时,它只是数据。

当您将数据插入数据库时​​,需要将其转换为对数据库有意义。

当您将数据插入HTML文档时,需要将其转换为对HTML有意义。

......等等。

答案 1 :(得分:1)

我强烈建议您查看OWASP XSS Prevention Cheat Sheet。它有助于对可以注入的html文档的不同区域进行分类,以及如何针对每个位置对输出进行适当编码的方法。

知道你不能只是普遍信任像htmlEncode()这样的函数,并且预测它是所有弊病的神奇药丸。引用链接的OWASP文件:

  

为什么我不能只让HTML实体编码不受信任的数据?

     

HTML实体编码适用于放在HTML文档正文中的不受信任的数据,例如标记内部。它甚至适用于属于属性的不受信任的数据,特别是如果您对使用属性周围的引号具有宗教信仰。但是,如果您将不受信任的数据放在任何位置的标记内,或者像onmouseover,CSS内部或URL中的事件处理程序属性,则HTML实体编码不起作用。因此,即使您在任何地方使用HTML实体编码方法,您仍然很可能容易受到XSS的攻击。您必须使用转义语法来处理您将不受信任的数据放入HTML文档的部分。这就是以下规则的全部内容。

花时间了解XSS的确切运作方式和原因。然后按照这7条规则进行操作即可。