2017-02-15 19 views
0

[已解決] - 請參閱下面 這是一個典型問題的扭曲:'如何獲取用戶控件的HTML?' 我知道如何做到這一點,而且我一直這樣做了很多年,但最近我變得更加了解網絡安全方面的知識,並且我注意到我的字符串(又名Control HTML)正在作爲普通HTML返回到客戶端,並且它沒有編碼\逃過一劫。我知道一旦它使用javascript到達瀏覽器就可以逃脫它,但如果它來自已經逃脫的服務器,它會更安全。ASP.Net - 返回用戶控制HTML 文本作爲轉義

目前我得到的東西回客戶端,如:

returnText = "<input id='myButton' text='whatever'>" 

我所尋找的是:

returnText = "&lt;input%20id='myButton'%20text='whatever'&gt;" 

(或類似的東西)

的代碼我使用對於這些類型的呼叫非常典型。我ASCX響應編碼爲:

StringBuilder myStringBuilder = new StringBuilder(); 
TextWriter myTextWriter = new StringWriter(myStringBuilder); 
HtmlTextWriter myWriter = new HtmlTextWriter(myTextWriter); 
viewControl.RenderControl(myWriter); 
strControl = myTextWriter.ToString(); 

而且我使用XMLHttpRequest對象調用服務器上我的控制:

function callServer(strPage,qryParms) { 
if (xmlHttp != null) { xmlHttp.abort(); } 
xmlHttp = null; 
var retValue = ""; 
xmlHttp = CreateHttpRequest(); 
if (xmlHttp == null) { 
    alert("Your browser does not support Ajax HTTP Requests"); 
    return; 
} 
else { 
    xmlHttp.open("POST", strPage, false); 
    xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    xmlHttp.onreadystatechange = function() 
     if (xmlHttp.readyState == 4 && xmlHttp.status == 200) { 
      retValue = xmlHttp.responseText; 
     } 
    } 
    xmlHttp.send(qryParms); 
} 
// retValue = htmlEncode(retValue); <--- this is where I could convert it. 
return retValue; 
} 

我可以以某種方式攔截Response對象在渲染過程中逃脫串在它回到瀏覽器之前?

謝謝!

+0

的可能的複製[的HTMLEncode HTMLdecode(http://stackoverflow.com/questions/2650059/htmlencode-htmldecode) – VDWWD

+0

搜索'的HTMLEncode/HTMLdecode' – VDWWD

回答

0

謝謝@VDWWD。 Server.HTMLencode的幫助,但我的答案是將控件的HTML提取移入渲染事件,然後編碼它,然後在渲染過程中寫出它。所以在控件的代碼如下所示:

protected override void Render(HtmlTextWriter writer) 
{ 
    TextWriter tw = new StringWriter(); 
    HtmlTextWriter htw = new HtmlTextWriter(tw); 
    base.Render(htw); 
    string pageSource = tw.ToString(); 
    //--- this is where I encode\escape the returning HTML ---- 
    pageSource = Server.HtmlEncode(pageSource); 
    writer.Write(pageSource); 
}