跨站点脚本可能性?

时间:2014-02-20 06:33:06

标签: c# security xss

如果我传递此值

return String.Format(CultureInfo.InvariantCulture, "<input type=\"hidden\" id=\"{0}\" post=\"True\" type=\"{1}\" value=\"{2}\" />", controlId,type,post)

到文本框,是否暴露给XSS?因为我是新手,所以任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

一个好的起点是OWASP XSS Cheat Sheet

基本上,XSS是一个难题。如果您不需要在页面上允许html,请不要。适当地编码您的输入。不要试图手动过滤东西。这是困难,很容易出错。要么使用经过验证的库,要么阻止所有html。

答案 1 :(得分:2)

从您的代码中不清楚controlIdtypepost变量的来源。

return String.Format(CultureInfo.InvariantCulture, "<input type=\"hidden\" id=\"{0}\" post=\"True\" type=\"{1}\" value=\"{2}\" />", controlId,type,post)

除非它们是由您自己设定的(例如type = "hidden";),否则您应该认为它们不安全(即使它们来自您自己的数据库)。现在不安全并不意味着本质上不安全,这意味着它们输出的上下文不安全(在这种情况下是HTML)。

e.g。如果他们在您的某个变量中输入" /><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安全。

答案 2 :(得分:-3)

即使通过此代码,也可以伪造跨站点脚本。

尝试这种方法:

  1. 在页面中创建一个隐藏变量,名称为token。
  2. 将唯一且随机的值字符串传递给隐藏变量,并将此值存储在会话中。
  3. 对于命中服务器的每个请求,都会检查会话中的值和令牌隐藏字段中的值是否相同。
  4. 如果会话和令牌中的值不相同,则表示可能是XSS攻击。如果它们相同则意味着你有良好的反应。

    谷歌也采取其他措施。