我有许多参数组成一个插入表单,例如:
x.Parameters.AddWithValue("@city", City.Text)
今天早上我在网站上遇到了一次失败的 xss 攻击,所以无论如何我都在努力加强安全措施......
我应该像这样添加我的输入参数吗?
x.Parameters.AddWithValue("@city", HttpUtility.HtmlEncode(City.Text))
还有什么我应该考虑避免攻击的吗?
我有许多参数组成一个插入表单,例如:
x.Parameters.AddWithValue("@city", City.Text)
今天早上我在网站上遇到了一次失败的 xss 攻击,所以无论如何我都在努力加强安全措施......
我应该像这样添加我的输入参数吗?
x.Parameters.AddWithValue("@city", HttpUtility.HtmlEncode(City.Text))
还有什么我应该考虑避免攻击的吗?
不要对输入进行编码。对输出进行编码。在未来的某个时候,您可能决定要使用相同的数据来生成 PDF 或 Word 文档(或其他文件),此时您不希望它是 HTML。
当您接受数据时,它只是数据。
当您将数据插入数据库时,需要将其转换为对数据库有意义。
当您将数据插入 HTML 文档时,需要将其转换为对 HTML 有意义。
… 等等。
我强烈建议查看OWASP XSS 预防备忘单。它有助于对可以注入的 html 文档的不同区域进行分类,以及如何针对每个位置对输出进行适当编码的方法。
要知道,您不能仅仅普遍信任 htmlEncode() 之类的函数,并期望它成为治疗所有疾病的灵丹妙药。引用链接的 OWASP 文档:
为什么我不能只对不可信的数据进行 HTML 实体编码?
HTML 实体编码适用于您放入 HTML 文档正文(例如标签内)的不受信任的数据。它甚至适用于进入属性的不受信任的数据,特别是如果您热衷于在属性周围使用引号。但是,如果您将不受信任的数据放在任何地方的标签中,或者像 onmouseover 这样的事件处理程序属性中,或者在 CSS 中,或者在 URL 中,则 HTML 实体编码不起作用。因此,即使您在任何地方都使用 HTML 实体编码方法,您仍然很可能容易受到 XSS 的攻击。您必须对要放入不受信任数据的 HTML 文档部分使用转义语法。这就是以下规则的全部内容。
花时间准确了解 XSS 的工作原理和原因。然后只要遵循这 7 条规则,你就会安全。