我正在使用文字在产品页面控件上显示一些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();
答案 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 %>
语法输出值。