首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

URL Rewrite 重探(三):Control Adapter 解決 PostBack 動作網址暴露問題

     編輯:關於ASP.NET

URL Rewrite 後,<form action> 會變成重寫後的內部路徑(如 /User.aspx?name=jeffz),導致 PostBack 時瀏覽器網址列暴露內部結構,且可能因路徑不存在而失效。

簡易但不完美的 JS 修補

<script>document.forms[0].action = window.location;</script>

缺點:原始碼可見、Fiddler 可攔截、不夠優雅。

根治方案:Control Adapter 覆寫 Form 輸出

建立 FormRewriterControlAdapter,攔截 action 屬性輸出,強制改為 Request.RawUrl(客戶端原始請求網址)。

public class FormRewriterControlAdapter : ControlAdapter {
    protected override void Render(HtmlTextWriter writer) {
        base.Render(new RewriteFormHtmlTextWriter(writer));
    }
}
public class RewriteFormHtmlTextWriter : HtmlTextWriter {
    public RewriteFormHtmlTextWriter(HtmlTextWriter w) : base(w) { InnerWriter = w.InnerWriter; }
    public RewriteFormHtmlTextWriter(TextWriter w) : base(w) { InnerWriter = w; }
    public override void WriteAttribute(string name, string value, bool fEncode) {
        if (name == "action") {
            var ctx = HttpContext.Current;
            if (ctx.Items["ActionAlreadyWritten"] == null) {
                value = ctx.Request.RawUrl;
                ctx.Items["ActionAlreadyWritten"] = true;
            }
        }
        base.WriteAttribute(name, value, fEncode);
    }
}

啟用方式

在 App_Browsers 目錄新增 .browser 檔:

<browsers>
  <browser refID="Default">
    <controlAdapters>
      <adapter controlType="System.Web.UI.HtmlControls.HtmlForm"
               adapterType="Namespace.FormRewriterControlAdapter" />
    </controlAdapters>
  </browser>
</browsers>

此法在伺服器端徹底修正 action,客戶端完全不可見內部重寫路徑,安全且優雅。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved