所以我决定在我的表单元素中使用 GET,将它指向我的 cshtml 页面,并发现(如预期的那样)它会自动对任何传递的表单值进行 URL 编码。
然而,我随后决定测试它是否对尖括号进行编码,并令人惊讶地发现,当 WebMatrix 验证器抛出一个服务器错误警告我有关传递的潜在危险值时,它没有编码。
我对自己说,“好吧,那我想我会Request.Unvalidated["searchText"]
用Request.QueryString["searchText"]
. Request.Unvalidated
JavaScript 到 URL,所以我不确定我是否应该担心这个。我注意到它对撇号、引号、括号和许多其他 JavaScript 特殊字符进行编码(实际上,我什至不确定尖括号是否有JavaScript 或 URL 中的特殊含义,但如果不是两者,它可能是一个,我知道它有助于在 C# 中表示一个列表,但无论如何,如果你能找到一种方法来获取它,你可以用它编写脚本标签HTML 页面,所以我想这就是为什么 WebMatrix 的验证器看到它们时会冲我尖叫的原因)。
我是否应该找到另一种方式来提交此表单,而我可以自己截取和编码用户数据,或者Request.Unvalidated
在这种情况下可以毫无顾虑地使用?
请注意,您可能已经注意到,我的问题来自 WebMatrix C#.net 环境。
额外的问题(如果您想节省我一些时间并且您已经知道答案):如果我使用Request.Unvalidated
,我是否必须对值进行 URL 解码,或者它会自动Request.QueryString
执行吗?
- - - - - - - - - - - - - -更新 - - - - - - - - - - - ------
因为我知道我既不想出现 YSOD 也不想出现自定义错误页面,因为用户在他们的“searchText”中包含了尖括号,所以我知道我必须使用Request.Unvalidated
任何一种方式,而且我知道一旦值达到,我可以编码任何我想要的东西cshtml 页面。
所以我想问题真的变成了:我是否应该担心仅基于尖括号的 URL 内可能的 XSS 攻击(或任何其他威胁)?
此外,如果这是相关的:
实际上,我正在使用的值(即“searchText”)直接进入一个 cshtml 页面,该页面通过一个(相当复杂的)SQL 查询运行该值,该查询查询数据库中的许多表(使用 JOINS 和 UNIONS,以及别名和基于函数的计算)来确定在每个适用字段中针对“searchText”找到的匹配项的数量。然后我会记住所有这些匹配项的页面位置,根据相关性(由找到的匹配项的类型和数量确定)确定搜索结果顺序,最后使用 C# 将搜索结果(当然是链接)写入页面。
而且我想重要的是要注意数据库值很容易包含尖括号。我知道到目前为止它是安全的(多亏了 HTML 编码),但我认为实际上可能没有必要对它们进行“搜索”。我对如何实现最大的安全性和功能期望感到困惑,但如果我选择一种方式或另一种方式,我可能不知道我选择了错误的决定,直到为时已晚......