簡體   English   中英

ASP.Net URL編碼

[英]ASP.Net URL Encoding

我正在ASP.net中實現URL重寫,我的URL導致我的問題世界。

URL是從部門和類別的數據庫生成的。 我希望員工能夠使用適當的特殊字符向數據庫添加項目,而不會破壞站點。

我在構造URL之前編碼數據。

有幾個問題......

  1. IIS在到達.net之前對URL進行解碼,因此無法正確解析其中包含“/”的任何內容。
  2. ASP.net在某些頁面中使用“〜”無效的網址感到困惑
  3. 我從內置測試服務器遷移到我的本地IIS服務器(XP機器),任何包含編碼&(%26)的URL都會給我一個“錯誤請求”錯誤。
  4. UrlEncode留下一些破碎的字符,如'。'

我確實有兩個關於這個主題的其他相關帖子,當時我只看到小問題不是上游的大問題。 我發現了一些解決“錯誤請求”問題的注冊表技巧,但我將部署到共享托管環境,使其無用。 我也知道這是一個解決某些安全問題的方法,因此我不想在不知道我正在打開哪些蠕蟲的情況下繞過它。

而不是試圖強制.net傳遞原始URL,或覆蓋IIS設置,我想首先制作真正安全的URL。

我會注意到我已經嘗試過AntiXss.URLEncode,HttpUtility.URLEncode,URI.EscapeDataString。 我甚至嘗試過像雙URLEncodng這樣的蠢事。 是否有一個實用程序可以滿足我的需要,或者我真的需要自己動手。 我甚至考慮做一些Hacky,比如用一個不尋常的字符串替換%。 最終結果應至少是可讀的,這首先是使用URL重寫的重點。

很抱歉很長的帖子 - 我只是想確保我已經包含了所有必要的細節。 我似乎無法找到任何相關信息,這似乎是一個常見的問題 - 所以也許我錯過了一些大事。 感謝您的幫助,以及對長篇解釋的耐心!


為清晰起見編輯:

當我說從數據庫構建網址時,我的意思是目錄結構是從我的數據庫中的部門和類別構建的。

一些示例URLS -

的MyStore /制冷/酒吧+ Fridge.aspx
的MyStore /烹飪+ Equipment.aspx
的MyStore /廚房/切割+ Boards.asxpx

當我使用像“Beverage&Bar”或“Pastry / Decorating”這樣的部門來構建我的URL時會出現問題。 盡管首先編碼,但這些都會導致上述問題。

除了特殊的字符編碼問題之外,我的處理程序已經實現並且工作正常。

您應該考慮從您的類別/部門表中選擇一個表,該表具有每個類別的唯一URL。 然后,您可以使用特殊例程來生成URL。 這可以是SQL標量函數或CLR函數,但它要做的一件事就是規范化Web的URL。 您可以將“Beverage&Bar”轉換為“Beverage-And-Bar”和“Pastry / Decorating”轉換為“Pastry-Decorating”。 主要是,例程需要用其他東西替換所有無效的HTTP URL字符。 一個例子是:

public static class URL
{
    static readonly Regex feet = new Regex(@"([0-9]\s?)'([^'])", RegexOptions.Compiled);
    static readonly Regex inch1 = new Regex(@"([0-9]\s?)''", RegexOptions.Compiled);
    static readonly Regex inch2 = new Regex(@"([0-9]\s?)""", RegexOptions.Compiled);
    static readonly Regex num = new Regex(@"#([0-9]+)", RegexOptions.Compiled);
    static readonly Regex dollar = new Regex(@"[$]([0-9]+)", RegexOptions.Compiled);
    static readonly Regex percent = new Regex(@"([0-9]+)%", RegexOptions.Compiled);
    static readonly Regex sep = new Regex(@"[\s_/\\+:.]", RegexOptions.Compiled);
    static readonly Regex empty = new Regex(@"[^-A-Za-z0-9]", RegexOptions.Compiled);
    static readonly Regex extra = new Regex(@"[-]+", RegexOptions.Compiled);

    public static string PrepareURL(string str)
    {
        str = str.Trim().ToLower();
        str = str.Replace("&", "and");

        str = feet.Replace(str, "$1-ft-");
        str = inch1.Replace(str, "$1-in-");
        str = inch2.Replace(str, "$1-in-");
        str = num.Replace(str, "num-$1");

        str = dollar.Replace(str, "$1-dollar-");
        str = percent.Replace(str, "$1-percent-");

        str = sep.Replace(str, "-");

        str = empty.Replace(str, string.Empty);
        str = extra.Replace(str, "-");

        str = str.Trim('-');
        return str;
    }
}

您可以將其設置為SQL增強功能,或將URL生成作為單獨的進程運行。 然后,要實現映射,您可以將整個URL直接映射到類別ID。 從長遠來看,這種方法更好,原因有幾個。 首先,您並不總是生成網址,只需執行此操作一次,它們保持靜態,您不必擔心程序更改,然后GoogleBot無法找到舊網址。 此外,如果發生碰撞,您可能會注意到潛在的重復類別名稱,因為碰撞只會因特殊字符而異。 最后,您始終可以從數據庫中查看URL,而無需運行映射功能。

我有一個url重寫我在開始驗證請求的global.asax文件中實現,因為我有一些安全性。 這是我獲取原始URL然后進行數據庫查找的地方。 然后重寫aspx頁面的路徑,所有參數都通過查詢字符串傳遞。 不需要編碼。

但是,如果您使用url實際更改數據,那么我可以看到,當您有效地使用http GET更改數據庫時,您將遇到大問題。 它通常被認為是一個糟糕的想法,而不是我做的事情。

我只使用post請求進行任何數據庫操作。 這樣可以保持網址清晰,因為所有數據都在頁面中。

我唯一的問題是設置正確的url到page.form.action,在大多數情況下,它是原始網址。

如果它是引起問題的類別名稱,那么您可能應該僅將名稱限制為字母數字字符,並將空格換成“ - ”。 IIS將會出現一段時間“搖搖欲墜”。 因為它尋找文件名。

PS IIS不理解代字號“〜”,這是編譯器理解的東西。 因此,如果您在錨標記中使用它,它將無法按預期工作,您應該使用應用程序根而不是代字號。

編輯:

好吧,看起來IIS的問題與某些字符有問題,例如。 /和&。 即使你做urlencode這些IIS仍然會嘗試實現自己的意義。 因此,考慮刪除它們:

飲料和酒吧成為BeverageBar

糕點/裝飾成為PastryDecorating。

這將使您保持網址清潔,但確實意味着數據庫中有一個額外的列,因此您可以根據此縮短的類別名稱來填充網址。

我有完全相同的問題。 謝謝你寫得這么好。 它實際上幫助我更好地理解了這個問題。

不過我還有其他一些考慮因素。 我的目標之一是支持任何字符在基於文章標題的URL中的可能性。 另外,我想確保編碼的唯一性和雙向編碼/解碼過程。

所以我做了一些手動編碼來解決問題。 這不會完全消除百分比編碼,但會大大減少編碼,並防止用戶生成無法訪問的URL。 我的過程從使用Server.URLEncode函數開始。 但這並沒有消除網址中的問題。 因為IIS正在解碼URL然后將其傳遞給應用程序,所以某些字符會因危險的請求異常而中斷它。 這些字符包括+, &, /, !, *, ., () 所以在那些字符和其他字符上我想使其更具可讀性我會對更有用的網址進行雙重編碼。 編碼也很難,因為網址中允許的字符數量有限。 因此,在編碼之前,我將所有字母設為大寫,然后使用小寫進行編碼。 這使它不能完全解碼,但我可以通過使我希望匹配的值為大寫,輕松地在數據庫或代碼中進行匹配。

好吧,這是我的代碼。 反饋將不勝感激。 哦,是的,這是在VB,但事情應該轉移到C#很容易。

Dim strReturn As String = Trim(strStringToEncode)
strReturn = Server.UrlEncode(strReturn)

strReturn = strReturn.Replace("-", "dash").Replace("+", "-")

strReturn = strReturn.Replace("%26", "and").
                    Replace("%2f", "or").
                    Replace("!", "excl").
                    Replace("*", "star").
                    Replace("%27", "apos").
                    Replace("(", "lprn").
                    Replace(")", "rprn").
                    Replace("%3b", "semi").
                    Replace("%3a", "coln").
                    Replace("%40", "at").
                    Replace("%3d", "eq").
                    Replace("%2b", "plus").
                    Replace("%24", "dols").
                    Replace("%25", "pct").
                    Replace("%2c", "coma").
                    Replace("%3f", "query").
                    Replace("%23", "hash").
                    Replace("%5b", "lbrk").
                    Replace("%5d", "rbrk").
                    Replace(".", "dot").
                    Replace("%3e", "gt").
                    Replace("%3c", "lt")

Return strReturn

我猜你正在尋找HttpUtility.UrlEncodeHttpUtility.HtmlDecode

string url = "http://www.google.com/search?q=" + HttpUtility.UrlEncode("Example");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM