2010-06-24 14 views
6

我想顯示一個錯誤的網頁使用JavaScript警告彈出窗口的用戶,我目前有以下代碼清理錯誤字符串:我怎樣才能確保一個字符串是乾淨的插入到javascript警報('錯誤信息')

errorMessage.Replace("'", "\'") 

但這是不夠的,因爲一些非法的字符不被刪除,是否有一個靜態方法在某處,將格式化我的字符串清潔插入到HTML框架?

更新我的第一個問題稍微含糊不清。 該字符串需要在警報中有效('這是一些'不會彈出的'非法文本'); 我會嘗試Server.HtmlEncode,希望它會做到這一點。

回答

0

逃避清潔插入一個字符串轉換爲HTML,您可以使用HttpUtility.HtmlEncode方法。我不確定這是否可以幫助您使用JavaScript。

http://msdn.microsoft.com/en-us/library/73z22y6h.aspx

+1

這是關於JavaScript的,而不是HTML ... – Lucero 2010-06-24 09:28:18

+0

我引用「將格式化我的字符串清潔插入到HTML」 – Hinek 2010-06-25 19:49:49

7

如果你看一下在Web Protection Library中AntiXSS模塊,你會發現它已經只是這樣的事情一個JavaScriptEncode(string)方法。

+0

+1指向正確的方向! – Lucero 2010-06-24 13:25:05

0

如果您使用的是ASP.NET 4,則可以使用新的<%:%>語法對HtmlEncode生成的字符串進行編碼,並將其替換爲AntiXSS或其他任何您喜歡的庫。菲爾哈克解釋如何做到這一點的Using AntiXss as the default encoder for ASP.NET

這種方式,你可以寫一個這樣的警告:

alert('<%: this.ErrorMessage %>'); 

在以前的版本中,你可以使用建議別人,無論是的HTMLEncode或AntiXss這樣的:

alert('<%= HttpUtility.HtmlEncode(this.ErrorMessage) %>'); 

alert('<%= AntiXss.HtmlEncode(this.ErrorMessage) %>'); 
0

HttpUtility.HtmlEncode不會編碼單引號('),並且不適合編碼要用作警報消息的字符串。我個人是這樣做的:

public static string EscapeAlertMessage(string value) 
{ 
    value = value.Replace("\\", "\\\\"); 
    value = value.Replace("'", "\\'"); 
    value = value.Replace("\"", "\\\""); 
    return value; 
} 

如果你的消息包含多行,你可以用「\ n」來代替它們。若線由Environment.NewLine分離:

value = value.Replace(Environment.NewLine, "\\n"); 

或者,如果你不知道該分離器是什麼(\ r \ n,只有\ n或\ r)的,你可以使用:

value = value.Replace("\r", "\\r"); 
value = value.Replace("\n", "\\n"); 
+0

這在ASP.NET 4.0中得到了修復。 HtmlEncode現在替換爲'' – 2010-06-24 12:29:35

+0

'HtmlEncode'對用於HTML的字符串進行編碼。要在JavaScript字符串文字中使用字符串,您必須將其編碼爲JavaScript字符串文字,而不是HTML。 – 2010-06-24 13:58:50

0

感謝您的幫助,但沒有任何答案給了我完整的解決方案。

Joe的答案是最接近的,但它沒有考慮\ r \ n新行。我無法找到一種方法來將c#換行符轉換爲一個javascript equivalient。

public static string EscapeAlertMessage(string value) 
{ 
    value = value.Replace("\\", "\\\\"); 
    value = value.Replace("'", "\\'"); 
    value = value.Replace("\"", "\\\""); 
    value = value.Replace(Environment.NewLine, "--"); 

    return value; 
} 
+0

JavaScript的換行符只是'\ n' – 2010-06-24 12:15:56

+0

這將是Replace(Environment.NewLine,「\\ n」); – Joe 2010-06-24 12:26:29

+1

一個字符串可以包含任何類型的換行符(\ n,\ r或\ r \ n)......它不應該是一個正則表達式,它將\ r和or \ n替換爲一個\\ n? – Hinek 2010-06-25 20:00:38

3

有一個簡單的解決方案...使用DataContractJsonSerializer和「序列化」字符串值。通過將字符串序列化爲JSON,您可以通過定義確保它在alert語句中很好地工作。

0

我在我的項目中使用以下函數。它escpaes所有可能的字符爲Javascript:

/// <summary> 
    /// Encodes a string to be represented as a string literal. The format 
    /// is essentially a JSON string. 
    /// 
    /// Example Output: Hello \"Rick\"!\r\nRock on 
    /// </summary> 
    /// <param name="s"></param> 
    /// <returns></returns> 
    public static string EncodeJsString(string s) 
    { 
     StringBuilder sb = new StringBuilder(); 
     foreach (char c in s) 
     { 
      switch (c) 
      { 
       case '\"': 
        sb.Append("\\\""); 
        break; 
       case '\\': 
        sb.Append("\\\\"); 
        break; 
       case '\b': 
        sb.Append("\\b"); 
        break; 
       case '\f': 
        sb.Append("\\f"); 
        break; 
       case '\n': 
        sb.Append("\\n"); 
        break; 
       case '\r': 
        sb.Append("\\r"); 
        break; 
       case '\t': 
        sb.Append("\\t"); 
        break; 
       case '\'': 
        sb.Append("\\'"); 
        break; 
       default: 
        int i = (int)c; 
        if (i < 32 || i > 127) 
        { 
         sb.AppendFormat("\\u{0:X04}", i); 
        } 
        else 
        { 
         sb.Append(c); 
        } 
        break; 
      } 
     } 

     return sb.ToString(); 
    } 
相關問題