0

所以我决定在我的表单元素中使用 GET,将它指向我的 cshtml 页面,并发现(如预期的那样)它会自动对任何传递的表单值进行 URL 编码。

然而,我随后决定测试它是否对尖括号进行编码,并令人惊讶地发现,当 WebMatrix 验证器抛出一个服务器错误警告我有关传递的潜在危险值时,它没有编码。

我对自己说,“好吧,那我想我会Request.Unvalidated["searchText"]Request.QueryString["searchText"]. Request.UnvalidatedJavaScript 到 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 编码),但我认为实际上可能没有必要对它们进行“搜索”。我对如何实现最大的安全性和功能期望感到困惑,但如果我选择一种方式或另一种方式,我可能不知道我选择了错误的决定,直到为时已晚......

4

1 回答 1

1

URL 和特殊字符

该 urlhttp://test.com/?param="><script>alert('xss')</script>是“良性的”,直到它被读取并且..

  1. 在模板中打印:Hello @param。(潜在的反射/持续 XSS)

  2. 或在 Javascript 中使用:(divContent.innerHTML = '<a href="' + window.location.href + ...潜在的 DOM XSS)

否则,浏览器不会将查询字符串评估为 html/script。

Request.Unvalidated/Request.QueryString

如果您希望收到特殊字符,则应使用 Request.Unvalidated["searchText"]。例如 :<b>User content</b><p>Some text...</p>

如果您的应用程序使用 QueryString["searchText"] 按预期工作,您应该保留它,因为它会验证潜在的 XSS。

参考:http: //msdn.microsoft.com/en-us/library/system.web.httprequest.unvalidated.aspx

于 2013-06-28T14:53:21.523 回答