我有许多参数构成插入表格,例如:
x.Parameters.AddWithValue("@city", City.Text)
今天早上我在网站上发生了一次失败的xss攻击,所以无论如何我都试图加强安全措施....
我应该像这样添加输入参数吗?
x.Parameters.AddWithValue("@city", HttpUtility.HtmlEncode(City.Text))
我还应该考虑避免攻击吗?
答案 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条规则进行操作即可。