【发布时间】:2014-02-20 06:33:05
【问题描述】:
如果我通过这个值
return String.Format(CultureInfo.InvariantCulture, "<input type=\"hidden\" id=\"{0}\" post=\"True\" type=\"{1}\" value=\"{2}\" />", controlId,type,post)
到一个文本框,这是否暴露于 XSS?由于我是新手,谁能帮我解决这个问题?
【问题讨论】:
如果我通过这个值
return String.Format(CultureInfo.InvariantCulture, "<input type=\"hidden\" id=\"{0}\" post=\"True\" type=\"{1}\" value=\"{2}\" />", controlId,type,post)
到一个文本框,这是否暴露于 XSS?由于我是新手,谁能帮我解决这个问题?
【问题讨论】:
一个好的起点是OWASP XSS Cheat Sheet
基本上,XSS 是一个难题。如果您不需要在页面上允许 html,请不要。适当地编码您的输入。不要尝试手动过滤。这困难而且很容易出错。要么使用经过验证的库,要么阻止所有 html。
【讨论】:
从您的代码中不清楚您的 controlId、type 和 post 变量来自何处。
return String.Format(CultureInfo.InvariantCulture, "<input type=\"hidden\" id=\"{0}\" post=\"True\" type=\"{1}\" value=\"{2}\" />", controlId,type,post)
除非它们是您自己设置的(例如type = "hidden";),否则您应该假设它们是不安全的(即使它们来自您自己的数据库)。现在不安全并不意味着本质上不安全,它意味着它们输出的上下文(在这种情况下为 HTML)是不安全的。
例如如果他们在您的变量之一中输入" /><script>alert('foo');</script><,则会导致 JavaScript 被执行。这是因为如果 post 发生更改,您的代码将在 HTML 中呈现以下内容:
<input type="hidden" id="bar" post="True" type="hidden" value="" /><script>alert('foo');</script>"< />
为了使它们对 HTML 安全,您必须使用 Server.HtmlEncode() 函数。您的代码的安全版本是:
return String.Format(CultureInfo.InvariantCulture, "<input type=\"hidden\" id=\"{0}\" post=\"True\" type=\"{1}\" value=\"{2}\" />", Server.HtmlEncode(controlId), Server.HtmlEncode(type) , Server.HtmlEncode(post))
这将防止任何人在任何变量中输入 " 字符并破坏您的 HTML 字符串(它将变为 &quot; 并将由浏览器呈现为 ")。
@Vineet Verma 的回答涉及Cross Site Request Forgery (XSRF),这与Cross Site Scripting (XSS) 完全不同。
@akirilov 的回答建议对输入进行编码。在我看来这是错误的,因为只有在输出时输入才是不安全的。例如,输出到 JSON 需要与 HTML 完全不同的编码。这就是为什么您通常应该允许任何输入进入您的应用程序,但在输出时进行编码。查看XSS (Cross Site Scripting) Prevention Cheat Sheet 并在输出到不同上下文时遵循他们的指导方针。
输入验证仅适用于您可以轻松验证的内容(例如社会保险号)。验证输入不包含有害的 JavaScript 代码要困难得多。这就是为什么最好在输出时进行编码,这将使您的应用程序免受XSS 的影响。
【讨论】:
甚至可以通过此代码伪造跨站点脚本。
试试这个方法:
如果 session 和 token 中的值不同,则可能是 XSS 攻击。如果它们相同,则意味着您的反应很好。
谷歌还有其他对策。
【讨论】: