2011-10-18 32 views
0

我遇到了一些代碼,其中原始程序員在頁面中使用<%# ... %>,因爲它不涉及數據綁定。它被用來輸出一個字符串到頁面。這安全嗎? <%#在這種情況下的行爲類似<%=還是<%:以非數據綁定方式安全使用<%#

+1

你確定Page.DataBind沒有被調用嗎? –

+1

對。如果DataBind沒有被調用,則不會輸出任何內容。 –

+0

我使用的技術與使用嵌套母版頁時將動態鏈接網址置於內容佔位符中時所描述的相似。如果在包含嵌套佔位符的佔位符中有動態代碼('<%='),ASP.NET會發出抱怨。通過用'<%#Page.ResolveUrl ...'替換它,你可以在後面的代碼中調用Page.DataBind來支持這兩種情況...不是一個好的解決方案,但它確實有效。 –

回答

1

是否<%#的行爲很像0​​%=在這種情況下或<%:?

只有標籤內部的代碼顯式調用Response.Write()或類似的。

1

對<%#...%>之間的表達式進行評估並轉換爲字符串。結果被分配給控件的屬性,或者如果沒有控件,則添加一個DataBoundLiteralControl。它安全嗎?是。當第一次訪問頁面時,ASP .Net會解析它,生成一個新類並將其編譯爲程序集,包括這些塊中的代碼。


之間是什麼<%= ...%>,作用於同前,但結果是不分配給任何屬性,它是由HtmlTextWriter.Write方法中使用,其中,順便說一句,返回無效,所以它不會工作,如果你嘗試在數據綁定表達式中使用它。


怎麼樣的:

這可以在兩個構建體中,:爲安全加分,因爲評估的字符串是通過HTML編碼System.Web.HttpUtility.HtmlEncode。 因此,您可以使用它與數據綁定構造<%#或使用作家構造<%:(無=)。


提示
寫的東西在這將給編譯錯誤,請點擊查看完整的編譯源代碼,並導航到該行的結構。黑盒子不再是黑盒子了。

相關問題