2016-04-12 51 views
0

我有一個輸入控制如何在.Net中的HtmlInputText控件中編碼特殊字符?

<input id="firstNameField" type="text" runat="server" /> 

,我給它一個值服務器端

firstNameField.Value = "Me!" 

如何編碼「!」字符輸出?我嘗試這樣做:

firstNameField.Value = "Me&#33;" 

但是.NET中使用此迴應:

<input name="firstNameField" type="text" id="firstNameField" value="Me&amp;#33;" /> 

導致用戶看到Me&#33;在文本框中。我知道這是.Net的內置XSS保護的一部分。如何讓.Net編碼非&符號以外的特殊字符?

+0

使用「我!」有沒有問題? – ConnorsFan

+0

我用「我!」舉個例子。問題是'!'和其他特殊字符。我們使用Cenzic的Hailstorm來掃描我們的網站以查找安全漏洞。最新版本的Hailstorm將輸入字段中未編碼的「!」字符(其中包括其他字符)視爲XSS漏洞,因此它將我的網站評爲比實際更不安全。事實上,我認爲這不是一個有效的漏洞,但是誰知道呢?給黑客最小的裂縫,他們會通過它開一輛麥克卡車。 – Aaron

+0

如果您還沒有使用它,可以通過以下鏈接指向ASP.NET AntiXSS庫:https://msdn.microsoft.com/en-us/security/aa973814.aspx?它可以幫助你解決這些問題,並防止Mack卡車撞上你的服務器。 – ConnorsFan

回答

0

在代碼中值我結束了擴展HttpEncoder類,像這樣:

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Data; 
using System.Diagnostics; 
using System.Web; 
using System.Web.Util; 
using System.Text; 
using System.IO; 

/// <summary> 
/// Summary description for CustomHttpEncoder 
/// </summary> 
public class CustomHttpEncoder : HttpEncoder 
{ 
    // 
    // TODO: Add constructor logic here 
    // 
    public CustomHttpEncoder() 
    { 
    } 

    protected override void HtmlEncode(string value, TextWriter output) 
    { 
     if (value != null) { 
      MyHtmlEncode(value, output); 
     } 
    } 

    protected override void HtmlAttributeEncode(string value, TextWriter output) 
    { 
     if (value != null) { 
      MyHtmlEncode(value, output); 
     } 
    } 

    private void MyHtmlEncode(string value, TextWriter output) 
    { 
     if (value != null) { 
      string encodedValue = ""; 

      for (int i = 0; i <= value.Length - 1; i++) { 
       byte[] asciiVal = Encoding.ASCII.GetBytes(value.Substring(i, 1)); 
       encodedValue += "&#" + asciiVal(0).ToString + ";"; 
      } 

      output.Write(encodedValue); 
     } 
    } 

} 

然後在Web.config中引用它:

<system.web> 
    <httpRuntime encoderType="CustomHttpEncoder" /> 

之後,所有我需要做的就是設置的值正常人一樣:

firstNameField.Value = "Me!" 

自動編碼每個字符的最大錫箔帽子安全:

<input name="firstNameField" type="text" id="firstNameField" value="&#77;&#101;&#33;" /> 

這適合我的目的不夠好,但我可以看到它在其他情況下是一個PITA。在這種情況下,需要修改MyHtmlEncode()以適應這種情況。

0

使用HttpUtility.HtmlEncode(「文本」),而分配背後

+0

不幸的是,這並不奏效。 HtmlEncode函數只編碼這些字符'< >''&'它不編碼感嘆號。 – Aaron