我有这样的事情:
<td>
<a href="pagina3.aspx?u=<%=request.querystring.get("u")%>&t=2&p=<%=Request.QueryString.Get("p")%>">
<img src="image.png" />
</a>
</td>
但是这样我检测到了XSS漏洞。有一种正确的方法来使用查询字符串并避免漏洞,或者我必须改变传递参数的方式? 我试过这样的事情:
<td>
<form method="post" action="pagina3.aspx">
<input type="hidden" value="<%=request.querystring.get("u")%>" name="u" />
<input type="hidden" value="2" name="t" />
<input type="hidden" value="<%=request.querystring.get("p")%>" name="p" />
<input type="image" value="submit" src="image.png" alt="submit Button" />
</form>
</td>
但它不起作用,因为所有页面都在已有表单的母版页中。 有什么建议吗?
答案 0 :(得分:2)
您需要考虑几件事,主要的是要处理XSS。
是的,根据您当前的实施,您很容易受到XSS攻击。
内容相关编码
至少你应该做的是对不受信任的数据(在这种情况下是查询字符串)的CONTEXTUALLY编码。
重要的一点是确保您获得正确的编码上下文,根据您的示例,您希望编码HtmlAttribute。
根据您使用的.Net框架的版本,您有两种选择:
.NET Framework 4.6和4.5 - 使用System.Web.Security.AntiXss.AntiXssEncoder class。
对于较旧的框架,请下载Microsoft Anti-Cross Site Scripting Library V4.2
然后你的代码看起来像这样:
<input type="hidden"
value="<%= AntiXssEncoder.HtmlAttributeEncode(request.querystring.get("u")) %>"
name="u" />
有关XSS读取的更多信息:
隐藏字段
在您的示例中,您将信息放入隐藏字段中。确保您不是盲目信任这些数据,用户可以轻松查找和修改这些值(使用Chrome中没有插件的开发人员工具)。
参考文献:
常规Web应用安全参考
答案 1 :(得分:0)
可能是这样的:
<td>
<a href="pagina3.aspx?u=<%=Server.UrlEncode(Request.querystring.get("u"))%>&t=2&p=<%=Server.UrlEncode(Request.QueryString.Get("p"))%>">
<img src="image.png" />
</a>
</td>