如果我传递此值
return String.Format(CultureInfo.InvariantCulture, "<input type=\"hidden\" id=\"{0}\" post=\"True\" type=\"{1}\" value=\"{2}\" />", controlId,type,post)
到文本框,是否暴露给XSS?因为我是新手,所以任何人都可以帮助我吗?
答案 0 :(得分:2)
一个好的起点是OWASP XSS Cheat Sheet
基本上,XSS是一个难题。如果您不需要在页面上允许html,请不要。适当地编码您的输入。不要试图手动过滤东西。这是困难,很容易出错。要么使用经过验证的库,要么阻止所有html。
答案 1 :(得分:2)
从您的代码中不清楚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)。
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字符串(它将变为"
并由浏览器呈现为"
)
@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)
即使通过此代码,也可以伪造跨站点脚本。
尝试这种方法:
如果会话和令牌中的值不相同,则表示可能是XSS攻击。如果它们相同则意味着你有良好的反应。
谷歌也采取其他措施。