C# - Literal控件容易受到XSS攻击

时间:2010-11-01 15:45:31

标签: c# asp.net literals

我正在使用文字在产品页面控件上显示一些javascript。基本上我正在做的是在我的代码后面我声明一个新的字符串构建器,编写脚本同时插入一些动态变量来填充脚本然后将文字文本设置为stringbuilder。这让我对xss攻击持开放态度。我该怎么做才能防止这种情况发生?

EDIT。这是stringbuilder的一个例子。当页面加载时,xss漏洞就会在生成javascript后立即发生。

System.Text.StringBuilder sb = new System.Text.StringBuilder();
            //loop through items in the collection
            for (int i = 0; i < _prod.ActiveProductItemCollection.Count; i++)
            {
                sb.Append("<script type='text/javascript'>");
                //add +1 to each item
                sb.AppendFormat("mboxCreate(\"product_productpage_rec{0}\",", i+1);
                sb.Append("\"entity.id=" + _prodID + "\",");
                sb.Append("\"entity.categoryId=" + _categoryID + "\",");
                sb.Append("\"entity.name=" + _prod.ActiveProductItemCollection[i].Title + "\",");
                sb.Append("\"entity.pageURL=" + Request.Url.ToString() + "\",");
                //The following value has been taken from the productImageControl code behind.
                //Might have to refactor in future as a property of the image control.
                string filename = AppSettingsManager.Current.ProductImagePathLarge + _prod.ActiveProductItemCollection[i].Sku
                    + AppSettingsManager.Current.ProductImageExtension;
                sb.Append("\"entity.thumbnailURL=" + filename + "\",");
                sb.Append("\"entity.inventory=" + _prod.ActiveProductItemCollection.Count + "\",");
                sb.Append("\"entity.value=" + _prod.ActiveProductItemCollection[i].ActualPrice + "\",");
                sb.Append("\"entity.ProductItemID=" + _prod.ActiveProductItemCollection[i].Sku + "\",");
                sb.Append("\"entity.addToCartImg=~/Images/Buttons/btn_AddToCartFlat.gif\");<");
                //The last line has to be /script. < inserted on prev line. do not change it or bad things will happen.            
                sb.Append("/script>");
            }
            this.LiteralMBoxScript.Text = sb.ToString();

5 个答案:

答案 0 :(得分:3)

您需要正确编码您放入Javascript的任何用户生成的数据。

在ASP.Net 4.0中,您可以拨打HttpUtility.JavaScriptStringEncode 在早期版本中,您可以使用Web Protection Library

答案 1 :(得分:1)

要预防XSS,您可以HTML encode该值。

答案 2 :(得分:1)

或者,您可以编写javascript来读取用户提供的页面外数据。这将导致更少的JavaScript代码和更快的页面加载。

如果您正在使用JQuery,您可以使用$ .Parent()和$ .Children()选择器将DOM遍历到相应的表单控件,以引用有关循环中该特定记录的信息。

这是一个相对简单的样本

function doSomething(context) {
var IDInput = $(context).parent('td').parent('tr').children('td.id').children('.hidden');
//Do something with the value
IDInput.val();
}

这适用于以下html示例:

<table>
<tr>
<td><input type="button" onclick="doSomething(this)" value="Do Something"/></td>
<td class="id">Hidden ID Value <input type="hidden" value="1"/></td>
</tr>
<tr>
<td><input type="button" onclick="doSomething(this)" value="Do Something"/></td>
<td class="id">Hidden ID Value <input class="hidden" type="hidden" value="2"/></td>
</tr>
</table>

这样做的好处是你不再需要编写将ID作为参数的javascript函数,这意味着你不需要在按钮上动态生成函数,并且可以在头文件中加载它们在一个单独的JS文件中。

答案 3 :(得分:0)

好吧,如果只是你自己的脚本写入文字,你就不会比你在网站上只包含一个js文件更容易受到攻击了。如果另一方面,您的脚本中散布着用户提供的任何类型的数据,那么您需要在将数据写入页面之前对其进行清理。

答案 4 :(得分:-1)

如果您使用的是.NET 4.0,则可以使用<%: theText %>语法输出值。