【问题标题】:C# - Literal control vulnerable to XSS attackC# - 易受 XSS 攻击的文字控制
【发布时间】:2011-05-03 11:55:18
【问题描述】:

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

编辑。这是字符串生成器的示例。当页面被加载时,在生成 javascript 后立即发生 xss 漏洞。

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();

【问题讨论】:

  • 有人可以编辑这个以使代码可读吗?
  • 您最后的评论是错误的。在 C# 中追加 &lt;/script&gt; 整体并没有错。 (该问题仅适用于 HTML 中的内联 &lt;script&gt; 标记)

标签: c# asp.net literals


【解决方案1】:

为了防止 XSS 你可以HTML encode这个值。

【讨论】:

  • 通常 javascript 应该放在单独的 .js 文件中,而不是由字符串生成器或任何服务器端代码生成。
  • 达林,请查看已编辑的问题,了解为什么我不能使用外部 javascript 文件。
【解决方案2】:

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

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

【讨论】:

  • 我正在使用 asp.net4。我编辑了问题以包含更多细节
  • @tking:在组装字符串时,您需要在每个值上调用JavaScriptStringEncode
  • 我该怎么做?我不熟悉这种方法。像这样?
  • sb.Append("\"entity.id=" + HttpUtility.JavaScriptStringEncode(_prodID) + "\",");
  • @tking:你不需要转义int 值。 (int 不能包含引号、箭头或其他 XSS 有效负载)您应该只在字符串上调用 JavaScriptStringEncode
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    如果您使用的是 .NET 4.0,则可以使用 &lt;%: theText %&gt; 语法输出值。

    【讨论】:

    • 不,他不能。阅读问题。
    【解决方案5】:

    或者,您可以编写 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 文件中。

    【讨论】:

      猜你喜欢
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多