2011-02-16 24 views
9

Sonunda bir xml düğümüne kaydedilen bir TextBox'um var. Xml kaydetmeden önce geçersiz karakterlerden çıkmak için SecurityElement.Escape (string2Escape) kullanıyorum.SecurityElement.IsValidText, "&" ... tarihinde true değerini döndürüyor

Sorun: Çıkış yöntemini çalıştırmam gerekip gerekmediğini test etmek için IsValidText'i kullanmayı denedim, ancak geçerli olarak '' 've' & 'döndürüyor, ancak sistem çubuklarını xml olarak kaydettiğinizde bunlar aslında , geçerli değil. Sadece '<' veya '>' üzerinde false döndürüyor gibi görünüyor.

Basit bir çözüm, kontrolü kaldırın, ancak sorum şu, bu neden böyle olur?

private string EscapeXML(string nodeText) 
{ 
    if (!SecurityElement.IsValidText(nodeText)) 
    { 
     return SecurityElement.Escape(nodeText); 
    } 
    return nodeText; 
} 

cevap

2

SecurityElement yapıcısı, halihazırda kendi başına ("&" karakteri de dahil olmak üzere) bazı çıkışları yapmakta olduğundan, IsValidText yalnızca kurucunun halihazırda ilgilenmediği karakterleri denetliyor gibi görünüyor. Sonuç olarak, tüm xml'yi oluşturmak için SecurityElement öğesini kullanmıyorsanız SecurityElement'in IsValidText/Escape combo'unu kullanmak güvenli görünmüyor.

Ben bir örnekle daha iyi anlatmaya çalışacağım

:

using System; 
using System.Diagnostics; 
using System.Security; 

class MainClass 
{ 
    public static void Main (string[] args) 
    { 
     // the SecurityElement constructor escapes the & all by itself 
     var xmlRoot = 
      new SecurityElement("test","test &"); 

     // the & is escaped without SecurityElement.Escape 
     Console.WriteLine (xmlRoot.ToString()); 

     // this would throw an exception (the SecurityElement constructor 
     // apparently can't escape <or>'s 
     // var xmlRoot2 = 
     // new SecurityElement("test",@"test & > """); 

     // so this text needs to be escaped before construction 
     var xmlRoot3 = 
      new SecurityElement("test",EscapeXML(@"test & > """)); 
     Console.WriteLine (xmlRoot3.ToString()); 

    } 

    private static string EscapeXML(string nodeText) 
    { 
     return (SecurityElement.IsValidText(nodeText))? 
      nodeText : 
      SecurityElement.Escape(nodeText); 
    } 
} 
5

İşte Reflektör gelen ne var oluyor:

benim başarısız kod aşağıdadır. o davranıyor şekilde davranıyor neden enter image description here enter image description here

Bu açıklayabilir. SecurityElement'te aradığınız şeyi yapan herhangi bir yöntem görmüyorum, ancak bir uzantı yöntemi olarak belki de tek tek uygulamak yeterli.

İlgili konular