保护我自己免受跨站脚本攻击

时间:2011-12-02 14:20:50

标签: asp.net .net request xss

我已实施Request.QueryString["somestr"].ToString();

我通过执行HttpUtility.HtmlEncode(Request.QueryString["somestr"].ToString();

来禁止跨站点脚本编写

我仍然遇到用户可以执行的问题:

myfriendlydomain.com/?somestr ='; alert(WOO XSS SUCCEDED); test ='

如何防止这种情况发生?

根据要求:

//Code Behind
if(request.querystring["somestr"] != null)
{
  AffiliatesEmail = HttpUtility.HtmlEncode(Request.QueryString["somestr"].ToString();    
}

//Front End
<script type="text/javascript">
  //<![CDATA[
    /*** Do not change ***/
    var SomeVAR = {};
    SomeVAR.Tracking.Sale.orderRef = '<%= AffiliatesEmail %>';
  //]]>
</script>

<script src="https://www.somethirdparty.com/somejscript.js" type="text/javascript" defer="defer"> </script>

这是我们的实施。之后的任何事情我都不相信是相关的。

3 个答案:

答案 0 :(得分:2)

您可以使用JavaScriptStringEncode() Method来清理字符串并对其进行编码以防止这种情况发生。

另一种方法是使用AntiXSS库。

答案 1 :(得分:1)

通过了解使用AffiliatesEmail字符串的上下文,有助于了解验证和清理字符串的过程。

比方说,我们知道AffiliatesEmail只有在数字时才有效。这样,如果您拒绝任何未验证为数字的Request.QueryString["somestr"],您将受到保护。

现在,我怀疑AffiliatesEmail实际上应该是有效的电子邮件地址。

使用这些知识,我们现在可以将其验证为电子邮件地址并拒绝其他所有内容:

using System.Net.Mail;
try
{       
    MailAddress ma = new MailAddress(AffiliatesEmail);
}
catch (FormatException fe)
{
    //Email isn't valid, so don't output it to the client!!!
}

上面的代码只是验证字符串是否是电子邮件地址(由.NET定义) - 如果不是,那么我们不需要担心 < / strong>,因为我们根本不信任它。

所以不要过于依赖于在查询字符串中放置的东西 - 只要知道可接受的范围,就可以避免复杂的正则表达式和XSS清理程序。

答案 2 :(得分:0)

您需要验证每个查询字符串输入,以确保您有有效的数据。我不会直接将值写入页面。